Message ID | 1509648784.2849.14.camel@edumazet-glaptop3.roam.corp.google.com |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
Series | [net-next] tcp: fix a lockdep issue in tcp_fastopen_reset_cipher() | expand |
On 02/11/17 - 11:53:04, Eric Dumazet wrote: > From: Eric Dumazet <edumazet@google.com> > > icsk_accept_queue.fastopenq.lock is only fully initialized at listen() > time. > > LOCKDEP is not happy if we attempt a spin_lock_bh() on it, because > of missing annotation. (Although kernel runs just fine) > > Lets use net->ipv4.tcp_fastopen_ctx_lock to protect ctx access. > > Fixes: 1fba70e5b6be ("tcp: socket option to set TCP fast open key") > Signed-off-by: Eric Dumazet <edumazet@google.com> > Cc: Yuchung Cheng <ycheng@google.com> > Cc: Christoph Paasch <cpaasch@apple.com> > --- > net/ipv4/tcp_fastopen.c | 8 +++----- > 1 file changed, 3 insertions(+), 5 deletions(-) Reviewed-by: Christoph Paasch <cpaasch@apple.com>
From: Eric Dumazet <eric.dumazet@gmail.com> Date: Thu, 02 Nov 2017 11:53:04 -0700 > From: Eric Dumazet <edumazet@google.com> > > icsk_accept_queue.fastopenq.lock is only fully initialized at listen() > time. > > LOCKDEP is not happy if we attempt a spin_lock_bh() on it, because > of missing annotation. (Although kernel runs just fine) > > Lets use net->ipv4.tcp_fastopen_ctx_lock to protect ctx access. > > Fixes: 1fba70e5b6be ("tcp: socket option to set TCP fast open key") > Signed-off-by: Eric Dumazet <edumazet@google.com> Applied.
diff --git a/net/ipv4/tcp_fastopen.c b/net/ipv4/tcp_fastopen.c index e0a4b56644aa0f8ccd384644fde7e4841da29d3f..91762be58accaed7d8974e723b580fb3d7922fca 100644 --- a/net/ipv4/tcp_fastopen.c +++ b/net/ipv4/tcp_fastopen.c @@ -92,20 +92,18 @@ error: kfree(ctx); memcpy(ctx->key, key, len); + spin_lock(&net->ipv4.tcp_fastopen_ctx_lock); if (sk) { q = &inet_csk(sk)->icsk_accept_queue.fastopenq; - spin_lock_bh(&q->lock); octx = rcu_dereference_protected(q->ctx, - lockdep_is_held(&q->lock)); + lockdep_is_held(&net->ipv4.tcp_fastopen_ctx_lock)); rcu_assign_pointer(q->ctx, ctx); - spin_unlock_bh(&q->lock); } else { - spin_lock(&net->ipv4.tcp_fastopen_ctx_lock); octx = rcu_dereference_protected(net->ipv4.tcp_fastopen_ctx, lockdep_is_held(&net->ipv4.tcp_fastopen_ctx_lock)); rcu_assign_pointer(net->ipv4.tcp_fastopen_ctx, ctx); - spin_unlock(&net->ipv4.tcp_fastopen_ctx_lock); } + spin_unlock(&net->ipv4.tcp_fastopen_ctx_lock); if (octx) call_rcu(&octx->rcu, tcp_fastopen_ctx_free);