Message ID | 3111105.SmgpqUHPkp@aspire.rjw.lan (mailing list archive) |
---|---|
State | Mainlined |
Delegated to: | Rafael Wysocki |
Headers | show |
On Wed, 2018-03-14 at 15:08 +0100, Rafael J. Wysocki wrote: > From: Rafael J. Wysocki <rafael.j.wysocki@intel.com> > > If poll_idle() is allowed to spin until need_resched() returns > 'true', > it may actually spin for a much longer time than expected by the idle > governor, since set_tsk_need_resched() is not always called by the > timer interrupt handler. If that happens, the CPU may spend much > more time than anticipated in the "polling" state. > > To prevent that from happening, limit the time of the spinning loop > in poll_idle(). > > Suggested-by: Peter Zijlstra <peterz@infradead.org> > Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> So ... about bisecting that other patch series... It turned out I had this patch, which looks so obviously correct, as patch #1 in my series. It also turned out that this patch is responsible for the entire 5-10% increase in CPU use for the memcache style workload. I wonder if keeping an idle HT thread much busier than before slows down its sibling, or something like that. Let me go test the nohz idle series by itself, without this patch.
Index: linux-pm/drivers/cpuidle/poll_state.c =================================================================== --- linux-pm.orig/drivers/cpuidle/poll_state.c +++ linux-pm/drivers/cpuidle/poll_state.c @@ -6,15 +6,24 @@ #include <linux/cpuidle.h> #include <linux/sched.h> +#include <linux/sched/clock.h> #include <linux/sched/idle.h> +#define POLL_IDLE_TIME_LIMIT (TICK_NSEC / 16) + static int __cpuidle poll_idle(struct cpuidle_device *dev, struct cpuidle_driver *drv, int index) { + u64 time_start = local_clock(); + local_irq_enable(); if (!current_set_polling_and_test()) { - while (!need_resched()) + while (!need_resched()) { cpu_relax(); + + if (local_clock() - time_start > POLL_IDLE_TIME_LIMIT) + break; + } } current_clr_polling();