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 <diproiet...@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 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev