2
0
mirror of https://github.com/openvswitch/ovs synced 2025-10-15 14:17:18 +00:00

dpif-netdev: Handle errors in reconfigure_pmd_threads().

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@vmware.com>
Tested-by: Ilya Maximets <i.maximets@samsung.com>
Acked-by: Ilya Maximets <i.maximets@samsung.com>
This commit is contained in:
Daniele Di Proietto
2016-04-07 15:19:28 -07:00
parent 6e3c6fa4ad
commit dc36593cf4

View File

@@ -2617,44 +2617,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. */