diff options
author | Sebastian Andrzej Siewior <bigeasy@linutronix.de> | 2016-07-13 18:14:33 +0200 |
---|---|---|
committer | Sebastian Andrzej Siewior <bigeasy@linutronix.de> | 2016-07-14 16:46:42 +0200 |
commit | 7a203491ad9e98ea6506f7822995c41c8995681d (patch) | |
tree | d2af1cba063d12522e3d521e630446d676d928b0 | |
parent | 2794710f8319e935ca6b4e3e753a8267bf8ce844 (diff) | |
download | 4.9-rt-patches-7a203491ad9e98ea6506f7822995c41c8995681d.tar.gz |
[ANNOUNCE] 4.6.4-rt7
Dear RT folks!
I'm pleased to announce the v4.6.4-rt7 patch set.
Changes since v4.6.4-rt6:
- Wake up all waiters of del_timer_sync(). Usually there should not
be more than just one waiter (per timer base) but it possible to
gain more.
- Wake up the waiers of del_timer_sync() after dropping the base lock.
Known issues
- CPU hotplug got a little better but can deadlock.
The delta patch against 4.6.4-rt6 is appended below and can be found here:
https://cdn.kernel.org/pub/linux/kernel/projects/rt/4.6/incr/patch-4.6.4-rt6-rt7.patch.xz
You can get this release via the git tree at:
git://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-rt-devel.git v4.6.4-rt7
The RT patch against 4.6.2 can be found here:
https://cdn.kernel.org/pub/linux/kernel/projects/rt/4.6/patch-4.6.4-rt7.patch.xz
The split quilt queue is available at:
https://cdn.kernel.org/pub/linux/kernel/projects/rt/4.6/patches-4.6.4-rt7.tar.xz
Sebastian
-rw-r--r-- | patches/localversion.patch | 2 | ||||
-rw-r--r-- | patches/series | 2 | ||||
-rw-r--r-- | patches/timers-wakeup-all-timer-waiters-without-holding-the-.patch | 26 | ||||
-rw-r--r-- | patches/timers-wakeup-all-timer-waiters.patch | 30 |
4 files changed, 59 insertions, 1 deletions
diff --git a/patches/localversion.patch b/patches/localversion.patch index 4c1841b6475d12..bbb08330835de1 100644 --- a/patches/localversion.patch +++ b/patches/localversion.patch @@ -10,4 +10,4 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> --- /dev/null +++ b/localversion-rt @@ -0,0 +1 @@ -+-rt6 ++-rt7 diff --git a/patches/series b/patches/series index 3ce48aeab102b8..04677f6bdd2cbe 100644 --- a/patches/series +++ b/patches/series @@ -262,6 +262,8 @@ relay-fix-timer-madness.patch # TIMERS timers-prepare-for-full-preemption.patch +timers-wakeup-all-timer-waiters.patch +timers-wakeup-all-timer-waiters-without-holding-the-.patch timers-preempt-rt-support.patch timer-delay-waking-softirqs-from-the-jiffy-tick.patch timers-avoid-the-base-null-otptimization-on-rt.patch diff --git a/patches/timers-wakeup-all-timer-waiters-without-holding-the-.patch b/patches/timers-wakeup-all-timer-waiters-without-holding-the-.patch new file mode 100644 index 00000000000000..2b51d4de5d2111 --- /dev/null +++ b/patches/timers-wakeup-all-timer-waiters-without-holding-the-.patch @@ -0,0 +1,26 @@ +From: Sebastian Andrzej Siewior <bigeasy@linutronix.de> +Date: Wed, 13 Jul 2016 17:13:23 +0200 +Subject: [PATCH] timers: wakeup all timer waiters without holding the base lock + +There should be no need to hold the base lock during the wakeup. There +should be no boosting involved, the wakeup list has its own lock so it +should be safe to do this without the lock. + +Cc: stable-rt@vger.kernel.org +Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> +--- + kernel/time/timer.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/kernel/time/timer.c ++++ b/kernel/time/timer.c +@@ -1288,8 +1288,8 @@ static inline void __run_timers(struct t + } + } + } +- wakeup_timer_waiters(base); + spin_unlock_irq(&base->lock); ++ wakeup_timer_waiters(base); + } + + #ifdef CONFIG_NO_HZ_COMMON diff --git a/patches/timers-wakeup-all-timer-waiters.patch b/patches/timers-wakeup-all-timer-waiters.patch new file mode 100644 index 00000000000000..bc0956d1d01c32 --- /dev/null +++ b/patches/timers-wakeup-all-timer-waiters.patch @@ -0,0 +1,30 @@ +From: Sebastian Andrzej Siewior <bigeasy@linutronix.de> +Date: Wed, 13 Jul 2016 17:13:23 +0200 +Subject: [PATCH] timers: wakeup all timer waiters + +The base lock is dropped during the invocation if the timer. That means +it is possible that we have one waiter while timer1 is running and once +this one finished, we get another waiter while timer2 is running. Since +we wake up only one waiter it is possible that we miss the other one. +This will probably heal itself over time because most of the time we +complete timers without an active wake up. +To avoid the scenario where we don't wake up all waiters at once, +wake_up_all() is used. + +Cc: stable-rt@vger.kernel.org +Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> +--- + kernel/time/timer.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/kernel/time/timer.c ++++ b/kernel/time/timer.c +@@ -1026,7 +1026,7 @@ static void wait_for_running_timer(struc + base->running_timer != timer); + } + +-# define wakeup_timer_waiters(b) wake_up(&(b)->wait_for_running_timer) ++# define wakeup_timer_waiters(b) wake_up_all(&(b)->wait_for_running_timer) + #else + static inline void wait_for_running_timer(struct timer_list *timer) + { |