We don't need 'broadcast' to be set to 'zero or one', but to 'zero or non-zero' and so the extra operation to convert it to 'zero or one' can be skipped.
Also change type of 'broadcast' to unsigned int, i.e. type of drv->states[*].flags.
Signed-off-by: Viresh Kumar viresh.kumar@linaro.org --- Rebased over: 3.16-rc2.
kernel/sched/idle.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/kernel/sched/idle.c b/kernel/sched/idle.c index cf009fb..9f1608f 100644 --- a/kernel/sched/idle.c +++ b/kernel/sched/idle.c @@ -79,7 +79,7 @@ static void cpuidle_idle_call(void) struct cpuidle_device *dev = __this_cpu_read(cpuidle_devices); struct cpuidle_driver *drv = cpuidle_get_cpu_driver(dev); int next_state, entered_state; - bool broadcast; + unsigned int broadcast;
/* * Check if the idle task must be rescheduled. If it is the @@ -135,7 +135,7 @@ use_default: goto exit_idle; }
- broadcast = !!(drv->states[next_state].flags & CPUIDLE_FLAG_TIMER_STOP); + broadcast = drv->states[next_state].flags & CPUIDLE_FLAG_TIMER_STOP;
/* * Tell the time framework to switch to a broadcast timer
On Tue, Jun 24, 2014 at 10:01:01AM +0530, Viresh Kumar wrote:
We don't need 'broadcast' to be set to 'zero or one', but to 'zero or non-zero' and so the extra operation to convert it to 'zero or one' can be skipped.
Also change type of 'broadcast' to unsigned int, i.e. type of drv->states[*].flags.
All true; but does it change anything? That is, does your compiler generate better code because of this?
On 24 June 2014 13:33, Peter Zijlstra peterz@infradead.org wrote:
All true; but does it change anything? That is, does your compiler generate better code because of this?
Compilers are smart enough now a days and may not perform !! at all I believe.. And so this patch is more about code clarity ..
I tried comparing results for ARM and got this with/without this patch ..
$ size ../bexynos/kernel/sched/idle.o text data bss dec hex filename 690 30 0 720 2d0 ../bexynos/kernel/sched/idle.o
Don't know if some architectures are using somewhat dumb compilers which might result in better code with this patch :)
On Tue, 2014-06-24 at 10:03 +0200, Peter Zijlstra wrote:
On Tue, Jun 24, 2014 at 10:01:01AM +0530, Viresh Kumar wrote:
We don't need 'broadcast' to be set to 'zero or one', but to 'zero or non-zero' and so the extra operation to convert it to 'zero or one' can be skipped.
Also change type of 'broadcast' to unsigned int, i.e. type of drv->states[*].flags.
All true; but does it change anything? That is, does your compiler generate better code because of this?
x86_64 gcc-4.8.3 made 1 less instruction, a shift.
-Mike
On 24 June 2014 17:48, Mike Galbraith umgwanakikbuti@gmail.com wrote:
x86_64 gcc-4.8.3 made 1 less instruction, a shift.
I thought about doing this test for x86 as well, and over-estimated compilers intelligence. I must have done it :)
And finally this patch is worth more than I originally estimated :)
linaro-kernel@lists.linaro.org