From: Steven Rostedt <rostedt@goodmis.org> Date: 2016-09-23 15:32:08
Dear RT Folks,
This is the RT stable review cycle of patch 3.10.103-rt115-rc1.
Please scream at me if I messed something up. Please test the patches too.
The -rc release will be uploaded to kernel.org and will be deleted when
the final release is out. This is just a review release (or release candidate).
The pre-releases will not be pushed to the git repository, only the
final release is.
If all goes well, this patch will be converted to the next main release
on 9/25/2016.
Enjoy,
-- Steve
To build 3.10.103-rt115-rc1 directly, the following patches should be applied:
http://www.kernel.org/pub/linux/kernel/v3.x/linux-3.10.tar.xzhttp://www.kernel.org/pub/linux/kernel/v3.x/patch-3.10.103.xzhttp://www.kernel.org/pub/linux/kernel/projects/rt/3.10/patch-3.10.103-rt115-rc1.patch.xz
You can also build from 3.10.103-rt114 by applying the incremental patch:
http://www.kernel.org/pub/linux/kernel/projects/rt/3.10/incr/patch-3.10.103-rt114-rt115-rc1.patch.xz
Changes from 3.10.103-rt114:
---
Mike Galbraith (1):
scsi/fcoe: Fix get_cpu()/put_cpu_light() imbalance in fcoe_recv_frame()
Sebastian Andrzej Siewior (6):
timers: wakeup all timer waiters
timers: wakeup all timer waiters without holding the base lock
net: add back the missing serialization in ip_send_unicast_reply()
net: add a lock around icmp_sk()
fs/dcache: resched/chill only if we make no progress
fs/dcache: incremental fixup of the retry routine
Steven Rostedt (Red Hat) (1):
Linux 3.10.103-rt115-rc1
----
drivers/scsi/fcoe/fcoe.c | 2 +-
fs/dcache.c | 17 +++++++++++++++--
kernel/timer.c | 4 ++--
localversion-rt | 2 +-
net/ipv4/icmp.c | 8 ++++++++
net/ipv4/tcp_ipv4.c | 7 +++++++
6 files changed, 34 insertions(+), 6 deletions(-)
From: Steven Rostedt <rostedt@goodmis.org> Date: 2016-09-23 15:32:12
3.10.103-rt115-rc1 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
It looks like the this_cpu_ptr() access in icmp_sk() is protected with
local_bh_disable(). To avoid missing serialization in -RT I am adding
here a local lock. No crash has been observed, this is just precaution.
Cc: stable-rt@vger.kernel.org
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
---
net/ipv4/icmp.c | 8 ++++++++
1 file changed, 8 insertions(+)
@@ -215,12 +218,14 @@ static inline struct sock *icmp_xmit_lock(struct net *net)local_bh_disable();+local_lock(icmp_sk_lock);sk=icmp_sk(net);if(unlikely(!spin_trylock(&sk->sk_lock.slock))){/* This can happen if the output path signals a*dst_link_failure()foranoutgoingICMPpacket.*/+local_unlock(icmp_sk_lock);local_bh_enable();returnNULL;}
From: Steven Rostedt <rostedt@goodmis.org> Date: 2016-09-23 15:32:22
3.10.103-rt115-rc1 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
It has been pointed out by tglx that on UP the non-RT task could spin
its entire time slice because the lock owner is preempted. This won't
happen on !RT. So we back to "chill" if we can't cond_resched() did not
work.
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
---
fs/dcache.c | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
@@ -552,10 +550,11 @@ kill_it:if(parent==dentry){/* the task with the highest priority won't schedule */r=cond_resched();-if(!r&&(rt_task(current)||dl_task(current)))+if(!r)cpu_chill();-}else+}else{dentry=parent;+}gotorepeat;}}
From: Steven Rostedt <rostedt@goodmis.org> Date: 2016-09-23 15:32:26
3.10.103-rt115-rc1 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Upstream commit 47be61845c77 ("fs/dcache.c: avoid soft-lockup in
dput()") changed the condition _when_ cpu_relax() / cond_resched() was
invoked. This change was adapted in -RT into mostly the same thing
except that if cond_resched() did nothing we had to do cpu_chill() to
force the task off CPU for a tiny little bit in case the task had RT
priority and did not want to leave the CPU.
This change resulted in a performance regression (in my testcase the
build time on /dev/shm increased from 19min to 24min). The reason is
that with this change cpu_chill() was invoked even dput() made progress
(dentry_kill() returned a different dentry) instead only if we were
trying this operation on the same dentry over and over again.
This patch brings back to the old behavior back to cond_resched() &
chill if we make no progress. A little improvement is to invoke
cpu_chill() only if we are a RT task (and avoid the sleep otherwise).
Otherwise the scheduler should remove us from the CPU if we make no
progress.
Cc: stable-rt@vger.kernel.org
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
---
fs/dcache.c | 18 ++++++++++++++++--
1 file changed, 16 insertions(+), 2 deletions(-)
@@ -541,9 +545,19 @@ repeat:return;kill_it:-dentry=dentry_kill(dentry,1);-if(dentry)+parent=dentry_kill(dentry,1);+if(parent){+intr;++if(parent==dentry){+/* the task with the highest priority won't schedule */+r=cond_resched();+if(!r&&(rt_task(current)||dl_task(current)))+cpu_chill();+}else+dentry=parent;gotorepeat;+}}EXPORT_SYMBOL(dput);
From: Steven Rostedt <rostedt@goodmis.org> Date: 2016-09-23 15:32:31
3.10.103-rt115-rc1 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Some time ago Sami Pietikainen reported a crash on -RT in
ip_send_unicast_reply() which was later fixed by Nicholas Mc Guire
(v3.12.8-rt11). Later (v3.18.8) the code was reworked and I dropped the
patch. As it turns out it was mistake.
I have reports that the same crash is possible with a similar backtrace.
It seems that vanilla protects access to this_cpu_ptr() via
local_bh_disable(). This does not work the on -RT since we can have
NET_RX and NET_TX running in parallel on the same CPU.
This is brings back the old locks.
|Unable to handle kernel NULL pointer dereference at virtual address 00000010
|PC is at __ip_make_skb+0x198/0x3e8
|[<c04e39d8>] (__ip_make_skb) from [<c04e3ca8>] (ip_push_pending_frames+0x20/0x40)
|[<c04e3ca8>] (ip_push_pending_frames) from [<c04e3ff0>] (ip_send_unicast_reply+0x210/0x22c)
|[<c04e3ff0>] (ip_send_unicast_reply) from [<c04fbb54>] (tcp_v4_send_reset+0x190/0x1c0)
|[<c04fbb54>] (tcp_v4_send_reset) from [<c04fcc1c>] (tcp_v4_do_rcv+0x22c/0x288)
|[<c04fcc1c>] (tcp_v4_do_rcv) from [<c0474364>] (release_sock+0xb4/0x150)
|[<c0474364>] (release_sock) from [<c04ed904>] (tcp_close+0x240/0x454)
|[<c04ed904>] (tcp_close) from [<c0511408>] (inet_release+0x74/0x7c)
|[<c0511408>] (inet_release) from [<c0470728>] (sock_release+0x30/0xb0)
|[<c0470728>] (sock_release) from [<c0470abc>] (sock_close+0x1c/0x24)
|[<c0470abc>] (sock_close) from [<c0115ec4>] (__fput+0xe8/0x20c)
|[<c0115ec4>] (__fput) from [<c0116050>] (____fput+0x18/0x1c)
|[<c0116050>] (____fput) from [<c0058138>] (task_work_run+0xa4/0xb8)
|[<c0058138>] (task_work_run) from [<c0011478>] (do_work_pending+0xd0/0xe4)
|[<c0011478>] (do_work_pending) from [<c000e740>] (work_pending+0xc/0x20)
|Code: e3530001 8a000001 e3a00040 ea000011 (e5973010)
Cc: stable-rt@vger.kernel.org
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
---
net/ipv4/tcp_ipv4.c | 7 +++++++
1 file changed, 7 insertions(+)
From: Steven Rostedt <rostedt@goodmis.org> Date: 2016-09-23 15:32:33
3.10.103-rt115-rc1 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
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>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
---
kernel/timer.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
From: Steven Rostedt <rostedt@goodmis.org> Date: 2016-09-23 15:32:37
3.10.103-rt115-rc1 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
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>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
---
kernel/timer.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
From: Steven Rostedt <rostedt@goodmis.org> Date: 2016-09-23 15:33:42
3.10.103-rt115-rc1 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Mike Galbraith <redacted>
During master->rt merge, I stumbled across the buglet below.
Fix get_cpu()/put_cpu_light() imbalance.
Cc: stable-rt@vger.kernel.org
Signed-off-by: Mike Gabraith <redacted>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
---
drivers/scsi/fcoe/fcoe.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)