mirror of
https://github.com/openvswitch/ovs
synced 2025-10-19 14:37:21 +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:
@@ -2617,21 +2617,18 @@ dp_netdev_process_rxq_port(struct dp_netdev_pmd_thread *pmd,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static int
|
||||||
reconfigure_pmd_threads(struct dp_netdev *dp)
|
port_reconfigure(struct dp_netdev_port *port)
|
||||||
OVS_REQUIRES(dp->port_mutex)
|
|
||||||
{
|
{
|
||||||
struct dp_netdev_port *port;
|
|
||||||
|
|
||||||
dp_netdev_destroy_all_pmds(dp);
|
|
||||||
|
|
||||||
HMAP_FOR_EACH (port, node, &dp->ports) {
|
|
||||||
struct netdev *netdev = port->netdev;
|
struct netdev *netdev = port->netdev;
|
||||||
int requested_n_rxq = netdev_requested_n_rxq(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;
|
int i, err;
|
||||||
|
|
||||||
|
if (!netdev_is_pmd(port->netdev)
|
||||||
|
|| port->latest_requested_n_rxq != requested_n_rxq) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Closes the existing 'rxq's. */
|
/* Closes the existing 'rxq's. */
|
||||||
for (i = 0; i < port->n_rxq; i++) {
|
for (i = 0; i < port->n_rxq; i++) {
|
||||||
netdev_rxq_close(port->rxq[i]);
|
netdev_rxq_close(port->rxq[i]);
|
||||||
@@ -2644,17 +2641,38 @@ reconfigure_pmd_threads(struct dp_netdev *dp)
|
|||||||
requested_n_rxq);
|
requested_n_rxq);
|
||||||
if (err && (err != EOPNOTSUPP)) {
|
if (err && (err != EOPNOTSUPP)) {
|
||||||
VLOG_ERR("Failed to set dpdk interface %s rx_queue to: %u",
|
VLOG_ERR("Failed to set dpdk interface %s rx_queue to: %u",
|
||||||
netdev_get_name(port->netdev),
|
netdev_get_name(port->netdev), requested_n_rxq);
|
||||||
requested_n_rxq);
|
return err;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
port->latest_requested_n_rxq = requested_n_rxq;
|
|
||||||
/* If the set_multiq() above succeeds, reopens the 'rxq's. */
|
/* 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 * netdev_n_rxq(netdev));
|
||||||
port->rxq = xrealloc(port->rxq, sizeof *port->rxq * port->n_rxq);
|
for (i = 0; i < netdev_n_rxq(netdev); i++) {
|
||||||
for (i = 0; i < port->n_rxq; i++) {
|
err = netdev_rxq_open(netdev, &port->rxq[i], i);
|
||||||
netdev_rxq_open(port->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, *next;
|
||||||
|
|
||||||
|
dp_netdev_destroy_all_pmds(dp);
|
||||||
|
|
||||||
|
HMAP_FOR_EACH_SAFE (port, next, node, &dp->ports) {
|
||||||
|
int err;
|
||||||
|
|
||||||
|
err = port_reconfigure(port);
|
||||||
|
if (err) {
|
||||||
|
hmap_remove(&dp->ports, &port->node);
|
||||||
|
seq_change(dp->port_seq);
|
||||||
|
port_destroy(port);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Reconfigures the cpu mask. */
|
/* Reconfigures the cpu mask. */
|
||||||
|
Reference in New Issue
Block a user