From c1e23b1aac00ec49ee3fceb1ad154be15fedd4d7 Mon Sep 17 00:00:00 2001 From: Sangjin Han Date: Tue, 25 Aug 2020 21:47:13 -0700 Subject: [PATCH] Do not leave PMD interface "stopped" If updating MTU or MAC address fails, the interface ends up remaining in "stopped" mode in the current code. Instead we must call `rte_eth_dev_start()` before returning to recover from failure. --- core/drivers/pmd.cc | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/core/drivers/pmd.cc b/core/drivers/pmd.cc index a516a82d8..fd4a7b057 100644 --- a/core/drivers/pmd.cc +++ b/core/drivers/pmd.cc @@ -343,19 +343,22 @@ CommandResponse PMDPort::Init(const bess::pb::PMDPortArg &arg) { } CommandResponse PMDPort::UpdateConf(const Conf &conf) { - rte_eth_dev_stop(dpdk_port_id_); + CommandResponse resp = CommandSuccess(); + rte_eth_dev_stop(dpdk_port_id_); // need to restart before return if (conf_.mtu != conf.mtu && conf.mtu != 0) { if (conf.mtu > SNBUF_DATA || conf.mtu < RTE_ETHER_MIN_MTU) { - return CommandFailure(EINVAL, "mtu should be >= %d and <= %d", + resp = CommandFailure(EINVAL, "mtu should be >= %d and <= %d", RTE_ETHER_MIN_MTU, SNBUF_DATA); + goto restart; } int ret = rte_eth_dev_set_mtu(dpdk_port_id_, conf.mtu); if (ret == 0) { conf_.mtu = conf.mtu; } else { - return CommandFailure(-ret, "rte_eth_dev_set_mtu() failed"); + resp = CommandFailure(-ret, "rte_eth_dev_set_mtu() failed"); + goto restart; } } @@ -367,10 +370,12 @@ CommandResponse PMDPort::UpdateConf(const Conf &conf) { if (ret == 0) { conf_.mac_addr = conf.mac_addr; } else { - return CommandFailure(-ret, "rte_eth_dev_default_mac_addr_set() failed"); + resp = CommandFailure(-ret, "rte_eth_dev_default_mac_addr_set() failed"); + goto restart; } } +restart: if (conf.admin_up) { int ret = rte_eth_dev_start(dpdk_port_id_); if (ret == 0) { @@ -380,7 +385,7 @@ CommandResponse PMDPort::UpdateConf(const Conf &conf) { } } - return CommandSuccess(); + return resp; } void PMDPort::DeInit() {