From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S966272AbcIVVxu convert rfc822-to-8bit (ORCPT ); Thu, 22 Sep 2016 17:53:50 -0400 Received: from smtprelay0214.hostedemail.com ([216.40.44.214]:44809 "EHLO smtprelay.hostedemail.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S965731AbcIVVxr (ORCPT ); Thu, 22 Sep 2016 17:53:47 -0400 X-Session-Marker: 726F737465647440676F6F646D69732E6F7267 X-Spam-Summary: 2,0,0,,d41d8cd98f00b204,rostedt@goodmis.org,:::::::::::::::,RULES_HIT:41:69:152:334:355:368:369:379:541:599:800:960:973:988:989:1260:1277:1311:1313:1314:1345:1359:1437:1513:1515:1516:1518:1521:1535:1544:1593:1594:1711:1730:1747:1777:1792:2194:2199:2282:2393:2553:2559:2562:2693:2827:2829:2901:2911:3138:3139:3140:3141:3142:3355:3865:3867:3868:3870:3871:3872:3874:4250:4321:4425:4605:5007:6119:6261:7576:7875:7901:7903:10004:10848:10967:11026:11232:11473:11658:11783:11914:12043:12114:12296:12438:12555:12740:13255:14181:14659:14721:21080:21433:21451:30003:30012:30026:30029:30054:30083:30084:30089:30090:30091,0,RBL:none,CacheIP:none,Bayesian:0.5,0.5,0.5,Netcheck:none,DomainCache:0,MSF:not bulk,SPF:fn,MSBL:0,DNSBL:none,Custom_rules:0:0:0,LFtime:2,LUA_SUMMARY:none X-HE-Tag: brick08_158062cd22612 X-Filterd-Recvd-Size: 5253 Date: Thu, 22 Sep 2016 17:52:26 -0400 From: Steven Rostedt To: linux-kernel@vger.kernel.org, linux-rt-users Cc: Thomas Gleixner , Carsten Emde , Sebastian Andrzej Siewior , John Kacur , Paul Gortmaker , Subject: Re: [PATCH RT 05/10] net: add back the missing serialization in ip_send_unicast_reply() Message-ID: <20160922175226.0a6c7712@gandalf.local.home> In-Reply-To: <20160922214817.564751063@goodmis.org> References: <20160922214752.178698951@goodmis.org> <20160922214817.564751063@goodmis.org> X-Mailer: Claws Mail 3.13.2 (GTK+ 2.24.30; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8BIT Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This got rejected by vger.kernel.org because quilt mail can't handle that funny symbol in Sami's name. -- Steve On Thu, 22 Sep 2016 17:47:57 -0400 Steven Rostedt wrote: > 4.4.21-rt31-rc1 stable review patch. > If anyone has any objections, please let me know. > > ------------------ > > From: Sebastian Andrzej Siewior > > Some time ago Sami PietikÀinen 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 > |[] (__ip_make_skb) from [] (ip_push_pending_frames+0x20/0x40) > |[] (ip_push_pending_frames) from [] (ip_send_unicast_reply+0x210/0x22c) > |[] (ip_send_unicast_reply) from [] (tcp_v4_send_reset+0x190/0x1c0) > |[] (tcp_v4_send_reset) from [] (tcp_v4_do_rcv+0x22c/0x288) > |[] (tcp_v4_do_rcv) from [] (release_sock+0xb4/0x150) > |[] (release_sock) from [] (tcp_close+0x240/0x454) > |[] (tcp_close) from [] (inet_release+0x74/0x7c) > |[] (inet_release) from [] (sock_release+0x30/0xb0) > |[] (sock_release) from [] (sock_close+0x1c/0x24) > |[] (sock_close) from [] (__fput+0xe8/0x20c) > |[] (__fput) from [] (____fput+0x18/0x1c) > |[] (____fput) from [] (task_work_run+0xa4/0xb8) > |[] (task_work_run) from [] (do_work_pending+0xd0/0xe4) > |[] (do_work_pending) from [] (work_pending+0xc/0x20) > |Code: e3530001 8a000001 e3a00040 ea000011 (e5973010) > > Cc: stable-rt@vger.kernel.org > Signed-off-by: Sebastian Andrzej Siewior > Signed-off-by: Steven Rostedt > --- > net/ipv4/tcp_ipv4.c | 7 +++++++ > 1 file changed, 7 insertions(+) > > diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c > index 048418b049d8..7fcd8b60d751 100644 > --- a/net/ipv4/tcp_ipv4.c > +++ b/net/ipv4/tcp_ipv4.c > @@ -62,6 +62,7 @@ > #include > #include > #include > +#include > > #include > #include > @@ -566,6 +567,7 @@ void tcp_v4_send_check(struct sock *sk, struct sk_buff *skb) > } > EXPORT_SYMBOL(tcp_v4_send_check); > > +static DEFINE_LOCAL_IRQ_LOCK(tcp_sk_lock); > /* > * This routine will send an RST to the other tcp. > * > @@ -687,10 +689,13 @@ static void tcp_v4_send_reset(const struct sock *sk, struct sk_buff *skb) > arg.bound_dev_if = sk->sk_bound_dev_if; > > arg.tos = ip_hdr(skb)->tos; > + > + local_lock(tcp_sk_lock); > ip_send_unicast_reply(*this_cpu_ptr(net->ipv4.tcp_sk), > skb, &TCP_SKB_CB(skb)->header.h4.opt, > ip_hdr(skb)->saddr, ip_hdr(skb)->daddr, > &arg, arg.iov[0].iov_len); > + local_unlock(tcp_sk_lock); > > TCP_INC_STATS_BH(net, TCP_MIB_OUTSEGS); > TCP_INC_STATS_BH(net, TCP_MIB_OUTRSTS); > @@ -772,10 +777,12 @@ static void tcp_v4_send_ack(struct net *net, > if (oif) > arg.bound_dev_if = oif; > arg.tos = tos; > + local_lock(tcp_sk_lock); > ip_send_unicast_reply(*this_cpu_ptr(net->ipv4.tcp_sk), > skb, &TCP_SKB_CB(skb)->header.h4.opt, > ip_hdr(skb)->saddr, ip_hdr(skb)->daddr, > &arg, arg.iov[0].iov_len); > + local_unlock(tcp_sk_lock); > > TCP_INC_STATS_BH(net, TCP_MIB_OUTSEGS); > }