Login
[x]
Log in using an account from:
Fedora Account System
Red Hat Associate
Red Hat Customer
Or login using a Red Hat Bugzilla account
Forgot Password
Login:
Hide Forgot
Create an Account
Red Hat Bugzilla – Attachment 603554 Details for
Bug 836803
RHEL6: Potential fix for leapsecond caused futex related load spikes
[?]
New
Simple Search
Advanced Search
My Links
Browse
Requests
Reports
Current State
Search
Tabular reports
Graphical reports
Duplicates
Other Reports
User Changes
Plotly Reports
Bug Status
Bug Severity
Non-Defaults
|
Product Dashboard
Help
Page Help!
Bug Writing Guidelines
What's new
Browser Support Policy
5.0.4.rh83 Release notes
FAQ
Guides index
User guide
Web Services
Contact
Legal
This site requires JavaScript to be enabled to function correctly, please enable it.
[patch]
RHEL PATCH 6/7
0006-hrtimer-Update-hrtimer-base-offsets-each-hrtimer_int.patch (text/plain), 4.49 KB, created by
Prarit Bhargava
on 2012-08-10 13:57:10 UTC
(
hide
)
Description:
RHEL PATCH 6/7
Filename:
MIME Type:
Creator:
Prarit Bhargava
Created:
2012-08-10 13:57:10 UTC
Size:
4.49 KB
patch
obsolete
>From 0f44cea53697556b098a9c530dbbcde20b97d0f8 Mon Sep 17 00:00:00 2001 >From: Prarit Bhargava <prarit@redhat.com> >Date: Tue, 24 Jul 2012 10:27:19 -0400 >Subject: hrtimer: Update hrtimer base offsets each hrtimer_interrupt > >commit 5baefd6d84163443215f4a99f6a20f054ef11236 >Author: John Stultz <johnstul@us.ibm.com> >Date: Tue Jul 10 18:43:25 2012 -0400 > > hrtimer: Update hrtimer base offsets each hrtimer_interrupt > > The update of the hrtimer base offsets on all cpus cannot be made > atomically from the timekeeper.lock held and interrupt disabled region > as smp function calls are not allowed there. > > clock_was_set(), which enforces the update on all cpus, is called > either from preemptible process context in case of do_settimeofday() > or from the softirq context when the offset modification happened in > the timer interrupt itself due to a leap second. > > In both cases there is a race window for an hrtimer interrupt between > dropping timekeeper lock, enabling interrupts and clock_was_set() > issuing the updates. Any interrupt which arrives in that window will > see the new time but operate on stale offsets. > > So we need to make sure that an hrtimer interrupt always sees a > consistent state of time and offsets. > > ktime_get_update_offsets() allows us to get the current monotonic time > and update the per cpu hrtimer base offsets from hrtimer_interrupt() > to capture a consistent state of monotonic time and the offsets. The > function replaces the existing ktime_get() calls in hrtimer_interrupt(). > > The overhead of the new function vs. ktime_get() is minimal as it just > adds two store operations. > > This ensures that any changes to realtime or boottime offsets are > noticed and stored into the per-cpu hrtimer base structures, prior to > any hrtimer expiration and guarantees that timers are not expired early. > > Signed-off-by: John Stultz <johnstul@us.ibm.com> > Reviewed-by: Ingo Molnar <mingo@kernel.org> > Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl> > Acked-by: Prarit Bhargava <prarit@redhat.com> > Cc: stable@vger.kernel.org > Link: http://lkml.kernel.org/r/1341960205-56738-8-git-send-email-johnstul@us.ibm.com > Signed-off-by: Thomas Gleixner <tglx@linutronix.de> >--- > kernel/hrtimer.c | 27 +++++++++++++-------------- > 1 file changed, 13 insertions(+), 14 deletions(-) > >diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c >index 87bb8a5..56ebe16 100644 >--- a/kernel/hrtimer.c >+++ b/kernel/hrtimer.c >@@ -662,13 +662,19 @@ static int hrtimer_switch_to_hres(void) > base->clock_base[CLOCK_MONOTONIC].resolution = KTIME_HIGH_RES; > > tick_setup_sched_timer(); >- > /* "Retrigger" the interrupt to get things going */ > retrigger_next_event(NULL); > local_irq_restore(flags); > return 1; > } > >+static inline ktime_t hrtimer_update_base(struct hrtimer_cpu_base *base) >+{ >+ ktime_t *offs_real = &base->clock_base[CLOCK_REALTIME].offset; >+ >+ return ktime_get_update_offsets(offs_real); >+} >+ > /* > * Called from timekeeping code to reprogramm the hrtimer interrupt > * device. If called from the timer interrupt context we defer it to >@@ -708,22 +714,12 @@ static inline void hrtimer_init_timer_hres(struct hrtimer *timer) { } > static void retrigger_next_event(void *arg) > { > struct hrtimer_cpu_base *base = &__get_cpu_var(hrtimer_bases); >- struct timespec realtime_offset, wtm, sleep; > > if (!hrtimer_hres_active()) > return; > >- get_xtime_and_monotonic_and_sleep_offset(&realtime_offset, &wtm, >- &sleep); >- set_normalized_timespec(&realtime_offset, -wtm.tv_sec, -wtm.tv_nsec); >- >- base = &__get_cpu_var(hrtimer_bases); >- >- /* Adjust CLOCK_REALTIME offset */ > spin_lock(&base->lock); >- base->clock_base[CLOCK_REALTIME].offset = >- timespec_to_ktime(realtime_offset); >- >+ hrtimer_update_base(base); > hrtimer_force_reprogram(base, 0); > spin_unlock(&base->lock); > } >@@ -1245,7 +1241,7 @@ void hrtimer_interrupt(struct clock_event_device *dev) > dev->next_event.tv64 = KTIME_MAX; > > spin_lock(&cpu_base->lock); >- entry_time = now = ktime_get(); >+ entry_time = now = hrtimer_update_base(cpu_base); > retry: > expires_next.tv64 = KTIME_MAX; > /* >@@ -1321,9 +1317,12 @@ retry: > * We need to prevent that we loop forever in the hrtimer > * interrupt routine. We give it 3 attempts to avoid > * overreacting on some spurious event. >+ * >+ * Acquire base lock for updating the offsets and retrieving >+ * the current time. > */ > spin_lock(&cpu_base->lock); >- now = ktime_get(); >+ now = hrtimer_update_base(cpu_base); > cpu_base->nr_retries++; > if (++retries < 3) > goto retry; >-- >1.7.9.3 >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 836803
:
597663
|
603549
|
603550
|
603551
|
603552
|
603553
| 603554 |
603555