The commit c1de45ca831a ("sched/idle: Add support for
tasks that inject idle") redesigns the code for idle
loop to support for tasks that inject idle.
it fetches the current CPU using smp_processor_id( )
every time when the idle task runs.

Now idle task is no longer limited to PID == 0,
but the current CPU is constant, so fetch the
smp_prcessor_id( ) out of the loop like the
commit df55f462b905 ("sched/idle: Optimize the
generic idle loop") do.

x86-64:

Before patch (execution in loop):
        864:       0f ae e8                lfence
        867:       65 8b 05 c2 38 f1 7e    mov %gs:0x7ef138c2(%rip),%eax
        86e:       89 c0                   mov %eax,%eax
        870:       48 0f a3 05 68 19 08    bt  %rax,0x1081968(%rip)
        877:       01

After patch (execution in loop):
        872:       0f ae e8                lfence
        875:       4c 0f a3 25 63 19 08    bt  %r12,0x1081963(%rip)
        87c:       01

ARM64:

Before patch (execution in loop):
        c58:       d5033d9f        dsb     ld
        c5c:       d538d080        mrs     x0, tpidr_el1
        c60:       b8606a61        ldr     w1, [x19,x0]
        c64:       1100fc20        add     w0, w1, #0x3f
        c68:       7100003f        cmp     w1, #0x0
        c6c:       1a81b000        csel    w0, w0, w1, lt
        c70:       13067c00        asr     w0, w0, #6
        c74:       93407c00        sxtw    x0, w0
        c78:       f8607a80        ldr     x0, [x20,x0,lsl #3]
        c7c:       9ac12401        lsr     x1, x0, x1
        c80:       36000581        tbz     w1, #0, d30 <do_idle+0x128>

After patch (execution in loop):
        c84:       d5033d9f        dsb     ld
        c88:       f9400260        ldr     x0, [x19]
        c8c:       ea14001f        tst     x0, x20
        c90:       54000580        b.eq    d40 <do_idle+0x138>

Signed-off-by: Cheng Jian <cj.chengj...@huawei.com>
---
 kernel/sched/idle.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/kernel/sched/idle.c b/kernel/sched/idle.c
index 257f4f0..41f16b8 100644
--- a/kernel/sched/idle.c
+++ b/kernel/sched/idle.c
@@ -209,6 +209,7 @@ static void cpuidle_idle_call(void)
  */
 static void do_idle(void)
 {
+       int cpu = smp_processor_id();
        /*
         * If the arch has a polling bit, we maintain an invariant:
         *
@@ -226,7 +227,7 @@ static void do_idle(void)
                check_pgt_cache();
                rmb();
 
-               if (cpu_is_offline(smp_processor_id())) {
+               if (cpu_is_offline(cpu)) {
                        cpuhp_report_idle_dead();
                        arch_cpu_idle_dead();
                }
-- 
1.8.3.1

Reply via email to