Eric Dumazet
f064af1e50
net: fix a lockdep splat
...
We have for each socket :
One spinlock (sk_slock.slock)
One rwlock (sk_callback_lock)
Possible scenarios are :
(A) (this is used in net/sunrpc/xprtsock.c)
read_lock(&sk->sk_callback_lock) (without blocking BH)
<BH>
spin_lock(&sk->sk_slock.slock);
...
read_lock(&sk->sk_callback_lock);
...
(B)
write_lock_bh(&sk->sk_callback_lock)
stuff
write_unlock_bh(&sk->sk_callback_lock)
(C)
spin_lock_bh(&sk->sk_slock)
...
write_lock_bh(&sk->sk_callback_lock)
stuff
write_unlock_bh(&sk->sk_callback_lock)
spin_unlock_bh(&sk->sk_slock)
This (C) case conflicts with (A) :
CPU1 [A] CPU2 [C]
read_lock(callback_lock)
<BH> spin_lock_bh(slock)
<wait to spin_lock(slock)>
<wait to write_lock_bh(callback_lock)>
We have one problematic (C) use case in inet_csk_listen_stop() :
local_bh_disable();
bh_lock_sock(child); // spin_lock_bh(&sk->sk_slock)
WARN_ON(sock_owned_by_user(child));
...
sock_orphan(child); // write_lock_bh(&sk->sk_callback_lock)
lockdep is not happy with this, as reported by Tetsuo Handa
It seems only way to deal with this is to use read_lock_bh(callbacklock)
everywhere.
Thanks to Jarek for pointing a bug in my first attempt and suggesting
this solution.
Reported-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Tested-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
CC: Jarek Poplawski <jarkao2@gmail.com>
Tested-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2010-09-24 22:26:10 -07:00
..
af_rds.c
net: sk_sleep() helper
2010-04-20 16:37:13 -07:00
bind.c
RDS: Add a debug message suggesting to load transport modules
2009-08-23 19:13:14 -07:00
cong.c
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
2010-04-11 14:53:53 -07:00
connection.c
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
2010-03-30 22:02:32 +09:00
ib.c
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
2010-03-30 22:02:32 +09:00
ib.h
RDS/IB+IW: Move recv processing to a tasklet
2009-10-30 15:06:39 -07:00
ib_cm.c
net/rds: Add missing mutex_unlock
2010-05-29 00:18:48 -07:00
ib_rdma.c
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
2010-04-11 14:53:53 -07:00
ib_recv.c
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
2010-04-11 14:53:53 -07:00
ib_ring.c
RDS/IW+IB: Set recv ring low water mark to 1/2 full.
2009-04-09 17:21:14 -07:00
ib_send.c
RDS: Properly unmap when getting a remote access error
2010-03-16 21:17:00 -07:00
ib_stats.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/percpu
2009-09-15 09:39:44 -07:00
ib_sysctl.c
sysctl: Drop & in front of every proc_handler.
2009-11-18 08:37:40 -08:00
info.c
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
2010-03-30 22:02:32 +09:00
info.h
iw.c
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
2010-03-30 22:02:32 +09:00
iw.h
RDS/IB+IW: Move recv processing to a tasklet
2009-10-30 15:06:39 -07:00
iw_cm.c
net/rds: Add missing mutex_unlock
2010-05-29 00:18:48 -07:00
iw_rdma.c
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
2010-03-30 22:02:32 +09:00
iw_recv.c
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
2010-04-11 14:53:53 -07:00
iw_ring.c
RDS/IW+IB: Set recv ring low water mark to 1/2 full.
2009-04-09 17:21:14 -07:00
iw_send.c
RDS: Do not BUG() on error returned from ib_post_send
2010-03-16 21:16:53 -07:00
iw_stats.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/percpu
2009-09-15 09:39:44 -07:00
iw_sysctl.c
sysctl: Drop & in front of every proc_handler.
2009-11-18 08:37:40 -08:00
Kconfig
RDS: Modularize RDMA and TCP transports
2009-08-23 19:13:09 -07:00
loop.c
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
2010-04-11 14:53:53 -07:00
loop.h
Makefile
RDS: Modularize RDMA and TCP transports
2009-08-23 19:13:09 -07:00
message.c
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
2010-03-30 22:02:32 +09:00
page.c
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
2010-03-30 22:02:32 +09:00
rdma.c
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
2010-04-11 14:53:53 -07:00
rdma.h
RDS: Add GET_MR_FOR_DEST sockopt
2009-10-30 15:06:37 -07:00
rdma_transport.c
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
2010-04-27 12:49:13 -07:00
rdma_transport.h
rds.h
net: sk_sleep() helper
2010-04-20 16:37:13 -07:00
recv.c
rds: fix a leak of kernel memory
2010-08-18 23:40:03 -07:00
send.c
net: sk_sleep() helper
2010-04-20 16:37:13 -07:00
stats.c
RDS: Export symbols from core RDS
2009-08-23 19:13:07 -07:00
sysctl.c
sysctl: Drop & in front of every proc_handler.
2009-11-18 08:37:40 -08:00
tcp.c
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
2010-03-30 22:02:32 +09:00
tcp.h
RDS: Add TCP transport to RDS
2009-08-23 19:13:02 -07:00
tcp_connect.c
net: fix a lockdep splat
2010-09-24 22:26:10 -07:00
tcp_listen.c
net: fix a lockdep splat
2010-09-24 22:26:10 -07:00
tcp_recv.c
net: fix a lockdep splat
2010-09-24 22:26:10 -07:00
tcp_send.c
net: fix a lockdep splat
2010-09-24 22:26:10 -07:00
tcp_stats.c
RDS: Add TCP transport to RDS
2009-08-23 19:13:02 -07:00
threads.c
RDS: Enable per-cpu workqueue threads
2010-03-16 21:17:02 -07:00
transport.c
RDS: Track transports via an array, not a list
2009-08-23 19:13:12 -07:00