Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1161297AbdDUOBU (ORCPT ); Fri, 21 Apr 2017 10:01:20 -0400 Received: from mail-wr0-f196.google.com ([209.85.128.196]:34912 "EHLO mail-wr0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1040275AbdDUOBN (ORCPT ); Fri, 21 Apr 2017 10:01:13 -0400 From: Frederic Weisbecker To: Thomas Gleixner , Ingo Molnar Cc: LKML , Frederic Weisbecker , Peter Zijlstra , Rik van Riel , James Hartsock , stable@vger.kernel.org, Tim Wright , Pavel Machek Subject: [PATCH 2/2] tick: Make sure tick timer is active when bypassing reprogramming Date: Fri, 21 Apr 2017 16:00:55 +0200 Message-Id: <1492783255-5051-3-git-send-email-fweisbec@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1492783255-5051-1-git-send-email-fweisbec@gmail.com> References: <1492783255-5051-1-git-send-email-fweisbec@gmail.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1440 Lines: 41 So far we have run into too much troubles with the optimization path that skips reprogramming the clock on IRQ exit when the expiration deadline hasn't changed. If by accident the cached deadline happens to be out of sync with the hardware deadline, the buggy result and its cause are hard to investigate. So lets detect and warn about the issue early. Acked-by: Rik van Riel Signed-off-by: Frederic Weisbecker Cc: Tim Wright Cc: Pavel Machek Cc: James Hartsock Cc: Peter Zijlstra Cc: Thomas Gleixner Cc: Ingo Molnar --- kernel/time/tick-sched.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c index 502b320..be7ca4d 100644 --- a/kernel/time/tick-sched.c +++ b/kernel/time/tick-sched.c @@ -783,8 +783,13 @@ static ktime_t tick_nohz_stop_sched_tick(struct tick_sched *ts, tick = expires; /* Skip reprogram of event if its not changed */ - if (ts->tick_stopped && (expires == ts->next_tick)) - goto out; + if (ts->tick_stopped && (expires == ts->next_tick)) { + /* Sanity check: make sure clockevent is actually programmed */ + if (likely(dev->next_event <= ts->next_tick)) + goto out; + + WARN_ON_ONCE(1); + } /* * nohz_stop_sched_tick can be called several times before -- 2.7.4