summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorIlya Maximets <i.maximets@samsung.com>2016-03-22 15:42:03 +0300
committerDaniele Di Proietto <diproiettod@vmware.com>2016-03-22 18:27:11 -0700
commitc62da695974476a3dd871325d01283c2960e1fd1 (patch)
treeed94126f8101271596cc8584d72d55c74597ff3f /lib
parent0a914b0637cab71e2e5fdc0865f9e582e8cfc024 (diff)
downloadopenvswitch-c62da695974476a3dd871325d01283c2960e1fd1.tar.gz
netdev-dpdk: Fix crash when changing the vhost-user port.
According to netdev-provider API: 'The "destruct" function is not allowed to fail.' netdev-dpdk breaks this restriction for vhost-user ports. This leads to SIGABRT or SIGSEGV in dpdk_watchdog thread because 'dealloc' will be called anyway indifferently to result of 'destruct'. For example, if we call # ovs-vsctl set interface vhost1 ofport_request=5 while QEMU still attached, we'll get: ------------------[cut]------------------ |dpdk|ERR|Can not remove port, vhost device still attached VHOST_CONFIG: socket created, fd:98 VHOST_CONFIG: fail to bind fd:98, remove file:/home/vhost1 and try again. |dpdk|ERR|vhost-user socket device setup failure for socket /home/vhost1 |bridge|WARN|could not open network device vhost1 (Unknown error -1) ovs-vswitchd(dpdk_watchdog1): lib/netdev-dpdk.c:532: ovs_mutex_lock_at() passed uninitialized ovs_mutex Program received signal SIGABRT, Aborted. ------------------[cut]------------------ Fix that by removing port anyway even when guest is still attached. Guest becomes an orphan in that case but OVS will not crash and will continue forwarding for other ports. VM restart required to restore connectivity. Fixes: 58397e6c1e6c ("netdev-dpdk: add dpdk vhost-cuse ports") Signed-off-by: Ilya Maximets <i.maximets@samsung.com> Acked-by: Kevin Traynor <kevin.traynor@intel.com> Acked-by: Daniele Di Proietto <diproiettod@vmware.com>
Diffstat (limited to 'lib')
-rw-r--r--lib/netdev-dpdk.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
index 6ac0eecc5..f4ed2104c 100644
--- a/lib/netdev-dpdk.c
+++ b/lib/netdev-dpdk.c
@@ -869,10 +869,13 @@ netdev_dpdk_vhost_destruct(struct netdev *netdev_)
{
struct netdev_dpdk *dev = netdev_dpdk_cast(netdev_);
- /* Can't remove a port while a guest is attached to it. */
+ /* Guest becomes an orphan if still attached. */
if (netdev_dpdk_get_virtio(dev) != NULL) {
- VLOG_ERR("Can not remove port, vhost device still attached");
- return;
+ VLOG_ERR("Removing port '%s' while vhost device still attached.",
+ netdev_->name);
+ VLOG_ERR("To restore connectivity after re-adding of port, VM on socket"
+ " '%s' must be restarted.",
+ dev->vhost_id);
}
if (rte_vhost_driver_unregister(dev->vhost_id)) {