summaryrefslogtreecommitdiff
path: root/datapath
diff options
context:
space:
mode:
authorPravin B Shelar <pshelar@nicira.com>2015-12-17 13:56:39 -0800
committerPravin B Shelar <pshelar@nicira.com>2015-12-17 15:33:10 -0800
commit8ab1170b06ddf33dfb06b0346d21f2e4380d8eea (patch)
tree0cbb7aaf402d65e95097288fdeb830954bf7d577 /datapath
parente7b438dc3014c42aa5a0b4436ec4a67790f06d39 (diff)
downloadopenvswitch-8ab1170b06ddf33dfb06b0346d21f2e4380d8eea.tar.gz
datapath: stt: Use RCU API to update stt-dev list.
Following crash was reported for STT tunnel. I am not able to reproduce it, But the usage of wrong list manipulation API is likely culprit. ---8<--- IP: [<ffffffffc0e731fd>] nf_ip_hook+0xfd/0x180 [openvswitch] Oops: 0000 [#1] PREEMPT SMP Hardware name: VMware, Inc. VMware Virtual Platform/440BX RIP: 0010:[<ffffffffc0e731fd>] [<ffffffffc0e731fd>] nf_ip_hook+0xfd/0x180 [openvswitch] RSP: 0018:ffff88043fd03cd0 EFLAGS: 00010206 RAX: 0000000000000000 RBX: ffff8801008e2200 RCX: 0000000000000034 RDX: 0000000000000110 RSI: ffff8801008e2200 RDI: ffff8801533a3880 RBP: ffff88043fd03d00 R08: ffffffff90646d10 R09: ffff880164b27000 R10: 0000000000000003 R11: ffff880155eb9dd8 R12: 0000000000000028 R13: ffff8802283dc580 R14: 00000000000076b4 R15: ffff880013b20000 FS: 00007ff5ba73b700(0000) GS:ffff88043fd00000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000000000000020 CR3: 000000037ff96000 CR4: 00000000000007e0 Stack: ffff8801533a3890 ffff88043fd03d80 ffffffff90646d10 0000000000000000 ffff880164b27000 ffff8801008e2200 ffff88043fd03d48 ffffffff9064050a ffffffff90d0f930 ffffffffc0e7ef80 0000000000000001 ffff8801008e2200 Call Trace: <IRQ> [<ffffffff90646d10>] ? ip_rcv_finish+0x350/0x350 [<ffffffff9064050a>] nf_iterate+0x9a/0xb0 [<ffffffff90646d10>] ? ip_rcv_finish+0x350/0x350 [<ffffffff9064059c>] nf_hook_slow+0x7c/0x120 [<ffffffff90646d10>] ? ip_rcv_finish+0x350/0x350 [<ffffffff906470f3>] ip_local_deliver+0x73/0x80 [<ffffffff90646a3d>] ip_rcv_finish+0x7d/0x350 [<ffffffff90647398>] ip_rcv+0x298/0x3d0 [<ffffffff9060fc56>] __netif_receive_skb_core+0x696/0x880 [<ffffffff9060fe58>] __netif_receive_skb+0x18/0x60 [<ffffffff90610b3e>] process_backlog+0xae/0x180 [<ffffffff906102c2>] net_rx_action+0x152/0x270 [<ffffffff9006d625>] __do_softirq+0xf5/0x320 [<ffffffff9071d15c>] do_softirq_own_stack+0x1c/0x30 Reported-by: Joe Stringer <joe@ovn.org> Signed-off-by: Pravin B Shelar <pshelar@nicira.com> Acked-by: Jesse Gross <jesse@kernel.org>
Diffstat (limited to 'datapath')
-rw-r--r--datapath/linux/compat/stt.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/datapath/linux/compat/stt.c b/datapath/linux/compat/stt.c
index 80649802f..dcd70ffc9 100644
--- a/datapath/linux/compat/stt.c
+++ b/datapath/linux/compat/stt.c
@@ -1770,7 +1770,7 @@ static int stt_configure(struct net *net, struct net_device *dev,
if (err)
return err;
- list_add(&stt->next, &sn->stt_list);
+ list_add_rcu(&stt->next, &sn->stt_list);
return 0;
}
@@ -1789,7 +1789,7 @@ static void stt_dellink(struct net_device *dev, struct list_head *head)
{
struct stt_dev *stt = netdev_priv(dev);
- list_del(&stt->next);
+ list_del_rcu(&stt->next);
unregister_netdevice_queue(dev, head);
}