[v2] vhost: fix passing destroyed device to destroy callback
Checks
Commit Message
Application should be able to obtain information like 'ifname' from
the 'vid' passed to 'destroy_connection' callback. Currently, all the
API calls with passed 'vid' fails with 'device not found'.
Fixes: efba12a78ddf ("vhost: add user callbacks for socket open/close")
Cc: stable@dpdk.org
Signed-off-by: Ilya Maximets <i.maximets@samsung.com>
---
Version 2:
* Fixed wrong order of 'destroy_device' and 'destroy_connection'.
lib/librte_vhost/socket.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
Comments
On Fri, Apr 12, 2019 at 11:32:28AM +0300, Ilya Maximets wrote:
> Application should be able to obtain information like 'ifname' from
> the 'vid' passed to 'destroy_connection' callback. Currently, all the
> API calls with passed 'vid' fails with 'device not found'.
>
> Fixes: efba12a78ddf ("vhost: add user callbacks for socket open/close")
> Cc: stable@dpdk.org
>
> Signed-off-by: Ilya Maximets <i.maximets@samsung.com>
> ---
>
> Version 2:
> * Fixed wrong order of 'destroy_device' and 'destroy_connection'.
>
> lib/librte_vhost/socket.c | 8 +++++++-
> 1 file changed, 7 insertions(+), 1 deletion(-)
Reviewed-by: Tiwei Bie <tiwei.bie@intel.com>
On 4/12/19 10:32 AM, Ilya Maximets wrote:
> Application should be able to obtain information like 'ifname' from
> the 'vid' passed to 'destroy_connection' callback. Currently, all the
> API calls with passed 'vid' fails with 'device not found'.
>
> Fixes: efba12a78ddf ("vhost: add user callbacks for socket open/close")
> Cc:stable@dpdk.org
>
> Signed-off-by: Ilya Maximets<i.maximets@samsung.com>
> ---
>
> Version 2:
> * Fixed wrong order of 'destroy_device' and 'destroy_connection'.
>
> lib/librte_vhost/socket.c | 8 +++++++-
> 1 file changed, 7 insertions(+), 1 deletion(-)
Applied to dpdk-next-virtio/master.
Thanks,
Maxime
@@ -295,13 +295,19 @@ vhost_user_read_cb(int connfd, void *dat, int *remove)
ret = vhost_user_msg_handler(conn->vid, connfd);
if (ret < 0) {
+ struct virtio_net *dev = get_device(conn->vid);
+
close(connfd);
*remove = 1;
- vhost_destroy_device(conn->vid);
+
+ if (dev)
+ vhost_destroy_device_notify(dev);
if (vsocket->notify_ops->destroy_connection)
vsocket->notify_ops->destroy_connection(conn->vid);
+ vhost_destroy_device(conn->vid);
+
pthread_mutex_lock(&vsocket->conn_mutex);
TAILQ_REMOVE(&vsocket->conn_list, conn, next);
pthread_mutex_unlock(&vsocket->conn_mutex);