]> git.baikalelectronics.ru Git - kernel.git/commit
genetlink: fix netns vs. netlink table locking
authorJohannes Berg <johannes@sipsolutions.net>
Sat, 12 Sep 2009 03:03:15 +0000 (03:03 +0000)
committerDavid S. Miller <davem@davemloft.net>
Tue, 15 Sep 2009 00:02:50 +0000 (17:02 -0700)
commit9e0b63b53204dab487e4a3aff44fb21937277653
treecee39b3249c36aba4b765cae6d9d3579c9f10a2d
parentc950b134a09d259be9f3c9d26c227093893edc06
genetlink: fix netns vs. netlink table locking

Since my commits introducing netns awareness into
genetlink we can get this problem:

BUG: scheduling while atomic: modprobe/1178/0x00000002
2 locks held by modprobe/1178:
 #0:  (genl_mutex){+.+.+.}, at: [<ffffffff8135ee1a>] genl_register_mc_grou
 #1:  (rcu_read_lock){.+.+..}, at: [<ffffffff8135eeb5>] genl_register_mc_g
Pid: 1178, comm: modprobe Not tainted 2.6.31-rc8-wl-34789-g95cb731-dirty #
Call Trace:
 [<ffffffff8103e285>] __schedule_bug+0x85/0x90
 [<ffffffff81403138>] schedule+0x108/0x588
 [<ffffffff8135b131>] netlink_table_grab+0xa1/0xf0
 [<ffffffff8135c3a7>] netlink_change_ngroups+0x47/0x100
 [<ffffffff8135ef0f>] genl_register_mc_group+0x12f/0x290

because I overlooked that netlink_table_grab() will
schedule, thinking it was just the rwlock. However,
in the contention case, that isn't actually true.

Fix this by letting the code grab the netlink table
lock first and then the RCU for netns protection.

Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/netlink.h
net/netlink/af_netlink.c
net/netlink/genetlink.c