Re: [PATCH 1/8] tick/nohz: Evaluate the CPU expression after the static key
From: Peter Zijlstra
Date: Tue May 04 2021 - 08:31:45 EST
On Thu, Apr 22, 2021 at 02:01:51PM +0200, Frederic Weisbecker wrote:
> From: Peter Zijlstra <peterz@xxxxxxxxxxxxx>
>
> When tick_nohz_full_cpu() is called with smp_processor_id(), the latter
> is unconditionally evaluated whether the static key is on or off. It is
> not necessary in the off-case though, so make sure the cpu expression
> is executed at the last moment.
>
> Illustrate with the following test function:
>
> int tick_nohz_test(void)
> {
> return tick_nohz_full_cpu(smp_processor_id());
> }
>
> The resulting code before was:
>
> mov %gs:0x7eea92d1(%rip),%eax # smp_processor_id() fetch
> nopl 0x0(%rax,%rax,1)
> xor %eax,%eax
> retq
> cmpb $0x0,0x29d393a(%rip) # <tick_nohz_full_running>
> je tick_nohz_test+0x29 # jump to below eax clear
> mov %eax,%eax
> bt %rax,0x29d3936(%rip) # <tick_nohz_full_mask>
> setb %al
> movzbl %al,%eax
> retq
> xor %eax,%eax
> retq
>
> Now it becomes:
>
> nopl 0x0(%rax,%rax,1)
> xor %eax,%eax
> retq
> cmpb $0x0,0x29d3871(%rip) # <tick_nohz_full_running>
> je tick_nohz_test+0x29 # jump to below eax clear
> mov %gs:0x7eea91f0(%rip),%eax # smp_processor_id() fetch, after static key
> mov %eax,%eax
> bt %rax,0x29d3866(%rip) # <tick_nohz_full_mask>
> setb %al
> movzbl %al,%eax
> retq
> xor %eax,%eax
> retq
>
> Not-Yet-Signed-off-by: Peter Zijlstra <peterz@xxxxxxxxxxxxx>
Signed-off-by: Peter Zijlstra <peterz@xxxxxxxxxxxxx>
Thanks for writing the Changelog.