From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932161AbdCBJCu (ORCPT ); Thu, 2 Mar 2017 04:02:50 -0500 Received: from mail.sysgo.com ([176.9.12.79]:38538 "EHLO mail.sysgo.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754536AbdCBJCa (ORCPT ); Thu, 2 Mar 2017 04:02:30 -0500 From: David Engraf To: tglx@linutronix.de, john.stultz@linaro.org Cc: linux-kernel@vger.kernel.org, David Engraf Subject: [PATCH resend] timers, sched_clock: Update timeout for clock wrap Date: Thu, 2 Mar 2017 10:02:16 +0100 Message-Id: <20170302090216.10159-1-david.engraf@sysgo.com> X-Mailer: git-send-email 2.9.3 In-Reply-To: <20170217075103.4707-1-david.engraf@sysgo.com> References: <20170217075103.4707-1-david.engraf@sysgo.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The scheduler clock framework may not use the correct timeout for the clock wrap. This happens when a new clock driver calls sched_clock_register() after the kernel called sched_clock_postinit(). In this case the clock wrap timeout is too long thus sched_clock_poll() is called too late and the clock already wrapped. On my ARM system the scheduler was no longer scheduling any other task than the idle task because the sched_clock() wrapped. Signed-off-by: David Engraf --- kernel/time/sched_clock.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/kernel/time/sched_clock.c b/kernel/time/sched_clock.c index a26036d..382b159 100644 --- a/kernel/time/sched_clock.c +++ b/kernel/time/sched_clock.c @@ -205,6 +205,11 @@ sched_clock_register(u64 (*read)(void), int bits, unsigned long rate) update_clock_read_data(&rd); + if (sched_clock_timer.function != NULL) { + /* update timeout for clock wrap */ + hrtimer_start(&sched_clock_timer, cd.wrap_kt, HRTIMER_MODE_REL); + } + r = rate; if (r >= 4000000) { r /= 1000000; -- 2.9.3