aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/cpuidle/poll_state.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/drivers/cpuidle/poll_state.c b/drivers/cpuidle/poll_state.c
index 7416b16287de..68cdc506524b 100644
--- a/drivers/cpuidle/poll_state.c
+++ b/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();