netdev-dpdk: Fix crash when changing the vhost-user port.
authorIlya Maximets <i.maximets@samsung.com>
Tue, 22 Mar 2016 12:42:03 +0000 (15:42 +0300)
committerDaniele Di Proietto <diproiettod@vmware.com>
Wed, 23 Mar 2016 01:27:11 +0000 (18:27 -0700)
commitc62da695974476a3dd871325d01283c2960e1fd1
treeed94126f8101271596cc8584d72d55c74597ff3f
parent0a914b0637cab71e2e5fdc0865f9e582e8cfc024
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>
lib/netdev-dpdk.c