All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH net v2] tcp: Do not call tcp_fastopen_reset_cipher from interrupt context
@ 2015-06-18 16:15 Christoph Paasch
  2015-06-19  8:01 ` Eric Dumazet
  2015-06-23  9:53 ` David Miller
  0 siblings, 2 replies; 3+ messages in thread
From: Christoph Paasch @ 2015-06-18 16:15 UTC (permalink / raw)
  To: David Miller; +Cc: netdev, Christoph Paasch, Eric Dumazet, Hannes Frederic Sowa

tcp_fastopen_reset_cipher really cannot be called from interrupt
context. It allocates the tcp_fastopen_context with GFP_KERNEL and
calls crypto_alloc_cipher, which allocates all kind of stuff with
GFP_KERNEL.

Thus, we might sleep when the key-generation is triggered by an
incoming TFO cookie-request which would then happen in interrupt-
context, as shown by enabling CONFIG_DEBUG_ATOMIC_SLEEP:

[   36.001813] BUG: sleeping function called from invalid context at mm/slub.c:1266
[   36.003624] in_atomic(): 1, irqs_disabled(): 0, pid: 1016, name: packetdrill
[   36.004859] CPU: 1 PID: 1016 Comm: packetdrill Not tainted 4.1.0-rc7 #14
[   36.006085] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.7.5-0-ge51488c-20140602_164612-nilsson.home.kraxel.org 04/01/2014
[   36.008250]  00000000000004f2 ffff88007f8838a8 ffffffff8171d53a ffff880075a084a8
[   36.009630]  ffff880075a08000 ffff88007f8838c8 ffffffff810967d3 ffff88007f883928
[   36.011076]  0000000000000000 ffff88007f8838f8 ffffffff81096892 ffff88007f89be00
[   36.012494] Call Trace:
[   36.012953]  <IRQ>  [<ffffffff8171d53a>] dump_stack+0x4f/0x6d
[   36.014085]  [<ffffffff810967d3>] ___might_sleep+0x103/0x170
[   36.015117]  [<ffffffff81096892>] __might_sleep+0x52/0x90
[   36.016117]  [<ffffffff8118e887>] kmem_cache_alloc_trace+0x47/0x190
[   36.017266]  [<ffffffff81680d82>] ? tcp_fastopen_reset_cipher+0x42/0x130
[   36.018485]  [<ffffffff81680d82>] tcp_fastopen_reset_cipher+0x42/0x130
[   36.019679]  [<ffffffff81680f01>] tcp_fastopen_init_key_once+0x61/0x70
[   36.020884]  [<ffffffff81680f2c>] __tcp_fastopen_cookie_gen+0x1c/0x60
[   36.022058]  [<ffffffff816814ff>] tcp_try_fastopen+0x58f/0x730
[   36.023118]  [<ffffffff81671788>] tcp_conn_request+0x3e8/0x7b0
[   36.024185]  [<ffffffff810e3872>] ? __module_text_address+0x12/0x60
[   36.025327]  [<ffffffff8167b2e1>] tcp_v4_conn_request+0x51/0x60
[   36.026410]  [<ffffffff816727e0>] tcp_rcv_state_process+0x190/0xda0
[   36.027556]  [<ffffffff81661f97>] ? __inet_lookup_established+0x47/0x170
[   36.028784]  [<ffffffff8167c2ad>] tcp_v4_do_rcv+0x16d/0x3d0
[   36.029832]  [<ffffffff812e6806>] ? security_sock_rcv_skb+0x16/0x20
[   36.030936]  [<ffffffff8167cc8a>] tcp_v4_rcv+0x77a/0x7b0
[   36.031875]  [<ffffffff816af8c3>] ? iptable_filter_hook+0x33/0x70
[   36.032953]  [<ffffffff81657d22>] ip_local_deliver_finish+0x92/0x1f0
[   36.034065]  [<ffffffff81657f1a>] ip_local_deliver+0x9a/0xb0
[   36.035069]  [<ffffffff81657c90>] ? ip_rcv+0x3d0/0x3d0
[   36.035963]  [<ffffffff81657569>] ip_rcv_finish+0x119/0x330
[   36.036950]  [<ffffffff81657ba7>] ip_rcv+0x2e7/0x3d0
[   36.037847]  [<ffffffff81610652>] __netif_receive_skb_core+0x552/0x930
[   36.038994]  [<ffffffff81610a57>] __netif_receive_skb+0x27/0x70
[   36.040033]  [<ffffffff81610b72>] process_backlog+0xd2/0x1f0
[   36.041025]  [<ffffffff81611482>] net_rx_action+0x122/0x310
[   36.042007]  [<ffffffff81076743>] __do_softirq+0x103/0x2f0
[   36.042978]  [<ffffffff81723e3c>] do_softirq_own_stack+0x1c/0x30

This patch moves the call to tcp_fastopen_init_key_once to the places
where a listener socket creates its TFO-state, which always happens in
user-context (either from the setsockopt, or implicitly during the
listen()-call)

Cc: Eric Dumazet <eric.dumazet@gmail.com>
Cc: Hannes Frederic Sowa <hannes@stressinduktion.org>
Fixes: 222e83d2e0ae ("tcp: switch tcp_fastopen key generation to net_get_random_once")
Signed-off-by: Christoph Paasch <cpaasch@apple.com>
---

Notes:
    v2: Instead of reverting Hannes' patch, move the call to tcp_fastopen_init_once
        to the places where we enable TFO on the server-side from user-context.

 net/ipv4/af_inet.c      | 2 ++
 net/ipv4/tcp.c          | 7 +++++--
 net/ipv4/tcp_fastopen.c | 2 --
 3 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c
index 8b47a4d79d04..a5aa54ea6533 100644
--- a/net/ipv4/af_inet.c
+++ b/net/ipv4/af_inet.c
@@ -228,6 +228,8 @@ int inet_listen(struct socket *sock, int backlog)
 				err = 0;
 			if (err)
 				goto out;
+
+			tcp_fastopen_init_key_once(true);
 		}
 		err = inet_csk_listen_start(sk, backlog);
 		if (err)
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
index f1377f2a0472..bb2ce74f6004 100644
--- a/net/ipv4/tcp.c
+++ b/net/ipv4/tcp.c
@@ -2545,10 +2545,13 @@ static int do_tcp_setsockopt(struct sock *sk, int level,
 
 	case TCP_FASTOPEN:
 		if (val >= 0 && ((1 << sk->sk_state) & (TCPF_CLOSE |
-		    TCPF_LISTEN)))
+		    TCPF_LISTEN))) {
+			tcp_fastopen_init_key_once(true);
+
 			err = fastopen_init_queue(sk, val);
-		else
+		} else {
 			err = -EINVAL;
+		}
 		break;
 	case TCP_TIMESTAMP:
 		if (!tp->repair)
diff --git a/net/ipv4/tcp_fastopen.c b/net/ipv4/tcp_fastopen.c
index 46b087a27503..f9c0fb84e435 100644
--- a/net/ipv4/tcp_fastopen.c
+++ b/net/ipv4/tcp_fastopen.c
@@ -78,8 +78,6 @@ static bool __tcp_fastopen_cookie_gen(const void *path,
 	struct tcp_fastopen_context *ctx;
 	bool ok = false;
 
-	tcp_fastopen_init_key_once(true);
-
 	rcu_read_lock();
 	ctx = rcu_dereference(tcp_fastopen_ctx);
 	if (ctx) {
-- 
2.4.4

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH net v2] tcp: Do not call tcp_fastopen_reset_cipher from interrupt context
  2015-06-18 16:15 [PATCH net v2] tcp: Do not call tcp_fastopen_reset_cipher from interrupt context Christoph Paasch
@ 2015-06-19  8:01 ` Eric Dumazet
  2015-06-23  9:53 ` David Miller
  1 sibling, 0 replies; 3+ messages in thread
From: Eric Dumazet @ 2015-06-19  8:01 UTC (permalink / raw)
  To: Christoph Paasch; +Cc: David Miller, netdev, Hannes Frederic Sowa

On Thu, 2015-06-18 at 09:15 -0700, Christoph Paasch wrote:
> tcp_fastopen_reset_cipher really cannot be called from interrupt
> context. It allocates the tcp_fastopen_context with GFP_KERNEL and
> calls crypto_alloc_cipher, which allocates all kind of stuff with
> GFP_KERNEL.
> 
> Thus, we might sleep when the key-generation is triggered by an
> incoming TFO cookie-request which would then happen in interrupt-
> context, as shown by enabling CONFIG_DEBUG_ATOMIC_SLEEP:
> 
> [   36.001813] BUG: sleeping function called from invalid context at mm/slub.c:1266
> [   36.003624] in_atomic(): 1, irqs_disabled(): 0, pid: 1016, name: packetdrill
> [   36.004859] CPU: 1 PID: 1016 Comm: packetdrill Not tainted 4.1.0-rc7 #14
> [   36.006085] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.7.5-0-ge51488c-20140602_164612-nilsson.home.kraxel.org 04/01/2014
> [   36.008250]  00000000000004f2 ffff88007f8838a8 ffffffff8171d53a ffff880075a084a8
> [   36.009630]  ffff880075a08000 ffff88007f8838c8 ffffffff810967d3 ffff88007f883928
> [   36.011076]  0000000000000000 ffff88007f8838f8 ffffffff81096892 ffff88007f89be00
> [   36.012494] Call Trace:
> [   36.012953]  <IRQ>  [<ffffffff8171d53a>] dump_stack+0x4f/0x6d
> [   36.014085]  [<ffffffff810967d3>] ___might_sleep+0x103/0x170
> [   36.015117]  [<ffffffff81096892>] __might_sleep+0x52/0x90
> [   36.016117]  [<ffffffff8118e887>] kmem_cache_alloc_trace+0x47/0x190
> [   36.017266]  [<ffffffff81680d82>] ? tcp_fastopen_reset_cipher+0x42/0x130
> [   36.018485]  [<ffffffff81680d82>] tcp_fastopen_reset_cipher+0x42/0x130
> [   36.019679]  [<ffffffff81680f01>] tcp_fastopen_init_key_once+0x61/0x70
> [   36.020884]  [<ffffffff81680f2c>] __tcp_fastopen_cookie_gen+0x1c/0x60
> [   36.022058]  [<ffffffff816814ff>] tcp_try_fastopen+0x58f/0x730
> [   36.023118]  [<ffffffff81671788>] tcp_conn_request+0x3e8/0x7b0
> [   36.024185]  [<ffffffff810e3872>] ? __module_text_address+0x12/0x60
> [   36.025327]  [<ffffffff8167b2e1>] tcp_v4_conn_request+0x51/0x60
> [   36.026410]  [<ffffffff816727e0>] tcp_rcv_state_process+0x190/0xda0
> [   36.027556]  [<ffffffff81661f97>] ? __inet_lookup_established+0x47/0x170
> [   36.028784]  [<ffffffff8167c2ad>] tcp_v4_do_rcv+0x16d/0x3d0
> [   36.029832]  [<ffffffff812e6806>] ? security_sock_rcv_skb+0x16/0x20
> [   36.030936]  [<ffffffff8167cc8a>] tcp_v4_rcv+0x77a/0x7b0
> [   36.031875]  [<ffffffff816af8c3>] ? iptable_filter_hook+0x33/0x70
> [   36.032953]  [<ffffffff81657d22>] ip_local_deliver_finish+0x92/0x1f0
> [   36.034065]  [<ffffffff81657f1a>] ip_local_deliver+0x9a/0xb0
> [   36.035069]  [<ffffffff81657c90>] ? ip_rcv+0x3d0/0x3d0
> [   36.035963]  [<ffffffff81657569>] ip_rcv_finish+0x119/0x330
> [   36.036950]  [<ffffffff81657ba7>] ip_rcv+0x2e7/0x3d0
> [   36.037847]  [<ffffffff81610652>] __netif_receive_skb_core+0x552/0x930
> [   36.038994]  [<ffffffff81610a57>] __netif_receive_skb+0x27/0x70
> [   36.040033]  [<ffffffff81610b72>] process_backlog+0xd2/0x1f0
> [   36.041025]  [<ffffffff81611482>] net_rx_action+0x122/0x310
> [   36.042007]  [<ffffffff81076743>] __do_softirq+0x103/0x2f0
> [   36.042978]  [<ffffffff81723e3c>] do_softirq_own_stack+0x1c/0x30
> 
> This patch moves the call to tcp_fastopen_init_key_once to the places
> where a listener socket creates its TFO-state, which always happens in
> user-context (either from the setsockopt, or implicitly during the
> listen()-call)
> 
> Cc: Eric Dumazet <eric.dumazet@gmail.com>
> Cc: Hannes Frederic Sowa <hannes@stressinduktion.org>
> Fixes: 222e83d2e0ae ("tcp: switch tcp_fastopen key generation to net_get_random_once")
> Signed-off-by: Christoph Paasch <cpaasch@apple.com>
> ---

Acked-by: Eric Dumazet <edumazet@google.com>

Thanks Christoph.

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH net v2] tcp: Do not call tcp_fastopen_reset_cipher from interrupt context
  2015-06-18 16:15 [PATCH net v2] tcp: Do not call tcp_fastopen_reset_cipher from interrupt context Christoph Paasch
  2015-06-19  8:01 ` Eric Dumazet
@ 2015-06-23  9:53 ` David Miller
  1 sibling, 0 replies; 3+ messages in thread
From: David Miller @ 2015-06-23  9:53 UTC (permalink / raw)
  To: cpaasch; +Cc: netdev, eric.dumazet, hannes

From: Christoph Paasch <cpaasch@apple.com>
Date: Thu, 18 Jun 2015 09:15:34 -0700

> tcp_fastopen_reset_cipher really cannot be called from interrupt
> context. It allocates the tcp_fastopen_context with GFP_KERNEL and
> calls crypto_alloc_cipher, which allocates all kind of stuff with
> GFP_KERNEL.
> 
> Thus, we might sleep when the key-generation is triggered by an
> incoming TFO cookie-request which would then happen in interrupt-
> context, as shown by enabling CONFIG_DEBUG_ATOMIC_SLEEP:
 ...
> This patch moves the call to tcp_fastopen_init_key_once to the places
> where a listener socket creates its TFO-state, which always happens in
> user-context (either from the setsockopt, or implicitly during the
> listen()-call)
> 
> Cc: Eric Dumazet <eric.dumazet@gmail.com>
> Cc: Hannes Frederic Sowa <hannes@stressinduktion.org>
> Fixes: 222e83d2e0ae ("tcp: switch tcp_fastopen key generation to net_get_random_once")
> Signed-off-by: Christoph Paasch <cpaasch@apple.com>

Applied and queued up for -stable, thanks.

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2015-06-23  9:42 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-06-18 16:15 [PATCH net v2] tcp: Do not call tcp_fastopen_reset_cipher from interrupt context Christoph Paasch
2015-06-19  8:01 ` Eric Dumazet
2015-06-23  9:53 ` David Miller

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.