net: rcu warnings in ip6fl_get_first
Subsystems (4)
Hi guys,
I got the following while fuzzing with trinity inside a KVM tools guest:
[ 51.680236] ===============================
[ 51.681914] [ INFO: suspicious RCU usage. ]
[ 51.683610] 3.8.0-rc6-next-20130206-sasha-00028-g83214f7-dirty #276 Tainted: G W
[ 51.686703] -------------------------------
[ 51.688281] net/ipv6/ip6_flowlabel.c:671 suspicious rcu_dereference_check() usage!
[ 51.691345]
[ 51.691345] other info that might help us debug this:
[ 51.691345]
[ 51.694479]
[ 51.694479] rcu_scheduler_active = 1, debug_locks = 1
[ 51.697650] 2 locks held by trinity/7421:
[ 51.701271] #0: (&p->lock){+.+.+.}, at: [<ffffffff812b049a>] seq_read+0x3a/0x3d0
[ 51.704292] #1: (rcu_read_lock_bh){.+....}, at: [<ffffffff8397cde0>] ip6fl_seq_start+0x0/0xe0
[ 51.707845]
[ 51.707845] stack backtrace:
[ 51.709678] Pid: 7421, comm: trinity Tainted: G W 3.8.0-rc6-next-20130206-sasha-00028-g83214f7-dirty #276
[ 51.713495] Call Trace:
[ 51.714370] [<ffffffff81181fdb>] lockdep_rcu_suspicious+0x10b/0x120
[ 51.716560] [<ffffffff8397caca>] ip6fl_get_first+0x8a/0x140
[ 51.718755] [<ffffffff8397cdb7>] ip6fl_seq_next+0x17/0x40
[ 51.720963] [<ffffffff812b0711>] seq_read+0x2b1/0x3d0
[ 51.723056] [<ffffffff812b0460>] ? seq_lseek+0x110/0x110
[ 51.725238] [<ffffffff812f9c0c>] proc_reg_read+0x9c/0xd0
[ 51.727266] [<ffffffff812f9b70>] ? proc_reg_write+0xd0/0xd0
[ 51.729337] [<ffffffff8128b2eb>] do_loop_readv_writev+0x4b/0x90
[ 51.731846] [<ffffffff8128b566>] do_readv_writev+0xf6/0x1d0
[ 51.734092] [<ffffffff8128b6de>] vfs_readv+0x3e/0x60
[ 51.736015] [<ffffffff8128b750>] sys_readv+0x50/0xd0
[ 51.737930] [<ffffffff83d73d98>] tracesys+0xe1/0xe6This is the result of commit "ipv6 flowlabel: Convert hash list to RCU." which mixes between regular and _bh() locking.
Thanks,
Sasha
["Followup-To:" header set to gmane.linux.network.]
Quoted 40 lines · Sasha Levin
Hi guys,
I got the following while fuzzing with trinity inside a KVM tools guest:
[ 51.680236] =============================== [ 51.681914] [ INFO: suspicious RCU usage. ] [ 51.683610] 3.8.0-rc6-next-20130206-sasha-00028-g83214f7-dirty #276 Tainted: G W [ 51.686703] ------------------------------- [ 51.688281] net/ipv6/ip6_flowlabel.c:671 suspicious rcu_dereference_check() usage! [ 51.691345] [ 51.691345] other info that might help us debug this: [ 51.691345] [ 51.694479] [ 51.694479] rcu_scheduler_active = 1, debug_locks = 1 [ 51.697650] 2 locks held by trinity/7421: [ 51.701271] #0: (&p->lock){+.+.+.}, at: [<ffffffff812b049a>] seq_read+0x3a/0x3d0 [ 51.704292] #1: (rcu_read_lock_bh){.+....}, at: [<ffffffff8397cde0>] ip6fl_seq_start+0x0/0xe0 [ 51.707845] [ 51.707845] stack backtrace: [ 51.709678] Pid: 7421, comm: trinity Tainted: G W 3.8.0-rc6-next-20130206-sasha-00028-g83214f7-dirty #276 [ 51.713495] Call Trace: [ 51.714370] [<ffffffff81181fdb>] lockdep_rcu_suspicious+0x10b/0x120 [ 51.716560] [<ffffffff8397caca>] ip6fl_get_first+0x8a/0x140 [ 51.718755] [<ffffffff8397cdb7>] ip6fl_seq_next+0x17/0x40 [ 51.720963] [<ffffffff812b0711>] seq_read+0x2b1/0x3d0 [ 51.723056] [<ffffffff812b0460>] ? seq_lseek+0x110/0x110 [ 51.725238] [<ffffffff812f9c0c>] proc_reg_read+0x9c/0xd0 [ 51.727266] [<ffffffff812f9b70>] ? proc_reg_write+0xd0/0xd0 [ 51.729337] [<ffffffff8128b2eb>] do_loop_readv_writev+0x4b/0x90 [ 51.731846] [<ffffffff8128b566>] do_readv_writev+0xf6/0x1d0 [ 51.734092] [<ffffffff8128b6de>] vfs_readv+0x3e/0x60 [ 51.736015] [<ffffffff8128b750>] sys_readv+0x50/0xd0 [ 51.737930] [<ffffffff83d73d98>] tracesys+0xe1/0xe6This is the result of commit "ipv6 flowlabel: Convert hash list to RCU." which mixes between regular and
_bh()locking.Thanks,
Sasha
Quoted 10 lines · Sasha Levin
Hi guys,
I got the following while fuzzing with trinity inside a KVM tools guest:
[ 51.680236] =============================== [ 51.681914] [ INFO: suspicious RCU usage. ] [ 51.683610] 3.8.0-rc6-next-20130206-sasha-00028-g83214f7-dirty #276 Tainted: G W [ 51.686703] ------------------------------- [ 51.688281] net/ipv6/ip6_flowlabel.c:671 suspicious rcu_dereference_check() usage! [ 51.691345]
It should use rcu_dereference_bh()...
net/ipv6/ip6_flowlabel.c +4 -4
@@ -65,13 +65,13 @@ static DEFINE_SPINLOCK(ip6_fl_lock);static DEFINE_SPINLOCK (ip6_sk_fl_lock);#define for_each_fl_rcu (hash, fl) \ - for (fl = rcu_dereference(fl_ht[(hash)]); \ + for (fl = rcu_dereference_bh(fl_ht[(hash)]); \ fl != NULL; \ - fl = rcu_dereference(fl->next)) + fl = rcu_dereference_hb(fl->next))#define for_each_fl_continue_rcu (fl) \ - for (fl = rcu_dereference(fl->next); \ + for (fl = rcu_dereference_bh(fl->next); \ fl != NULL; \ - fl = rcu_dereference(fl->next)) + fl = rcu_dereference_bh(fl->next))#define for_each_sk_fl_rcu (np, sfl) \ for (sfl = rcu_dereference_bh(np->ipv6_fl_list); \
Quoted 26 lines · Cong Wang
Quoted 10 lines · Sasha Levin
Hi guys,
I got the following while fuzzing with trinity inside a KVM tools guest:
[ 51.680236] =============================== [ 51.681914] [ INFO: suspicious RCU usage. ] [ 51.683610] 3.8.0-rc6-next-20130206-sasha-00028-g83214f7-dirty #276 Tainted: G W [ 51.686703] ------------------------------- [ 51.688281] net/ipv6/ip6_flowlabel.c:671 suspicious rcu_dereference_check() usage! [ 51.691345]It should use
rcu_dereference_bh()...net/ipv6/ip6_flowlabel.c +1
-2@@ -65,13 +65,13 @@ static DEFINE_SPINLOCK(ip6_fl_lock);static DEFINE_SPINLOCK (ip6_sk_fl_lock);#define for_each_fl_rcu (hash, fl) \ - for (fl = rcu_dereference(fl_ht[(hash)]); \ + for (fl = rcu_dereference_bh(fl_ht[(hash)]); \ fl != NULL; \ - fl = rcu_dereference(fl->next))
net/ipv6/ip6_flowlabel.c static DEFINE_SPINLOCK(ip6_fl_lock); · line 77
Quoted 10 lines
net/ipv6/ip6_flowlabel.c +3
-2+ fl = rcu_dereference_hb(fl->next))#define for_each_fl_continue_rcu (fl) \ - for (fl = rcu_dereference(fl->next); \ + for (fl = rcu_dereference_bh(fl->next); \ fl != NULL; \ - fl = rcu_dereference(fl->next)) + fl = rcu_dereference_bh(fl->next))#define for_each_sk_fl_rcu (np, sfl) \ for (sfl = rcu_dereference_bh(np->ipv6_fl_list); \
Yup, that's how I fixed it locally and it was running without warnings for couple of hours now.
Thanks,
Sasha
Quoted 19 lines · Cong Wang
Quoted 10 lines · Sasha Levin
Hi guys,
I got the following while fuzzing with trinity inside a KVM tools guest:
[ 51.680236] =============================== [ 51.681914] [ INFO: suspicious RCU usage. ] [ 51.683610] 3.8.0-rc6-next-20130206-sasha-00028-g83214f7-dirty #276 Tainted: G W [ 51.686703] ------------------------------- [ 51.688281] net/ipv6/ip6_flowlabel.c:671 suspicious rcu_dereference_check() usage! [ 51.691345]It should use
rcu_dereference_bh()...net/ipv6/ip6_flowlabel.c +0
-0
net/ipv6/ip6_flowlabel.c static DEFINE_SPINLOCK(ip6_fl_lock); · line 70
Quoted 8 lines
net/ipv6/ip6_flowlabel.c +2
-2@@ -65,13 +65,13 @@ static DEFINE_SPINLOCK(ip6_fl_lock);static DEFINE_SPINLOCK (ip6_sk_fl_lock);#define for_each_fl_rcu (hash, fl) \ - for (fl = rcu_dereference(fl_ht[(hash)]); \ + for (fl = rcu_dereference_bh(fl_ht[(hash)]); \ fl != NULL; \ - fl = rcu_dereference(fl->next)) + fl = rcu_dereference_hb(fl->next))
Small but important typo in the preceding line, should be:
+ fl = rcu_dereference_bh(fl->next))
Thanx, Paul
Quoted 16 lines
net/ipv6/ip6_flowlabel.c +2
-3#define for_each_fl_continue_rcu (fl) \ - for (fl = rcu_dereference(fl->next); \ + for (fl = rcu_dereference_bh(fl->next); \ fl != NULL; \ - fl = rcu_dereference(fl->next)) + fl = rcu_dereference_bh(fl->next))#define for_each_sk_fl_rcu (np, sfl) \ for (sfl = rcu_dereference_bh(np->ipv6_fl_list); \ --To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/