datapath: stt: Do not access stt_dev socket in lookup.
authorPravin B Shelar <pshelar@nicira.com>
Sun, 20 Dec 2015 03:19:22 +0000 (19:19 -0800)
committerPravin B Shelar <pshelar@nicira.com>
Sun, 20 Dec 2015 21:20:15 +0000 (13:20 -0800)
STT device is added to the device list at device create time. and
the dev socket is initialized when dev is UP. So avoid accessing
stt socket while searching a device.

---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>
 [<ffffffff9064050a>] nf_iterate+0x9a/0xb0
 [<ffffffff9064059c>] nf_hook_slow+0x7c/0x120
 [<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>
Tested-by: Joe Stringer <joe@ovn.org>
datapath/linux/compat/stt.c

index dcd70ff..1500a76 100644 (file)
@@ -173,7 +173,7 @@ static struct stt_dev *stt_find_sock(struct net *net, __be16 port)
        struct stt_dev *stt_dev;
 
        list_for_each_entry_rcu(stt_dev, &sn->stt_list, next) {
-               if (inet_sk(stt_dev->sock->sk)->inet_sport == port)
+               if (stt_dev->dst_port == port)
                        return stt_dev;
        }
        return NULL;
@@ -934,7 +934,7 @@ netdev_tx_t ovs_stt_xmit(struct sk_buff *skb)
        struct net_device *dev = skb->dev;
        struct stt_dev *stt_dev = netdev_priv(dev);
        struct net *net = stt_dev->net;
-       __be16 dport = inet_sk(stt_dev->sock->sk)->inet_sport;
+       __be16 dport = stt_dev->dst_port;
        struct ip_tunnel_key *tun_key;
        struct ip_tunnel_info *tun_info;
        struct rtable *rt;