• Heiko Carstens's avatar
    s390/idle: fix cpu idle time calculation · 3d7efa4e
    Heiko Carstens authored
    The idle time reported in /proc/stat sometimes incorrectly contains
    huge values on s390. This is caused by a bug in arch_cpu_idle_time().
    
    The kernel tries to figure out when a different cpu entered idle by
    accessing its per-cpu data structure. There is an ordering problem: if
    the remote cpu has an idle_enter value which is not zero, and an
    idle_exit value which is zero, it is assumed it is idle since
    "now". The "now" timestamp however is taken before the idle_enter
    value is read.
    
    Which in turn means that "now" can be smaller than idle_enter of the
    remote cpu. Unconditionally subtracting idle_enter from "now" can thus
    lead to a negative value (aka large unsigned value).
    
    Fix this by moving the get_tod_clock() invocation out of the
    loop. While at it also make the code a bit more readable.
    
    A similar bug also exists for show_idle_time(). Fix this is as well.
    
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
    Signed-off-by: default avatarVasily Gorbik <gor@linux.ibm.com>
    3d7efa4e
idle.c 3.56 KB