Neelakantam,

Please submit your suggested patch to the dev list and I'll test and review it when I can find some time.  My day job is keeping me pretty busy.  I apologize for that.

- Greg


On 5/4/2018 3:20 AM, Neelakantam Gaddam wrote:
Hi Gregory,

Please find full kernel backtrace below.


------------------------------------------------------------------------------------------
BUG: spinlock recursion on CPU#1, rx-thread1/2787
 lock: 0x800000010d442508, .magic: dead4ead, .owner: rx-thread1/2787, .owner_cpu: 1
CPU: 1 PID: 2787 Comm: rxthread1 Tainted: G           O 3.10.87-rt80- #1
Stack : ffffffff82120000 000000001400dce1 0000000004208040 80000000bd85cf18           0000000000000000 0000000000000000 ffffffff82120000 ffffffff80ea5640           0000000000000004 0000000000000000 0000000000000654 202020204f20332e           0000000000000003 ffffffff82110208 ffffffff82120000 0000000000000000           800000010d442508 800000010d442400 80000001061b8800 000000000000000e           800000010641d200 ffffffffc0a80101 0000000000000001 0000000000000001           0000000000000003 0000000000000001 0000000000000000 ffffffff80cdad4c           800000010632c000 800000010632f220 0000000000000000 ffffffff80ad1628           800000010619f120 ffffffff80e16710 0000000000000001 0000000000000ae3           0000000000000000 ffffffff80864cd4 0000000000000000 0000000000000000
          ...
Call Trace:
[<ffffffff80864cd4>] show_stack+0x6c/0xf8
[<ffffffff80ad1628>] do_raw_spin_lock+0x168/0x170
[<ffffffff80bf7b1c>] dev_queue_xmit+0x43c/0x470
[<ffffffff80c32c08>] ip_finish_output+0x250/0x490
[<ffffffffc0115664>] rpl_iptunnel_xmit+0x134/0x218 [openvswitch]
[<ffffffffc0120f28>] rpl_vxlan_xmit+0x430/0x538 [openvswitch]
[<ffffffffc00f9de0>] do_execute_actions+0x18f8/0x19e8 [openvswitch]
[<ffffffffc00fa2b0>] ovs_execute_actions+0x90/0x208 [openvswitch]
[<ffffffffc0101860>] ovs_dp_process_packet+0xb0/0x1a8 [openvswitch]
[<ffffffffc010c5d8>] ovs_vport_receive+0x78/0x130 [openvswitch]
[<ffffffffc010ce6c>] internal_dev_xmit+0x34/0x98 [openvswitch]
[<ffffffff80bf74d0>] dev_hard_start_xmit+0x2e8/0x4f8
[<ffffffff80c10e48>] sch_direct_xmit+0xf0/0x238
[<ffffffff80bf78b8>] dev_queue_xmit+0x1d8/0x470
[<ffffffff80c5ffe4>] arp_process+0x614/0x628
[<ffffffff80bf0cb0>] __netif_receive_skb_core+0x2e8/0x5d8
[<ffffffff80bf4770>] process_backlog+0xc0/0x1b0
[<ffffffff80bf501c>] net_rx_action+0x154/0x240
[<ffffffff8088d130>] __do_softirq+0x1d0/0x218
[<ffffffff8088d240>] do_softirq+0x68/0x70
[<ffffffff8088d3a0>] local_bh_enable+0xa8/0xb0
[<ffffffff80bf5c88>] netif_rx_ni+0x20/0x30
[<ffffffffc0019ba4>] rx_work_handler+0x634/0x1078 [rx_ethernet]
[<ffffffff808a8e8c>] kthread+0xac/0xb8
[<ffffffff8085ffd0>] ret_from_kernel_thread+0x14/0x1c

BUG: spinlock lockup suspected on CPU#2, rx-thread2/2788
BUG: spinlock lockup suspected on CPU#3, handler406/6296
 lock: 0x800000010d442508, .magic: dead4ead, .owner: rx-thread1/2787, .owner_cpu: 1
CPU: 3 PID: 6296 Comm: handler406 Tainted: G           O 3.10.87-rt80- #1
Stack : ffffffff80f10000 000000001400dce1 0000000000404140 0000000000002bf0           0000000000000000 0000000000000000 ffffffff82120000 1b6c02ad5eabfa7f           0000001b6c02ad5e 643a204720202020 202020202020204f 20332e31302e3837           0000000000000006 ffffffff82110da0 ffffffff82120000 0000000000000000           800000010d442508 0000000000010000 0000000059682f00 0000000059682f00           800000010641d200 ffffffffc0a80101 0000000000000001 0000000000000001           0000000000000006 0000000000000001 000000ffee0e36c0 0f00000004196607           800000010d0dc000 800000010d0df410 0000000000000000 ffffffff80ad15dc           800000010c9e21f0 ffffffff80e16710 0000000000000003 0000000000001898           0000000000000000 ffffffff80864cd4 0000000000000000 0000000000000000
          ...
Call Trace:
[<ffffffff80864cd4>] show_stack+0x6c/0xf8
[<ffffffff80ad15dc>] do_raw_spin_lock+0x11c/0x170
[<ffffffff80bf7b1c>] dev_queue_xmit+0x43c/0x470
[<ffffffff80c32c08>] ip_finish_output+0x250/0x490
[<ffffffffc0115664>] rpl_iptunnel_xmit+0x134/0x218 [openvswitch]
[<ffffffffc0120f28>] rpl_vxlan_xmit+0x430/0x538 [openvswitch]
[<ffffffffc00f9de0>] do_execute_actions+0x18f8/0x19e8 [openvswitch]
[<ffffffffc00fa2b0>] ovs_execute_actions+0x90/0x208 [openvswitch]
[<ffffffffc0100028>] ovs_packet_cmd_execute+0x258/0x2a8 [openvswitch]
[<ffffffff80c16b5c>] genl_family_rcv_msg+0x32c/0x368
[<ffffffff80c16c2c>] genl_rcv_msg+0x94/0xd8
[<ffffffff80c15ca8>] netlink_rcv_skb+0x158/0x168
[<ffffffff80c15f00>] genl_rcv+0x30/0x48
[<ffffffff80c15544>] netlink_unicast+0x1ac/0x238
[<ffffffff80c15998>] netlink_sendmsg+0x300/0x368
[<ffffffff80bdba68>] sock_sendmsg+0xc0/0xf8
[<ffffffff80bdbdd4>] ___sys_sendmsg+0x2fc/0x308
[<ffffffff80bdf0c8>] __sys_sendmsg+0x48/0x98
[<ffffffff80869984>] handle_sys64+0x44/0x68
-------------------------------------------------------------------------------------------------

I have prepared the below patch to fix the issue.


--- a/openvswitch-cvm-2.8.1/datapath/linux/compat/vxlan.c
+++ b/openvswitch-cvm-2.8.1/datapath/linux/compat/vxlan.c
@@ -1114,7 +1114,8 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
                        goto tx_error;
                }
-               if (rt->dst.dev == dev) {
+               if ((rt->dst.dev == dev) ||
+                   (OVS_CB(skb)->input_vport->dev == rt->dst.dev)) {
                        netdev_dbg(dev, "circular route to %pI4\n",
 &dst->sin.sin_addr.s_addr);
                        dev->stats.collisions++;
@@ -1173,7 +1174,8 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
                        goto tx_error;
                }
-               if (ndst->dev == dev) {
+               if ((ndst->dev == dev) ||
+                   (OVS_CB(skb)->input_vport->dev == ndst->dev)) {
                        netdev_dbg(dev, "circular route to %pI6\n",
 &dst->sin6.sin6_addr);
                        dst_release(ndst);


This patch fixes the issue with the configuration given in the first mail. It fixes only the first loop in case of vxlan.
What about if there are many levels in the loop.

I would like to know, how ovs handles these loops. Please share your thoughts.





On Fri, May 4, 2018 at 1:21 AM, Gregory Rose <[email protected] <mailto:[email protected]>> wrote:

    On 5/1/2018 10:35 PM, Neelakantam Gaddam wrote:
    Hi All,

    The issue here is we are trying to send the packets on the same
    device in a loop. While sending on a device, a spinlock for the
    tx queue has to be acquired in dev_queue_xmit function. This is
    where we are trying to acquire the same lock again, which is
    leading to the kernel crash. This issue becomes worse if internal
    ports are involved in the configuration.

    I think, we should avoid these loops in the vport send functions.
    But in case of tunneling, the tunnel send function should take
    care of these checks.

    Please share your thoughts on this issue.

    Hello Neelakantam,

    Please provide the full kernel panic backtrace and I'll have a
    look at the problem.  I'm rather busy
    dealing with some other critical issues but will try to get back
    to you next week.

    Thanks,

    - Greg


    On Mon, Apr 30, 2018 at 11:17 AM, Neelakantam Gaddam
    <[email protected] <mailto:[email protected]>> wrote:

        Hi All,

        OVS misconfiguration leading to spinlock recursion in
        dev_queue_xmit.

        We are running ovs-2.8.1 with openvswitch kernel modules on
        two hosts connected back to back. We are running OVS on
        MIPS64 platform.



        We are using the below configuration.

        ovs-vsctl add-br br0

        ovs-vsctl add-bond br0 bond0 p1p1 p1p2

        ovs-vsctl set port bond0 lacp=active bond_mode=balance-tcp

        ifconfig br0 100.0.0.1 up

        ovs-vsctl add-port br0 veth0

        ovs-vsctl add-port br0 vx0 -- set interface vx0 type=vxlan
        options:local_ip=100.0.0.1 options:remote_ip=100.0.0.2
        option:key=flow

        ovs-ofctl add-flow br0 "table=0, priority=1, cookie=100,
        tun_id=100, in_port=4, action=output:3"

        ovs-ofctl add-flow br0 "table=0, priority=1, cookie=100,
        in_port=3, actions=set_field:100->tun_id output:4"

        When this configuration is applied on both hosts, we are
        seeing the below spinlock recursion bug.

        [<ffffffff80864cd4>] show_stack+0x6c/0xf8

        [<ffffffff80ad1628>] do_raw_spin_lock+0x168/0x170

        [<ffffffff80bf7b1c>] dev_queue_xmit+0x43c/0x470

        [<ffffffff80c32c08>] ip_finish_output+0x250/0x490

        [<ffffffffc0115664>] rpl_iptunnel_xmit+0x134/0x218 [openvswitch]

        [<ffffffffc0120f28>] rpl_vxlan_xmit+0x430/0x538 [openvswitch]

        [<ffffffffc00f9de0>] do_execute_actions+0x18f8/0x19e8
        [openvswitch]

        [<ffffffffc00fa2b0>] ovs_execute_actions+0x90/0x208 [openvswitch]

        [<ffffffffc0101860>] ovs_dp_process_packet+0xb0/0x1a8
        [openvswitch]

        [<ffffffffc010c5d8>] ovs_vport_receive+0x78/0x130 [openvswitch]

        [<ffffffffc010ce6c>] internal_dev_xmit+0x34/0x98 [openvswitch]

        [<ffffffff80bf74d0>] dev_hard_start_xmit+0x2e8/0x4f8

        [<ffffffff80c10e48>] sch_direct_xmit+0xf0/0x238

        [<ffffffff80bf78b8>] dev_queue_xmit+0x1d8/0x470

        [<ffffffff80c5ffe4>] arp_process+0x614/0x628

        [<ffffffff80bf0cb0>] __netif_receive_skb_core+0x2e8/0x5d8

        [<ffffffff80bf4770>] process_backlog+0xc0/0x1b0

        [<ffffffff80bf501c>] net_rx_action+0x154/0x240

        [<ffffffff8088d130>] __do_softirq+0x1d0/0x218

        [<ffffffff8088d240>] do_softirq+0x68/0x70

        [<ffffffff8088d3a0>] local_bh_enable+0xa8/0xb0

        [<ffffffff80bf5c88>] netif_rx_ni+0x20/0x30

        The packet path traced is :
        netif_rx->arp->dev_queue_xmit(internal
        port)->vxlan_xmit->dev_queue_xmit(internal port). According
        to the configuration, this packet path is valid. But we
        should not hit the crash.


        Questions:


          * Is it a kernel bug or ovs bug ?
          * How OVS handles these kind of misconfigurations
            especially packet loops involved?

        Any suggestion or help is greatly appreciated.



        Thanks



-- Thanks & Regards
        Neelakantam Gaddam




-- Thanks & Regards
    Neelakantam Gaddam


    _______________________________________________
    discuss mailing list
    [email protected] <mailto:[email protected]>
    https://mail.openvswitch.org/mailman/listinfo/ovs-discuss
    <https://mail.openvswitch.org/mailman/listinfo/ovs-discuss>




--
Thanks & Regards
Neelakantam Gaddam

_______________________________________________
discuss mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-discuss

Reply via email to