Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753544AbdH2Lr4 (ORCPT ); Tue, 29 Aug 2017 07:47:56 -0400 Received: from mail-pg0-f65.google.com ([74.125.83.65]:33981 "EHLO mail-pg0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753501AbdH2Lr2 (ORCPT ); Tue, 29 Aug 2017 07:47:28 -0400 From: Yang Zhang To: linux-kernel@vger.kernel.org Cc: kvm@vger.kernel.org, wanpeng.li@hotmail.com, mst@redhat.com, pbonzini@redhat.com, tglx@linutronix.de, rkrcmar@redhat.com, dmatlack@google.com, agraf@suse.de, peterz@infradead.org, linux-doc@vger.kernel.org, Yang Zhang , Quan Xu , Ingo Molnar Subject: [RFC PATCH v2 7/7] sched/idle: update poll time when wakeup from idle Date: Tue, 29 Aug 2017 11:46:41 +0000 Message-Id: <1504007201-12904-8-git-send-email-yang.zhang.wz@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1504007201-12904-1-git-send-email-yang.zhang.wz@gmail.com> References: <1504007201-12904-1-git-send-email-yang.zhang.wz@gmail.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2178 Lines: 70 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 Signed-off-by: Quan Xu Cc: Ingo Molnar Cc: Peter Zijlstra Cc: linux-kernel@vger.kernel.org --- 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