• Gautham R. Shenoy's avatar
    cpuidle: powernv: Fix promotion from snooze if next state disabled · 0a4ec6aa
    Gautham R. Shenoy authored
    The commit 78eaa10f ("cpuidle: powernv/pseries: Auto-promotion of
    snooze to deeper idle state") introduced a timeout for the snooze idle
    state so that it could be eventually be promoted to a deeper idle
    state. The snooze timeout value is static and set to the target
    residency of the next idle state, which would train the cpuidle
    governor to pick the next idle state eventually.
    
    The unfortunate side-effect of this is that if the next idle state(s)
    is disabled, the CPU will forever remain in snooze, despite the fact
    that the system is completely idle, and other deeper idle states are
    available.
    
    This patch fixes the issue by dynamically setting the snooze timeout
    to the target residency of the next enabled state on the device.
    
    Before Patch:
      POWER8 : Only nap disabled.
      $ cpupower monitor sleep 30
      sleep took 30.01297 seconds and exited with status 0
                    |Idle_Stats
      PKG |CORE|CPU | snoo | Nap  | Fast
         0|   8|   0| 96.41|  0.00|  0.00
         0|   8|   1| 96.43|  0.00|  0.00
         0|   8|   2| 96.47|  0.00|  0.00
         0|   8|   3| 96.35|  0.00|  0.00
         0|   8|   4| 96.37|  0.00|  0.00
         0|   8|   5| 96.37|  0.00|  0.00
         0|   8|   6| 96.47|  0.00|  0.00
         0|   8|   7| 96.47|  0.00|  0.00
    
      POWER9: Shallow states (stop0lite, stop1lite, stop2lite, stop0, stop1,
      stop2) disabled:
      $ cpupower monitor sleep 30
      sleep took 30.05033 seconds and exited with status 0
                    |Idle_Stats
      PKG |CORE|CPU | snoo | stop | stop | stop | stop | stop | stop | stop | stop
         0|  16|   0| 89.79|  0.00|  0.00|  0.00|  0.00|  0.00|  0.00|  0.00|  0.00
         0|  16|   1| 90.12|  0.00|  0.00|  0.00|  0.00|  0.00|  0.00|  0.00|  0.00
         0|  16|   2| 90.21|  0.00|  0.00|  0.00|  0.00|  0.00|  0.00|  0.00|  0.00
         0|  16|   3| 90.29|  0.00|  0.00|  0.00|  0.00|  0.00|  0.00|  0.00|  0.00
    
    After Patch:
      POWER8 : Only nap disabled.
      $ cpupower monitor sleep 30
      sleep took 30.01200 seconds and exited with status 0
                    |Idle_Stats
      PKG |CORE|CPU | snoo | Nap  | Fast
         0|   8|   0| 16.58|  0.00| 77.21
         0|   8|   1| 18.42|  0.00| 75.38
         0|   8|   2|  4.70|  0.00| 94.09
         0|   8|   3| 17.06|  0.00| 81.73
         0|   8|   4|  3.06|  0.00| 95.73
         0|   8|   5|  7.00|  0.00| 96.80
         0|   8|   6|  1.00|  0.00| 98.79
         0|   8|   7|  5.62|  0.00| 94.17
    
      POWER9: Shallow states (stop0lite, stop1lite, stop2lite, stop0, stop1,
      stop2) disabled:
    
      $ cpupower monitor sleep 30
      sleep took 30.02110 seconds and exited with status 0
                    |Idle_Stats
      PKG |CORE|CPU | snoo | stop | stop | stop | stop | stop | stop | stop | stop
         0|   0|   0|  0.69|  0.00|  0.00|  0.00|  0.00|  0.00|  0.00|  9.39| 89.70
         0|   0|   1|  0.00|  0.00|  0.00|  0.00|  0.00|  0.00|  0.00|  0.05| 93.21
         0|   0|   2|  0.00|  0.00|  0.00|  0.00|  0.00|  0.00|  0.00|  0.00| 89.93
         0|   0|   3|  0.00|  0.00|  0.00|  0.00|  0.00|  0.00|  0.00|  0.00| 93.26
    
    Fixes: 78eaa10f ("cpuidle: powernv/pseries: Auto-promotion of snooze to deeper idle state")
    Cc: stable@vger.kernel.org # v4.2+
    Signed-off-by: default avatarGautham R. Shenoy <ego@linux.vnet.ibm.com>
    Reviewed-by: default avatarBalbir Singh <bsingharora@gmail.com>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    0a4ec6aa
cpuidle-powernv.c 13.6 KB