From patchwork Tue Jul 17 18:05:37 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: john stultz X-Patchwork-Id: 10063 Return-Path: X-Original-To: patchwork@peony.canonical.com Delivered-To: patchwork@peony.canonical.com Received: from fiordland.canonical.com (fiordland.canonical.com [91.189.94.145]) by peony.canonical.com (Postfix) with ESMTP id BCB3C23E2F for ; Tue, 17 Jul 2012 18:06:50 +0000 (UTC) Received: from mail-yx0-f180.google.com (mail-yx0-f180.google.com [209.85.213.180]) by fiordland.canonical.com (Postfix) with ESMTP id 62F55A182D0 for ; Tue, 17 Jul 2012 18:06:50 +0000 (UTC) Received: by yenq6 with SMTP id q6so760220yen.11 for ; Tue, 17 Jul 2012 11:06:49 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-forwarded-to:x-forwarded-for:delivered-to:received-spf:from:to:cc :subject:date:message-id:x-mailer:in-reply-to:references :x-content-scanned:x-cbid:x-gm-message-state; bh=LA2Y8gNuHZxqAEBJFlluzbktL5G/caiKjDDvLD1NyKE=; b=eTq3xOZx76KE3jOL1Tuq627scSXPXk+91zBMur5W9Kt2X2biigUeVN5wXhlMIMBujj vGnuwYzAN+BEUs0QTMzTg+Dfhqqy2myJ6A3lA2dYmgwZEQYlG3fscOYXAE9hSj9kmZaM Jd9arfq7ZpGeF9OoHUtTPY3Lc1ay3x0lUqkz4ZP62YUkQw1rnzMkj1JHvpAsNIMx6ADM rlsWoYZv2ek62XRVLcQYI6VskeO5zBEkF0nr4GOj/h0KppCyA4heL1UGjHmVvEhS6zvt KQdllPAxzG9yAWiIjhw915RYyquKpLD2fsmU7fgm62DMroHmrdlarPiMKdkHGBkVQ+FZ TU7w== Received: by 10.50.160.198 with SMTP id xm6mr2291946igb.0.1342548409314; Tue, 17 Jul 2012 11:06:49 -0700 (PDT) X-Forwarded-To: linaro-patchwork@canonical.com X-Forwarded-For: patch@linaro.org linaro-patchwork@canonical.com Delivered-To: patches@linaro.org Received: by 10.231.241.2 with SMTP id lc2csp22934ibb; Tue, 17 Jul 2012 11:06:48 -0700 (PDT) Received: by 10.50.207.40 with SMTP id lt8mr2245608igc.16.1342548408905; Tue, 17 Jul 2012 11:06:48 -0700 (PDT) Received: from e38.co.us.ibm.com (e38.co.us.ibm.com. [32.97.110.159]) by mx.google.com with ESMTPS id fu1si17597356igc.36.2012.07.17.11.06.48 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 17 Jul 2012 11:06:48 -0700 (PDT) Received-SPF: pass (google.com: domain of johnstul@us.ibm.com designates 32.97.110.159 as permitted sender) client-ip=32.97.110.159; Authentication-Results: mx.google.com; spf=pass (google.com: domain of johnstul@us.ibm.com designates 32.97.110.159 as permitted sender) smtp.mail=johnstul@us.ibm.com Received: from /spool/local by e38.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Tue, 17 Jul 2012 12:06:48 -0600 Received: from d03dlp01.boulder.ibm.com (9.17.202.177) by e38.co.us.ibm.com (192.168.1.138) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Tue, 17 Jul 2012 12:06:46 -0600 Received: from d03relay02.boulder.ibm.com (d03relay02.boulder.ibm.com [9.17.195.227]) by d03dlp01.boulder.ibm.com (Postfix) with ESMTP id 2ADEDC40003 for ; Tue, 17 Jul 2012 18:06:42 +0000 (WET) Received: from d03av04.boulder.ibm.com (d03av04.boulder.ibm.com [9.17.195.170]) by d03relay02.boulder.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id q6HI6Acr106786 for ; Tue, 17 Jul 2012 12:06:14 -0600 Received: from d03av04.boulder.ibm.com (loopback [127.0.0.1]) by d03av04.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id q6HI69Jd019471 for ; Tue, 17 Jul 2012 12:06:09 -0600 Received: from kernel.stglabs.ibm.com (kernel.stglabs.ibm.com [9.114.214.19]) by d03av04.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id q6HI60xk018372; Tue, 17 Jul 2012 12:06:07 -0600 From: John Stultz To: stable@vger.kernel.org Cc: John Stultz , Thomas Gleixner , Prarit Bhargava , Linux Kernel Subject: [PATCH 06/11] 2.6.35.x: timekeeping: Fix leapsecond triggered load spike issue Date: Tue, 17 Jul 2012 14:05:37 -0400 Message-Id: <1342548342-19683-7-git-send-email-johnstul@us.ibm.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1342548342-19683-1-git-send-email-johnstul@us.ibm.com> References: <1342548342-19683-1-git-send-email-johnstul@us.ibm.com> X-Content-Scanned: Fidelis XPS MAILER x-cbid: 12071718-5518-0000-0000-0000061B3E96 X-Gm-Message-State: ALoCoQkxvXJwpgnONlwZvm+P3gZPbmDBb7V20zjHgNBYZIsiSxwKi6YliEZbRfB7mSe94U98a7IE This is a backport of 4873fa070ae84a4115f0b3c9dfabc224f1bc7c51 The timekeeping code misses an update of the hrtimer subsystem after a leap second happened. Due to that timers based on CLOCK_REALTIME are either expiring a second early or late depending on whether a leap second has been inserted or deleted until an operation is initiated which causes that update. Unless the update happens by some other means this discrepancy between the timekeeping and the hrtimer data stays forever and timers are expired either early or late. The reported immediate workaround - $ data -s "`date`" - is causing a call to clock_was_set() which updates the hrtimer data structures. See: http://www.sheeri.com/content/mysql-and-leap-second-high-cpu-and-fix Add the missing clock_was_set() call to update_wall_time() in case of a leap second event. The actual update is deferred to softirq context as the necessary smp function call cannot be invoked from hard interrupt context. Signed-off-by: John Stultz Reported-by: Jan Engelhardt Reviewed-by: Ingo Molnar Acked-by: Peter Zijlstra Acked-by: Prarit Bhargava Cc: stable@vger.kernel.org Link: http://lkml.kernel.org/r/1341960205-56738-3-git-send-email-johnstul@us.ibm.com Signed-off-by: Thomas Gleixner Cc: Prarit Bhargava Cc: Thomas Gleixner Cc: Linux Kernel Signed-off-by: John Stultz --- kernel/time/timekeeping.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c index 5fbcb9a..eaf1e09 100644 --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c @@ -760,6 +760,8 @@ static cycle_t logarithmic_accumulation(cycle_t offset, int shift) leap = second_overflow(xtime.tv_sec); xtime.tv_sec += leap; wall_to_monotonic.tv_sec -= leap; + if (leap) + clock_was_set_delayed(); } /* Accumulate raw time */ @@ -870,6 +872,8 @@ void update_wall_time(void) leap = second_overflow(xtime.tv_sec); xtime.tv_sec += leap; wall_to_monotonic.tv_sec -= leap; + if (leap) + clock_was_set_delayed(); } timekeeping_update(false);