[ovs-dev] [PATCH v9 13/15] dpif-netdev: Handle errors in reconfigure_pmd_threads().

Daniele Di Proietto diproiettod at vmware.com
Sat Apr 23 01:03:05 UTC 2016


Errors returned by netdev_set_multiq() and netdev_rxq_open() weren't
handled properly in reconfigure_pmd_threads().  In case of error now we
remove the port from the datapath.

Also, part of the code is moved in a new function, port_reconfigure().

Signed-off-by: Daniele Di Proietto <diproiettod at vmware.com>
---
 lib/dpif-netdev.c | 78 ++++++++++++++++++++++++++++++++++---------------------
 1 file changed, 48 insertions(+), 30 deletions(-)

diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
index e5a0433..7531c2f 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -2607,44 +2607,62 @@ dp_netdev_process_rxq_port(struct dp_netdev_pmd_thread *pmd,
     }
 }
 
+static int
+port_reconfigure(struct dp_netdev_port *port)
+{
+    struct netdev *netdev = port->netdev;
+    int requested_n_rxq = netdev_requested_n_rxq(netdev);
+    int i, err;
+
+    if (!netdev_is_pmd(port->netdev)
+        || port->latest_requested_n_rxq != requested_n_rxq) {
+        return 0;
+    }
+
+    /* Closes the existing 'rxq's. */
+    for (i = 0; i < port->n_rxq; i++) {
+        netdev_rxq_close(port->rxq[i]);
+        port->rxq[i] = NULL;
+    }
+    port->n_rxq = 0;
+
+    /* Sets the new rx queue config. */
+    err = netdev_set_multiq(port->netdev, ovs_numa_get_n_cores() + 1,
+                            requested_n_rxq);
+    if (err && (err != EOPNOTSUPP)) {
+        VLOG_ERR("Failed to set dpdk interface %s rx_queue to: %u",
+                 netdev_get_name(port->netdev), requested_n_rxq);
+        return err;
+    }
+    /* If the set_multiq() above succeeds, reopens the 'rxq's. */
+    port->rxq = xrealloc(port->rxq, sizeof *port->rxq * netdev_n_rxq(netdev));
+    for (i = 0; i < netdev_n_rxq(netdev); i++) {
+        err = netdev_rxq_open(netdev, &port->rxq[i], i);
+        if (err) {
+            return err;
+        }
+        port->n_rxq++;
+    }
+
+    return 0;
+}
+
 static void
 reconfigure_pmd_threads(struct dp_netdev *dp)
     OVS_REQUIRES(dp->port_mutex)
 {
-    struct dp_netdev_port *port;
+    struct dp_netdev_port *port, *next;
 
     dp_netdev_destroy_all_pmds(dp);
 
-    HMAP_FOR_EACH (port, node, &dp->ports) {
-        struct netdev *netdev = port->netdev;
-        int requested_n_rxq = netdev_requested_n_rxq(netdev);
-        if (netdev_is_pmd(port->netdev)
-            && port->latest_requested_n_rxq != requested_n_rxq) {
-            int i, err;
+    HMAP_FOR_EACH_SAFE (port, next, node, &dp->ports) {
+        int err;
 
-            /* Closes the existing 'rxq's. */
-            for (i = 0; i < port->n_rxq; i++) {
-                netdev_rxq_close(port->rxq[i]);
-                port->rxq[i] = NULL;
-            }
-            port->n_rxq = 0;
-
-            /* Sets the new rx queue config. */
-            err = netdev_set_multiq(port->netdev, ovs_numa_get_n_cores() + 1,
-                                    requested_n_rxq);
-            if (err && (err != EOPNOTSUPP)) {
-                VLOG_ERR("Failed to set dpdk interface %s rx_queue to: %u",
-                         netdev_get_name(port->netdev),
-                         requested_n_rxq);
-                return;
-            }
-            port->latest_requested_n_rxq = requested_n_rxq;
-            /* If the set_multiq() above succeeds, reopens the 'rxq's. */
-            port->n_rxq = netdev_n_rxq(port->netdev);
-            port->rxq = xrealloc(port->rxq, sizeof *port->rxq * port->n_rxq);
-            for (i = 0; i < port->n_rxq; i++) {
-                netdev_rxq_open(port->netdev, &port->rxq[i], i);
-            }
+        err = port_reconfigure(port);
+        if (err) {
+            hmap_remove(&dp->ports, &port->node);
+            seq_change(dp->port_seq);
+            port_destroy(port);
         }
     }
     /* Reconfigures the cpu mask. */
-- 
2.1.4




More information about the dev mailing list