| From c19eb885a2c3d9c85a821725dab48b70de88e046 Mon Sep 17 00:00:00 2001 |
| From: Eric Dumazet <edumazet@google.com> |
| Date: Thu, 28 Nov 2013 09:51:22 -0800 |
| Subject: inet: fix possible seqlock deadlocks |
| |
| From: Eric Dumazet <edumazet@google.com> |
| |
| [ Upstream commit f1d8cba61c3c4b1eb88e507249c4cb8d635d9a76 ] |
| |
| In commit c9e9042994d3 ("ipv4: fix possible seqlock deadlock") I left |
| another places where IP_INC_STATS_BH() were improperly used. |
| |
| udp_sendmsg(), ping_v4_sendmsg() and tcp_v4_connect() are called from |
| process context, not from softirq context. |
| |
| This was detected by lockdep seqlock support. |
| |
| Reported-by: jongman heo <jongman.heo@samsung.com> |
| Fixes: 584bdf8cbdf6 ("[IPV4]: Fix "ipOutNoRoutes" counter error for TCP and UDP") |
| Fixes: c319b4d76b9e ("net: ipv4: add IPPROTO_ICMP socket kind") |
| Signed-off-by: Eric Dumazet <edumazet@google.com> |
| Cc: Hannes Frederic Sowa <hannes@stressinduktion.org> |
| Acked-by: Hannes Frederic Sowa <hannes@stressinduktion.org> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| net/ipv4/ping.c | 2 +- |
| net/ipv4/tcp_ipv4.c | 2 +- |
| net/ipv4/udp.c | 2 +- |
| 3 files changed, 3 insertions(+), 3 deletions(-) |
| |
| --- a/net/ipv4/ping.c |
| +++ b/net/ipv4/ping.c |
| @@ -570,7 +570,7 @@ static int ping_sendmsg(struct kiocb *io |
| err = PTR_ERR(rt); |
| rt = NULL; |
| if (err == -ENETUNREACH) |
| - IP_INC_STATS_BH(net, IPSTATS_MIB_OUTNOROUTES); |
| + IP_INC_STATS(net, IPSTATS_MIB_OUTNOROUTES); |
| goto out; |
| } |
| |
| --- a/net/ipv4/tcp_ipv4.c |
| +++ b/net/ipv4/tcp_ipv4.c |
| @@ -176,7 +176,7 @@ int tcp_v4_connect(struct sock *sk, stru |
| if (IS_ERR(rt)) { |
| err = PTR_ERR(rt); |
| if (err == -ENETUNREACH) |
| - IP_INC_STATS_BH(sock_net(sk), IPSTATS_MIB_OUTNOROUTES); |
| + IP_INC_STATS(sock_net(sk), IPSTATS_MIB_OUTNOROUTES); |
| return err; |
| } |
| |
| --- a/net/ipv4/udp.c |
| +++ b/net/ipv4/udp.c |
| @@ -971,7 +971,7 @@ int udp_sendmsg(struct kiocb *iocb, stru |
| err = PTR_ERR(rt); |
| rt = NULL; |
| if (err == -ENETUNREACH) |
| - IP_INC_STATS_BH(net, IPSTATS_MIB_OUTNOROUTES); |
| + IP_INC_STATS(net, IPSTATS_MIB_OUTNOROUTES); |
| goto out; |
| } |
| |