• P
    sched/fair: Limit sched_cfs_period_timer() loop to avoid hard lockup · 2e8e1922
    Phil Auld 提交于
    With extremely short cfs_period_us setting on a parent task group with a large
    number of children the for loop in sched_cfs_period_timer() can run until the
    watchdog fires. There is no guarantee that the call to hrtimer_forward_now()
    will ever return 0.  The large number of children can make
    do_sched_cfs_period_timer() take longer than the period.
    
     NMI watchdog: Watchdog detected hard LOCKUP on cpu 24
     RIP: 0010:tg_nop+0x0/0x10
      <IRQ>
      walk_tg_tree_from+0x29/0xb0
      unthrottle_cfs_rq+0xe0/0x1a0
      distribute_cfs_runtime+0xd3/0xf0
      sched_cfs_period_timer+0xcb/0x160
      ? sched_cfs_slack_timer+0xd0/0xd0
      __hrtimer_run_queues+0xfb/0x270
      hrtimer_interrupt+0x122/0x270
      smp_apic_timer_interrupt+0x6a/0x140
      apic_timer_interrupt+0xf/0x20
      </IRQ>
    
    To prevent this we add protection to the loop that detects when the loop has run
    too many times and scales the period and quota up, proportionally, so that the timer
    can complete before then next period expires.  This preserves the relative runtime
    quota while preventing the hard lockup.
    
    A warning is issued reporting this state and the new values.
    Signed-off-by: NPhil Auld <pauld@redhat.com>
    Signed-off-by: NPeter Zijlstra (Intel) <peterz@infradead.org>
    Cc: <stable@vger.kernel.org>
    Cc: Anton Blanchard <anton@ozlabs.org>
    Cc: Ben Segall <bsegall@google.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Link: https://lkml.kernel.org/r/20190319130005.25492-1-pauld@redhat.comSigned-off-by: NIngo Molnar <mingo@kernel.org>
    2e8e1922
fair.c 284.3 KB