From patchwork Tue Jul 3 02:17:49 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Brad Figg X-Patchwork-Id: 168671 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from chlorine.canonical.com (chlorine.canonical.com [91.189.94.204]) by ozlabs.org (Postfix) with ESMTP id 53A462C00C0 for ; Tue, 3 Jul 2012 12:18:07 +1000 (EST) Received: from localhost ([127.0.0.1] helo=chlorine.canonical.com) by chlorine.canonical.com with esmtp (Exim 4.71) (envelope-from ) id 1Slsgb-0005tH-27; Tue, 03 Jul 2012 02:17:53 +0000 Received: from youngberry.canonical.com ([91.189.89.112]) by chlorine.canonical.com with esmtp (Exim 4.71) (envelope-from ) id 1SlsgW-0005qs-JG for kernel-team@lists.ubuntu.com; Tue, 03 Jul 2012 02:17:48 +0000 Received: from static-50-53-107-235.bvtn.or.frontiernet.net ([50.53.107.235] helo=localhost) by youngberry.canonical.com with esmtpsa (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1SlsgW-0001Jc-7b for kernel-team@lists.ubuntu.com; Tue, 03 Jul 2012 02:17:48 +0000 From: Brad Figg To: kernel-team@lists.ubuntu.com Subject: [PATCH 1/2] [LUCID] (pre-upstream) Fix clock_was_set so it is safe to call from atomic Date: Mon, 2 Jul 2012 19:17:49 -0700 Message-Id: <1341281876-28601-2-git-send-email-brad.figg@canonical.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1341281876-28601-1-git-send-email-brad.figg@canonical.com> References: <1341281876-28601-1-git-send-email-brad.figg@canonical.com> X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.13 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: kernel-team-bounces@lists.ubuntu.com Errors-To: kernel-team-bounces@lists.ubuntu.com From: John Stultz BugLink: http://bugs.launchpad.net/bugs/1020285 Backport for 2.6.32.59 NOTE:This is a prerequisite patch that's required to address the widely observed leap-second related futex/hrtimer issues. Currently clock_was_set() is unsafe to be called from atomic context, as it calls on_each_cpu(). This causes problems when we need to adjust the time from update_wall_time(). To fix this, introduce a work_struct so if we're in_atomic, we can schedule work to do the necessary update after we're out of the atomic section. CC: Prarit Bhargava CC: stable@vger.kernel.org CC: Thomas Gleixner Reported-by: Jan Engelhardt Signed-off-by: John Stultz Signed-off-by: Brad Figg --- kernel/hrtimer.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c index a6e9d00..307c4e4 100644 --- a/kernel/hrtimer.c +++ b/kernel/hrtimer.c @@ -647,11 +647,26 @@ static void retrigger_next_event(void *arg) * resolution timer interrupts. On UP we just disable interrupts and * call the high resolution interrupt code. */ -void clock_was_set(void) +static void do_clock_was_set(struct work_struct *work) { /* Retrigger the CPU local events everywhere */ on_each_cpu(retrigger_next_event, NULL, 1); } +static DECLARE_WORK(clock_was_set_work, do_clock_was_set); + +void clock_was_set(void) +{ + /* + * We can't call on_each_cpu() from atomic context, + * so if we're in_atomic, schedule the clock_was_set + * for later. + */ + if (in_atomic()) + schedule_work(&clock_was_set_work); + else + do_clock_was_set(NULL); +} + /* * During resume we might have to reprogram the high resolution timer