From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752976AbbDBNha (ORCPT ); Thu, 2 Apr 2015 09:37:30 -0400 Received: from casper.infradead.org ([85.118.1.10]:36333 "EHLO casper.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752187AbbDBNhZ (ORCPT ); Thu, 2 Apr 2015 09:37:25 -0400 Date: Thu, 2 Apr 2015 15:37:15 +0200 From: Peter Zijlstra To: Viresh Kumar Cc: Ingo Molnar , Thomas Gleixner , linaro-kernel@lists.linaro.org, linux-kernel@vger.kernel.org, Kevin Hilman , Daniel Lezcano , Preeti U Murthy , Frederic Weisbecker Subject: Re: [PATCH 3/3] clockevents: Switch state to ONESHOT_STOPPED for unused clockevent devices Message-ID: <20150402133715.GZ23123@twins.programming.kicks-ass.net> References: <98b55223ab29cd5fb9b1f4a384cb7edd86578ea5.1427475606.git.viresh.kumar@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <98b55223ab29cd5fb9b1f4a384cb7edd86578ea5.1427475606.git.viresh.kumar@linaro.org> User-Agent: Mutt/1.5.21 (2012-12-30) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, Mar 27, 2015 at 10:44:29PM +0530, Viresh Kumar wrote: > kernel/time/hrtimer.c | 46 ++++++++++++++++++++++++++++++++++++++++++---- > kernel/time/tick-sched.c | 3 +++ > 2 files changed, 45 insertions(+), 4 deletions(-) > > diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c > index 045ba7e2be6c..89d4b593dfc0 100644 > --- a/kernel/time/hrtimer.c > +++ b/kernel/time/hrtimer.c > @@ -543,8 +543,19 @@ hrtimer_force_reprogram(struct hrtimer_cpu_base *cpu_base, int skip_equal) > if (cpu_base->hang_detected) > return; > > - if (cpu_base->expires_next.tv64 != KTIME_MAX) > + if (cpu_base->expires_next.tv64 != KTIME_MAX) { > tick_program_event(cpu_base->expires_next, 1); > + } else { > + struct clock_event_device *dev = > + __this_cpu_read(tick_cpu_device.evtdev); > + clockevents_set_state(dev, CLOCK_EVT_STATE_ONESHOT_STOPPED); > + } > } > > /* > @@ -1312,9 +1323,36 @@ void hrtimer_interrupt(struct clock_event_device *dev) > cpu_base->in_hrtirq = 0; > raw_spin_unlock(&cpu_base->lock); > > - /* Reprogramming necessary ? */ > - if (expires_next.tv64 == KTIME_MAX || > - !tick_program_event(expires_next, 0)) { > + if (expires_next.tv64 == KTIME_MAX) { > + struct clock_event_device *dev = > + __this_cpu_read(tick_cpu_device.evtdev); > + > + cpu_base->hang_detected = 0; > + > + clockevents_set_state(dev, CLOCK_EVT_STATE_ONESHOT_STOPPED); > + return; > + } > + > + if (!tick_program_event(expires_next, 0)) { > cpu_base->hang_detected = 0; > return; > } > diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c > index 47c04edd07df..ff271a26fa4d 100644 > --- a/kernel/time/tick-sched.c > +++ b/kernel/time/tick-sched.c > @@ -685,6 +685,9 @@ static ktime_t tick_nohz_stop_sched_tick(struct tick_sched *ts, > if (unlikely(expires.tv64 == KTIME_MAX)) { > if (ts->nohz_mode == NOHZ_MODE_HIGHRES) > hrtimer_cancel(&ts->sched_timer); > + else > + clockevents_set_state(dev, CLOCK_EVT_STATE_ONESHOT_STOPPED); > goto out; > } Should we teach tick_program_event() about KTIME_MAX instead of adding it to its callers?