• Peter Zijlstra's avatar
    sched, net: Fixup busy_loop_us_clock() · 37089834
    Peter Zijlstra authored
    The only valid use of preempt_enable_no_resched() is if the very next
    line is schedule() or if we know preemption cannot actually be enabled
    by that statement due to known more preempt_count 'refs'.
    
    This busy_poll stuff looks to be completely and utterly broken,
    sched_clock() can return utter garbage with interrupts enabled (rare
    but still) and it can drift unbounded between CPUs.
    
    This means that if you get preempted/migrated and your new CPU is
    years behind on the previous CPU we get to busy spin for a _very_ long
    time.
    
    There is a _REASON_ sched_clock() warns about preemptability -
    papering over it with a preempt_disable()/preempt_enable_no_resched()
    is just terminal brain damage on so many levels.
    
    Replace sched_clock() usage with local_clock() which has a bounded
    drift between CPUs (<2 jiffies).
    
    There is a further problem with the entire busy wait poll thing in
    that the spin time is additive to the syscall timeout, not inclusive.
    Reviewed-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Signed-off-by: default avatarPeter Zijlstra <peterz@infradead.org>
    Cc: David S. Miller <davem@davemloft.net>
    Cc: rui.zhang@intel.com
    Cc: jacob.jun.pan@linux.intel.com
    Cc: Mike Galbraith <bitbucket@online.de>
    Cc: hpa@zytor.com
    Cc: Arjan van de Ven <arjan@linux.intel.com>
    Cc: lenb@kernel.org
    Cc: rjw@rjwysocki.net
    Cc: Eliezer Tamir <eliezer.tamir@linux.intel.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Link: http://lkml.kernel.org/r/20131119151338.GF3694@twins.programming.kicks-ass.netSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    37089834
busy_poll.h 3.97 KB