In ttwu_do_wakeup, it will update avg_idle when wakeup from idle. Here we just reuse this logic to update the poll time. It may be a little late to update the poll in ttwu_do_wakeup, but the test result shows no obvious performance gap compare with updating poll in irq handler. one problem is that idle_stamp only used when using CFS scheduler. But it is ok since it is the default policy for scheduler and only consider it should enough. Signed-off-by: Yang Zhang <yang.zhang.wz@xxxxxxxxx> Signed-off-by: Quan Xu <quan.xu0@xxxxxxxxx> Cc: Ingo Molnar <mingo@xxxxxxxxxx> Cc: Peter Zijlstra <peterz@xxxxxxxxxxxxx> Cc: linux-kernel@xxxxxxxxxxxxxxx --- include/linux/sched/idle.h | 4 ++++ kernel/sched/core.c | 4 ++++ kernel/sched/idle.c | 7 +++++++ 3 files changed, 15 insertions(+) diff --git a/include/linux/sched/idle.h b/include/linux/sched/idle.h index 5ca63eb..6e0554d 100644 --- a/include/linux/sched/idle.h +++ b/include/linux/sched/idle.h @@ -12,6 +12,10 @@ enum cpu_idle_type { extern void wake_up_if_idle(int cpu); +#if defined(CONFIG_SMP) && defined(CONFIG_PARAVIRT) +extern void update_poll_duration(unsigned long idle_duration); +#endif + /* * Idle thread specific functions to determine the need_resched * polling state. diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 0869b20..25be9a3 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -1678,6 +1678,10 @@ static void ttwu_do_wakeup(struct rq *rq, struct task_struct *p, int wake_flags, if (rq->avg_idle > max) rq->avg_idle = max; +#if defined(CONFIG_PARAVIRT) + update_poll_duration(rq->avg_idle); +#endif + rq->idle_stamp = 0; } #endif diff --git a/kernel/sched/idle.c b/kernel/sched/idle.c index b374744..7eb8559 100644 --- a/kernel/sched/idle.c +++ b/kernel/sched/idle.c @@ -101,6 +101,13 @@ void __cpuidle default_idle_call(void) } } +#if defined(CONFIG_SMP) && defined(CONFIG_PARAVIRT) +void update_poll_duration(unsigned long idle_duration) +{ + paravirt_idle_update_poll_duration(idle_duration); +} +#endif + static int call_cpuidle(struct cpuidle_driver *drv, struct cpuidle_device *dev, int next_state) { -- 1.8.3.1 -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html