[ovs-dev] [PATCH] datapath: STT: Fix nf-hook softlockup.

Pravin B Shelar pshelar at nicira.com
Thu Jan 14 00:07:16 UTC 2016


nf-hook is not unregistered on STT device delete, But when
second time it was created it nf-hook is again registered.
which causes following softlockup.
Following patch fixes it by registering nf-hook only on very
first stt device.

---8<---
BUG: soft lockup - CPU#1 stuck for 22s! [ovs-vswitchd:11293]
RIP: 0010:[<ffffffffa0e48308>]  [<ffffffffa0e48308>] nf_ip_hook+0xf8/0x180 [openvswitch]
Stack:
 <IRQ>
 [<ffffffff8163bf60>] ? ip_rcv_finish+0x350/0x350
 [<ffffffff8163572a>] nf_iterate+0x9a/0xb0
 [<ffffffff8163bf60>] ? ip_rcv_finish+0x350/0x350
 [<ffffffff816357bc>] nf_hook_slow+0x7c/0x120
 [<ffffffff8163bf60>] ? ip_rcv_finish+0x350/0x350
 [<ffffffff8163c343>] ip_local_deliver+0x73/0x80
 [<ffffffff8163bc8d>] ip_rcv_finish+0x7d/0x350
 [<ffffffff8163c5e8>] ip_rcv+0x298/0x3d0
 [<ffffffff81605f26>] __netif_receive_skb_core+0x696/0x880
 [<ffffffff81606128>] __netif_receive_skb+0x18/0x60
 [<ffffffff81606cce>] process_backlog+0xae/0x180
 [<ffffffff81606512>] net_rx_action+0x152/0x270
 [<ffffffff8106accc>] __do_softirq+0xec/0x300
 [<ffffffff81710a1c>] do_softirq_own_stack+0x1c/0x30

Fixes: fee43fa2 ("datapath: Fix deadlock on STT device destroy.")
Reported-by: Joe Stringer <joe at ovn.org>
Signed-off-by: Pravin B Shelar <pshelar at nicira.com>
---
 datapath/linux/compat/stt.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/datapath/linux/compat/stt.c b/datapath/linux/compat/stt.c
index 98d6d5b..fc5ecc2 100644
--- a/datapath/linux/compat/stt.c
+++ b/datapath/linux/compat/stt.c
@@ -1548,6 +1548,11 @@ static int stt_start(struct net *net)
 		sn->n_tunnels++;
 		return 0;
 	}
+
+	/* Register STT only on very first STT device addition. */
+	if (!list_empty(&nf_hook_ops.list))
+		goto out;
+
 #ifdef HAVE_NF_REGISTER_NET_HOOK
 	/* On kernel which support per net nf-hook, nf_register_hook() takes
 	 * rtnl-lock, which results in dead lock in stt-dev-create. Therefore
@@ -1559,6 +1564,7 @@ static int stt_start(struct net *net)
 #endif
 	if (err)
 		goto dec_n_tunnel;
+out:
 	sn->n_tunnels++;
 	return 0;
 
-- 
1.8.3.1




More information about the dev mailing list