diff --git a/lib/vhost/vhost.c b/lib/vhost/vhost.c index 90be2eefb..ef8feb63a 100644 --- a/lib/vhost/vhost.c +++ b/lib/vhost/vhost.c @@ -506,12 +506,6 @@ spdk_vhost_dev_unload(struct spdk_vhost_dev *vdev) spdk_vhost_free_reactor(vdev->lcore); vdev->lcore = -1; - if (vdev->task_cnt > 0) { - SPDK_ERRLOG("%s: Leaked %u tasks when shutting down\n", vdev->name, vdev->task_cnt); - } - vdev->task_cnt = 0; - vdev->vid = -1; - vdev->num_queues = 0; } struct spdk_vhost_dev * diff --git a/lib/vhost/vhost_scsi.c b/lib/vhost/vhost_scsi.c index 6ed23e89e..bafab3b58 100644 --- a/lib/vhost/vhost_scsi.c +++ b/lib/vhost/vhost_scsi.c @@ -762,6 +762,7 @@ destroy_device(int vid) struct spdk_vhost_scsi_dev *svdev; struct spdk_vhost_dev *vdev; struct spdk_vhost_timed_event event = {0}; + uint32_t i; vdev = spdk_vhost_dev_find_by_vid(vid); if (vdev == NULL) { @@ -778,6 +779,16 @@ destroy_device(int vid) spdk_poller_unregister(&svdev->controlq_poller, event.spdk_event); spdk_vhost_timed_event_wait(&event, "unregister controll queue poller"); + /* Wait for all tasks to finish */ + for (i = 1000; i && vdev->task_cnt > 0; i--) { + usleep(1000); + } + + if (vdev->task_cnt > 0) { + rte_panic("%s: pending tasks did not finish in 1s.\n", vdev->name); + } + + spdk_vhost_timed_event_send(vdev->lcore, remove_vdev_cb, svdev, 1, "remove scsi vdev"); spdk_vhost_dev_unload(vdev);