• Thomas Gleixner's avatar
    sched: Provide update_curr callbacks for stop/idle scheduling classes · 90e362f4
    Thomas Gleixner authored
    Chris bisected a NULL pointer deference in task_sched_runtime() to
    commit 6e998916 'sched/cputime: Fix clock_nanosleep()/clock_gettime()
    inconsistency'.
    
    Chris observed crashes in atop or other /proc walking programs when he
    started fork bombs on his machine.  He assumed that this is a new exit
    race, but that does not make any sense when looking at that commit.
    
    What's interesting is that, the commit provides update_curr callbacks
    for all scheduling classes except stop_task and idle_task.
    
    While nothing can ever hit that via the clock_nanosleep() and
    clock_gettime() interfaces, which have been the target of the commit in
    question, the author obviously forgot that there are other code paths
    which invoke task_sched_runtime()
    
    do_task_stat(()
     thread_group_cputime_adjusted()
       thread_group_cputime()
         task_cputime()
           task_sched_runtime()
            if (task_current(rq, p) && task_on_rq_queued(p)) {
              update_rq_clock(rq);
              up->sched_class->update_curr(rq);
            }
    
    If the stats are read for a stomp machine task, aka 'migration/N' and
    that task is current on its cpu, this will happily call the NULL pointer
    of stop_task->update_curr.  Ooops.
    
    Chris observation that this happens faster when he runs the fork bomb
    makes sense as the fork bomb will kick migration threads more often so
    the probability to hit the issue will increase.
    
    Add the missing update_curr callbacks to the scheduler classes stop_task
    and idle_task.  While idle tasks cannot be monitored via /proc we have
    other means to hit the idle case.
    
    Fixes: 6e998916 'sched/cputime: Fix clock_nanosleep()/clock_gettime() inconsistency'
    Reported-by: default avatarChris Mason <clm@fb.com>
    Reported-and-tested-by: default avatarBorislav Petkov <bp@alien8.de>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: Stanislaw Gruszka <sgruszka@redhat.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    90e362f4
stop_task.c 2.86 KB