sched/fair: Optimize __update_load_avg()
authorPeter Zijlstra <peterz@infradead.org>
Mon, 7 Sep 2015 13:09:15 +0000 (15:09 +0200)
committerIngo Molnar <mingo@kernel.org>
Sun, 13 Sep 2015 07:53:00 +0000 (09:53 +0200)
Prior to this patch; the line:

scaled_delta_w = (delta_w * 1024) >> 10;

which is the result of the default arch_scale_freq_capacity()
function, turns into:

    1b03: 49 89 d1              mov    %rdx,%r9
    1b06: 49 c1 e1 0a           shl    $0xa,%r9
    1b0a: 49 c1 e9 0a           shr    $0xa,%r9

Which is silly; when made unsigned int, GCC recognises this as
pointless ops and fails to emit them (confirmed on 4.9.3 and 5.1.1).

Furthermore, afaict unsigned is actually the correct type for these
fields anyway, as we've explicitly ruled out negative delta's earlier
in this function.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
kernel/sched/fair.c

index 7109047731eb566b528ea6c348bcd04d1023d468..c3c5585292a67cc2cacfed1f39547605617cbb6c 100644 (file)
@@ -2551,7 +2551,7 @@ __update_load_avg(u64 now, int cpu, struct sched_avg *sa,
 {
        u64 delta, scaled_delta, periods;
        u32 contrib;
-       int delta_w, scaled_delta_w, decayed = 0;
+       unsigned int delta_w, scaled_delta_w, decayed = 0;
        unsigned long scale_freq = arch_scale_freq_capacity(NULL, cpu);
        unsigned long scale_cpu = arch_scale_cpu_capacity(NULL, cpu);