From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753427AbbC0ROz (ORCPT ); Fri, 27 Mar 2015 13:14:55 -0400 Received: from mail-pd0-f178.google.com ([209.85.192.178]:36526 "EHLO mail-pd0-f178.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932131AbbC0ROx (ORCPT ); Fri, 27 Mar 2015 13:14:53 -0400 From: Viresh Kumar To: Ingo Molnar , Peter Zijlstra , Thomas Gleixner Cc: linaro-kernel@lists.linaro.org, linux-kernel@vger.kernel.org, Kevin Hilman , Daniel Lezcano , Preeti U Murthy , Frederic Weisbecker , Viresh Kumar Subject: [PATCH 0/3] clockevents: Introduce CLOCK_EVT_STATE_ONESHOT_STOPPED Date: Fri, 27 Mar 2015 22:44:26 +0530 Message-Id: X-Mailer: git-send-email 2.3.0.rc0.44.ga94655d Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Thomas/Ingo/Peter, A clockevent device is used to service timers/hrtimers requests and the next event (when it should fire) is decided by the timer/hrtimer expiring next. When no timers/hrtimers are pending to be serviced, the expiry time is set to a special value: KTIME_MAX. This would normally happen with NO_HZ_{IDLE|FULL} in both LOWRES/HIGHRES modes. When 'expiry == KTIME_MAX', we either cancel the 'tick-sched' hrtimer (NOHZ_MODE_HIGHRES) or skip reprogramming clockevent device (NOHZ_MODE_LOWRES). But, the clockevent device is already reprogrammed from the tick-handler for next tick. As the clock event device is programmed in ONESHOT mode it will at least fire one more time (unnecessarily). Timers on few implementations (like arm_arch_timer, etc.) only support PERIODIC mode and their drivers emulate ONESHOT over that. Which means that on these platforms we will get spurious interrupts periodically (at last programmed interval rate, normally tick rate). In order to avoid spurious interrupts, the clockevent device should be stopped or its interrupts should be masked. A simple (yet hacky) solution to get this fixed could be: update hrtimer_force_reprogram() to always reprogram clockevent device and update clockevent drivers to STOP generating events (or delay it to max time) when 'expires' is set to KTIME_MAX. But the drawback here is that every clockevent driver has to be hacked for this particular case and its very easy for new ones to miss this. However, Thomas suggested to add an optional state ONESHOT_STOPPED to solve this problem: lkml.org/lkml/2014/5/9/508. First patch implements the required infrastructure to start/stop clockevent device. Third patch stops clockevent devices when no longer required and Second patch starts them again as and when required. The review order can be 1,3,2 for better understanding. But patch 2 was required before 3 to keep 'git bisect' happy, otherwise clockevent device might never get restarted after stopping it :) It is also pushed here: git://git.kernel.org/pub/scm/linux/kernel/git/vireshk/linux.git tick/oneshot-stopped Viresh Kumar (3): clockevents: Introduce CLOCK_EVT_STATE_ONESHOT_STOPPED state clockevents: Restart clockevent device before using it again clockevents: Switch state to ONESHOT_STOPPED for unused clockevent devices include/linux/clockchips.h | 7 ++++++- kernel/time/clockevents.c | 18 +++++++++++++++- kernel/time/hrtimer.c | 51 ++++++++++++++++++++++++++++++++++++++++++---- kernel/time/tick-sched.c | 17 +++++++++++++++- kernel/time/timer_list.c | 6 ++++++ 5 files changed, 92 insertions(+), 7 deletions(-) -- 2.3.0.rc0.44.ga94655d