[ovs-dev] [PATCH] netdev-dpdk: Bring link down when NETDEV_UP is not set

Eelco Chaudron echaudro at redhat.com
Wed Nov 7 08:53:09 UTC 2018


When the netdev link flags are changed, !NETDEV_UP, the DPDK ports are not
actually going down. This is causing problems for people trying to bring
down a bond member. The bond link is no longer being used to receive or
transmit traffic, however, the other end keeps sending data as the link
remains up.

With OVS 2.6 the link was brought down, and this was changed with commit
3b1fb0779. In this commit, it's explicitly mentioned that the link down/up
DPDK APIs are not called as not all PMD devices support it.

However, this patch does call the appropriate DPDK APIs and ignoring
errors due to the PMD not supporting it. PMDs not supporting this should
be fixed in DPDK upstream.

I verified this patch is working correctly using the
ovs-appctl netdev-dpdk/set-admin-state <port> {up|down} and
ovs-ofctl mod-port <bridge> <port> {up|down} commands on a XL710
and 82599ES.

Fixes: 3b1fb0779b87 ("netdev-dpdk: Don't call rte_dev_stop() in update_flags().")
Signed-off-by: Eelco Chaudron <echaudro at redhat.com>
---
 lib/netdev-dpdk.c |   16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
index 7e0a593..ee8296b 100644
--- a/lib/netdev-dpdk.c
+++ b/lib/netdev-dpdk.c
@@ -2942,10 +2942,26 @@ netdev_dpdk_update_flags__(struct netdev_dpdk *dev,
     }
 
     if (dev->type == DPDK_DEV_ETH) {
+        int err;
+
+        if (dev->flags & NETDEV_UP) {
+            err = rte_eth_dev_set_link_up(dev->port_id);
+            if (err < 0 && err != -ENOTSUP) {
+                return -err;
+            }
+        }
+
         if (dev->flags & NETDEV_PROMISC) {
             rte_eth_promiscuous_enable(dev->port_id);
         }
 
+        if (!(dev->flags & NETDEV_UP)) {
+            err = rte_eth_dev_set_link_down(dev->port_id);
+            if (err < 0 && err != -ENOTSUP) {
+                return -err;
+            }
+        }
+
         netdev_change_seq_changed(&dev->up);
     } else {
         /* If DPDK_DEV_VHOST device's NETDEV_UP flag was changed and vhost is



More information about the dev mailing list