• Heiko Carstens's avatar
    s390/idle: remove arch_cpu_idle_time() and corresponding code · be76ea61
    Heiko Carstens authored
    arch_cpu_idle_time() returns the idle time of any given cpu if it is in
    idle, or zero if not. All if this is racy and partially incorrect. Time
    stamps taken with store clock extended and store clock fast from different
    cpus are compared, while the architecture states that this is nothing which
    can be relied on (see Principles of Operation; Chapter 4, "Setting and
    Inspecting the Clock").
    
    A more fundamental problem is that the timestamp when a cpu is leaving idle
    is taken early in the assembler part of the interrupt handler, and this
    value is only transferred many cycles later to the cpu's per-cpu idle data
    structure.
    
    This per cpu data structure is read by arch_cpu_idle() to tell for which
    period of time a remote cpu is idle: if only an idle_enter value is
    present, the assumed idle time of the cpu is calculated by taking a local
    timestamp and returning the difference of the local timestamp and the
    idle_enter value. This is potentially incorrect, since the remote cpu may
    have already left idle, but the taken timestamp may not have been
    transferred to the per-cpu data structure. This in turn means that too much
    idle time may be reported for a cpu, and a subsequent calculation of system
    idle time may result in a smaller value.
    
    Instead of coming up with even more complex code trying to fix this, just
    remove this code, and only account idle time of a cpu, after idle state is
    left.
    
    Another minor bug is that it is assumed that timestamps are non-zero, which
    is not necessarily the case for timestamps taken with store clock
    fast. This however is just a very minor problem, since this can only happen
    when the epoch increases.
    Reviewed-by: default avatarSven Schnelle <svens@linux.ibm.com>
    Signed-off-by: default avatarHeiko Carstens <hca@linux.ibm.com>
    be76ea61
idle.c 2.53 KB