Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932694AbbKMQNM (ORCPT ); Fri, 13 Nov 2015 11:13:12 -0500 Received: from mail-wm0-f49.google.com ([74.125.82.49]:35750 "EHLO mail-wm0-f49.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932498AbbKMQNK (ORCPT ); Fri, 13 Nov 2015 11:13:10 -0500 Date: Fri, 13 Nov 2015 17:13:07 +0100 From: Frederic Weisbecker To: Yunhong Jiang Cc: tglx@linutronix.de, linux-kernel@vger.kernel.org Subject: Re: [PATCH] timer: Lazily wakup nohz CPU when adding new timer. Message-ID: <20151113161305.GC14397@lerouge> References: <1443466096-31252-1-git-send-email-yunhong.jiang@linux.intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1443466096-31252-1-git-send-email-yunhong.jiang@linux.intel.com> User-Agent: Mutt/1.5.24 (2015-08-30) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2814 Lines: 77 On Mon, Sep 28, 2015 at 11:48:16AM -0700, Yunhong Jiang wrote: > Currently, when a new timer added to timer wheel for a nohz_active CPU, > the target CPU will always be waked up. > > In fact, if the new added timer is after the base->next_timer, we don't > need wake up the target CPU since it will not change the sleep time. A > lazy wake up is better in such scenario. > > I cooked a test scenario. On my 32 cores system, a driver on CPU 15 > continuous enqueues timer to CPU 8/9/10/11 with random expire and then > checks the idle_calls difference after 10 seconds. Below data shows > that lazy wake up do reduce the wakeup a lot. > > w/o Lazy w/ lazy > CPU 8: 135 88 > CPU 9: 238 43 > CPU 10: 157 83 > CPU 11: 172 70 > > Signed-off-by: Yunhong Jiang > --- > kernel/time/timer.c | 21 ++++++++++++++------- > 1 file changed, 14 insertions(+), 7 deletions(-) > > diff --git a/kernel/time/timer.c b/kernel/time/timer.c > index d3f5e92f722a..a039d9e6b55a 100644 > --- a/kernel/time/timer.c > +++ b/kernel/time/timer.c > @@ -414,6 +414,8 @@ __internal_add_timer(struct tvec_base *base, struct timer_list *timer) > > static void internal_add_timer(struct tvec_base *base, struct timer_list *timer) > { > + bool kick_nohz = false; > + > /* Advance base->jiffies, if the base is empty */ > if (!base->all_timers++) > base->timer_jiffies = jiffies; > @@ -424,9 +426,17 @@ static void internal_add_timer(struct tvec_base *base, struct timer_list *timer) > */ > if (!(timer->flags & TIMER_DEFERRABLE)) { > if (!base->active_timers++ || > - time_before(timer->expires, base->next_timer)) > + time_before(timer->expires, base->next_timer)) { > base->next_timer = timer->expires; > - } > + /* > + * CPU in dynticks need reevaluate the timer wheel > + * if newer timer added with next_timer updated. > + */ > + if (base->nohz_active) > + kick_nohz = true; > + } > + } else if (base->nohz_active && tick_nohz_full_cpu(base->cpu)) > + kick_nohz = true; > > /* > * Check whether the other CPU is in dynticks mode and needs > @@ -441,11 +451,8 @@ static void internal_add_timer(struct tvec_base *base, struct timer_list *timer) > * require special care against races with idle_cpu(), lets deal > * with that later. > */ > - if (base->nohz_active) { > - if (!(timer->flags & TIMER_DEFERRABLE) || > - tick_nohz_full_cpu(base->cpu)) > - wake_up_nohz_cpu(base->cpu); > - } > + if (kick_nohz) > + wake_up_nohz_cpu(base->cpu); > } This patch makes sense. Thomas? -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/