===================================================================
@@ -5,16 +5,31 @@
*/
#include <linux/cpuidle.h>
+#include <linux/ktime.h>
#include <linux/sched.h>
#include <linux/sched/idle.h>
+#define POLL_IDLE_TIME_CHECK_COUNT 10000
+#define POLL_IDLE_TIME_LIMIT (TICK_NSEC / 16)
+
static int __cpuidle poll_idle(struct cpuidle_device *dev,
struct cpuidle_driver *drv, int index)
{
+ ktime_t start = ktime_get();
+
local_irq_enable();
if (!current_set_polling_and_test()) {
- while (!need_resched())
+ unsigned int time_check_counter = 0;
+
+ while (!need_resched()) {
cpu_relax();
+ if (time_check_counter++ < POLL_IDLE_TIME_CHECK_COUNT)
+ continue;
+
+ time_check_counter = 0;
+ if (ktime_sub(ktime_get(), start) > POLL_IDLE_TIME_LIMIT)
+ break;
+ }
}
current_clr_polling();