]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
cpuidle: governors: teo: Avoid fake intercepts produced by tick
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Wed, 14 Jan 2026 19:44:53 +0000 (20:44 +0100)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Fri, 23 Jan 2026 20:50:38 +0000 (21:50 +0100)
Tick wakeups can lead to fake intercepts that may skew idle state
selection towards shallow states, so it is better to avoid counting
them as intercepts.

For this purpose, add a check causing teo_update() to only count
tick wakeups as intercepts if intercepts within the tick period
range are at least twice as frequent as any other events.

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Reviewed-by: Christian Loehle <christian.loehle@arm.com>
Link: https://patch.msgid.link/3404606.44csPzL39Z@rafael.j.wysocki
drivers/cpuidle/governors/teo.c

index 9820ef36a664969f25f5077bf3008465af67eae4..5434584af040d12a91ab62eb3cb5d7f90de34b3d 100644 (file)
@@ -239,6 +239,17 @@ static void teo_update(struct cpuidle_driver *drv, struct cpuidle_device *dev)
                        cpu_data->state_bins[drv->state_count-1].hits += PULSE;
                        return;
                }
+               /*
+                * If intercepts within the tick period range are not frequent
+                * enough, count this wakeup as a hit, since it is likely that
+                * the tick has woken up the CPU because an expected intercept
+                * was not there.  Otherwise, one of the intercepts may have
+                * been incidentally preceded by the tick wakeup.
+                */
+               if (3 * cpu_data->tick_intercepts < 2 * total) {
+                       cpu_data->state_bins[idx_timer].hits += PULSE;
+                       return;
+               }
        }
 
        /*