summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Andrzej Siewior <bigeasy@linutronix.de>2016-07-13 18:14:33 +0200
committerSebastian Andrzej Siewior <bigeasy@linutronix.de>2016-07-14 16:46:42 +0200
commit7a203491ad9e98ea6506f7822995c41c8995681d (patch)
treed2af1cba063d12522e3d521e630446d676d928b0
parent2794710f8319e935ca6b4e3e753a8267bf8ce844 (diff)
download4.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.patch2
-rw-r--r--patches/series2
-rw-r--r--patches/timers-wakeup-all-timer-waiters-without-holding-the-.patch26
-rw-r--r--patches/timers-wakeup-all-timer-waiters.patch30
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)
+ {