Skip to contentSkip to conversation

net: rcu warnings in ip6fl_get_first

DISCUSSION Sasha Levin 4 participants 5 messages Feb 7, 2013 – Feb 8, 2013

Subsystems (4)
lore
Share & tools
lore
#0 lore raw

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/0xe6

This is the result of commit "ipv6 flowlabel: Convert hash list to RCU." which mixes between regular and _bh() locking.

Thanks,
Sasha

#1 lore raw

["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/0xe6

This is the result of commit "ipv6 flowlabel: Convert hash list to RCU." which mixes between regular and _bh() locking.

Thanks,
Sasha

#2 lore raw
In reply to Sasha Levin
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
index ea42bf4..c50080f 100644
@@ -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);	\
#3 lore raw
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
index ea42bf4..c50080f 100644
@@ -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

#4 lore raw
In reply to Cong Wang
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
index ea42bf4..c50080f 100644

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/