• Peter Zijlstra's avatar
    sched: Fix load avg vs cpu-hotplug · 5d180232
    Peter Zijlstra authored
    Rabik and Paul reported two different issues related to the same few
    lines of code.
    
    Rabik's issue is that the nr_uninterruptible migration code is wrong in
    that he sees artifacts due to this (Rabik please do expand in more
    detail).
    
    Paul's issue is that this code as it stands relies on us using
    stop_machine() for unplug, we all would like to remove this assumption
    so that eventually we can remove this stop_machine() usage altogether.
    
    The only reason we'd have to migrate nr_uninterruptible is so that we
    could use for_each_online_cpu() loops in favour of
    for_each_possible_cpu() loops, however since nr_uninterruptible() is the
    only such loop and its using possible lets not bother at all.
    
    The problem Rabik sees is (probably) caused by the fact that by
    migrating nr_uninterruptible we screw rq->calc_load_active for both rqs
    involved.
    
    So don't bother with fancy migration schemes (meaning we now have to
    keep using for_each_possible_cpu()) and instead fold any nr_active delta
    after we migrate all tasks away to make sure we don't have any skewed
    nr_active accounting.
    
    [ paulmck: Move call to calc_load_migration to CPU_DEAD to avoid
    miscounting noted by Rakib. ]
    Reported-by: default avatarRakib Mullick <rakib.mullick@gmail.com>
    Reported-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
    Signed-off-by: default avatarPeter Zijlstra <a.p.zijlstra@chello.nl>
    Signed-off-by: default avatarPaul E. McKenney <paul.mckenney@linaro.org>
    5d180232
core.c 206 KB