From patchwork Fri Mar 2 07:12:44 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Stultz X-Patchwork-Id: 7057 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 0425623E4A for ; Fri, 2 Mar 2012 07:13:19 +0000 (UTC) Received: from mail-iy0-f180.google.com (mail-iy0-f180.google.com [209.85.210.180]) by fiordland.canonical.com (Postfix) with ESMTP id C086BA18497 for ; Fri, 2 Mar 2012 07:13:18 +0000 (UTC) Received: by mail-iy0-f180.google.com with SMTP id e36so2587473iag.11 for ; Thu, 01 Mar 2012 23:13:18 -0800 (PST) Received: by 10.50.193.131 with SMTP id ho3mr611977igc.55.1330672398580; Thu, 01 Mar 2012 23:13:18 -0800 (PST) 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.53.18 with SMTP id k18csp3352ibg; Thu, 1 Mar 2012 23:13:17 -0800 (PST) Received: by 10.236.78.72 with SMTP id f48mr9289514yhe.121.1330672397164; Thu, 01 Mar 2012 23:13:17 -0800 (PST) Received: from e3.ny.us.ibm.com (e3.ny.us.ibm.com. [32.97.182.143]) by mx.google.com with ESMTPS id d9si5423037yhn.109.2012.03.01.23.13.16 (version=TLSv1/SSLv3 cipher=OTHER); Thu, 01 Mar 2012 23:13:17 -0800 (PST) Received-SPF: pass (google.com: domain of jstultz@us.ibm.com designates 32.97.182.143 as permitted sender) client-ip=32.97.182.143; Authentication-Results: mx.google.com; spf=pass (google.com: domain of jstultz@us.ibm.com designates 32.97.182.143 as permitted sender) smtp.mail=jstultz@us.ibm.com Received: from /spool/local by e3.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 2 Mar 2012 02:13:16 -0500 Received: from d01dlp02.pok.ibm.com (9.56.224.85) by e3.ny.us.ibm.com (192.168.1.103) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Fri, 2 Mar 2012 02:13:03 -0500 Received: from d01relay03.pok.ibm.com (d01relay03.pok.ibm.com [9.56.227.235]) by d01dlp02.pok.ibm.com (Postfix) with ESMTP id 710CC6E804C; Fri, 2 Mar 2012 02:13:02 -0500 (EST) Received: from d01av03.pok.ibm.com (d01av03.pok.ibm.com [9.56.224.217]) by d01relay03.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id q227D2Ox293016; Fri, 2 Mar 2012 02:13:02 -0500 Received: from d01av03.pok.ibm.com (loopback [127.0.0.1]) by d01av03.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id q227D1jY004083; Fri, 2 Mar 2012 04:13:02 -0300 Received: from kernel.beaverton.ibm.com (kernel.beaverton.ibm.com [9.47.67.96]) by d01av03.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id q227D0Yd004040; Fri, 2 Mar 2012 04:13:00 -0300 Received: by kernel.beaverton.ibm.com (Postfix, from userid 1056) id E61A1C03E6; Thu, 1 Mar 2012 23:12:58 -0800 (PST) From: John Stultz To: lkml Cc: John Stultz , Ingo Molnar , Thomas Gleixner , Eric Dumazet , Richard Cochran Subject: [PATCH 5/9] time: Shadow cycle_last in timekeeper structure Date: Thu, 1 Mar 2012 23:12:44 -0800 Message-Id: <1330672368-32290-6-git-send-email-john.stultz@linaro.org> X-Mailer: git-send-email 1.7.3.2.146.gca209 In-Reply-To: <1330672368-32290-1-git-send-email-john.stultz@linaro.org> References: <1330672368-32290-1-git-send-email-john.stultz@linaro.org> X-Content-Scanned: Fidelis XPS MAILER x-cbid: 12030207-8974-0000-0000-000006E1F4C6 X-Gm-Message-State: ALoCoQmsF2rwzxvzzYJQ1l40+4tDk4As1wuCuyUrnV3Dmereya3eGiLzEKtNigGEyuM+1GKPJy2S The clocksource cycle_last value is problematic for working on shadow copies of the timekeeper, because the clocksource is global. Since its mostly used only for timekeeping, move cycle_last into the timekeeper. Unfortunately there are some uses for cycle_last outside of timekeeping (such as tsc_read, which makes sure we haven't skipped to a core that the TSC is behind the last read), so we keep the clocksource cycle_last updated as well. CC: Ingo Molnar CC: Thomas Gleixner CC: Eric Dumazet CC: Richard Cochran Signed-off-by: John Stultz --- kernel/time/timekeeping.c | 23 ++++++++++++++--------- 1 files changed, 14 insertions(+), 9 deletions(-) diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c index 09460c1..ed8cb51 100644 --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c @@ -29,7 +29,8 @@ struct timekeeper { u32 mult; /* The shift value of the current clocksource. */ int shift; - + /* cycle value at last accumulation point */ + cycle_t cycle_last; /* Number of clock cycles in one NTP interval. */ cycle_t cycle_interval; /* Number of clock shifted nano seconds in one NTP interval. */ @@ -142,7 +143,8 @@ static void tk_setup_internals(struct timekeeper *tk, struct clocksource *clock) old_clock = tk->clock; tk->clock = clock; - clock->cycle_last = clock->read(clock); + tk->cycle_last = clock->read(clock); + clock->cycle_last = tk->cycle_last; /* Do the ns -> cycle conversion first, using original mult */ tmp = NTP_INTERVAL_LENGTH; @@ -195,7 +197,7 @@ static inline s64 timekeeping_get_ns(struct timekeeper *tk) cycle_now = clock->read(clock); /* calculate the delta since the last update_wall_time: */ - cycle_delta = (cycle_now - clock->cycle_last) & clock->mask; + cycle_delta = (cycle_now - tk->cycle_last) & clock->mask; nsec = cycle_delta * tk->mult + tk->xtime_nsec; return nsec >> tk->shift; @@ -211,7 +213,7 @@ static inline s64 timekeeping_get_ns_raw(struct timekeeper *tk) cycle_now = clock->read(clock); /* calculate the delta since the last update_wall_time: */ - cycle_delta = (cycle_now - clock->cycle_last) & clock->mask; + cycle_delta = (cycle_now - tk->cycle_last) & clock->mask; /* return delta convert to nanoseconds. */ return clocksource_cyc2ns(cycle_delta, clock->mult, clock->shift); @@ -259,8 +261,9 @@ static void timekeeping_forward_now(struct timekeeper *tk) clock = tk->clock; cycle_now = clock->read(clock); - cycle_delta = (cycle_now - clock->cycle_last) & clock->mask; - clock->cycle_last = cycle_now; + cycle_delta = (cycle_now - tk->cycle_last) & clock->mask; + tk->cycle_last = cycle_now; + tk->clock->cycle_last = cycle_now; tk->xtime_nsec += cycle_delta * tk->mult; @@ -760,7 +763,8 @@ static void timekeeping_resume(void) __timekeeping_inject_sleeptime(&ts); } /* re-base the last cycle value */ - timekeeper.clock->cycle_last = timekeeper.clock->read(timekeeper.clock); + timekeeper.cycle_last = timekeeper.clock->read(timekeeper.clock); + timekeeper.clock->cycle_last = timekeeper.cycle_last; timekeeper.ntp_error = 0; timekeeping_suspended = 0; @@ -1026,7 +1030,7 @@ static cycle_t logarithmic_accumulation(struct timekeeper *tk, cycle_t offset, /* Accumulate one shifted interval */ offset -= tk->cycle_interval << shift; - tk->clock->cycle_last += tk->cycle_interval << shift; + tk->cycle_last += tk->cycle_interval << shift; tk->xtime_nsec += tk->xtime_interval << shift; while (tk->xtime_nsec >= nsecps) { @@ -1079,7 +1083,7 @@ static void update_wall_time(void) #ifdef CONFIG_ARCH_USES_GETTIMEOFFSET offset = shadow_tk.cycle_interval; #else - offset = (clock->read(clock) - clock->cycle_last) & clock->mask; + offset = (clock->read(clock) - shadow_tk.cycle_last) & clock->mask; #endif /* @@ -1153,6 +1157,7 @@ static void update_wall_time(void) timekeeper = shadow_tk; + timekeeper.clock->cycle_last = timekeeper.cycle_last; timekeeping_update(&timekeeper, false); out: