From d5b6b1880edf01e90b96382d3929ba26e79a14df Mon Sep 17 00:00:00 2001 From: Dariusz Stojaczyk Date: Wed, 24 May 2017 13:16:40 +0200 Subject: [PATCH] vhost: reordered functions in vhost_scsi.c General cleanup. Change-Id: I31083a7210634b8fc9d1336aff08f9793b249930 Signed-off-by: Dariusz Stojaczyk Reviewed-on: https://review.gerrithub.io/362296 Tested-by: SPDK Automated Test System Reviewed-by: Jim Harris Reviewed-by: Tomasz Zawadzki --- lib/vhost/vhost_scsi.c | 126 ++++++++++++++++++++--------------------- 1 file changed, 63 insertions(+), 63 deletions(-) diff --git a/lib/vhost/vhost_scsi.c b/lib/vhost/vhost_scsi.c index 74c3a1c94..e5e20faf3 100644 --- a/lib/vhost/vhost_scsi.c +++ b/lib/vhost/vhost_scsi.c @@ -81,12 +81,6 @@ #define VIRTIO_SCSI_EVENTQ 1 #define VIRTIO_SCSI_REQUESTQ 2 -static uint64_t -gpa_to_vva(struct spdk_vhost_dev *vdev, uint64_t addr) -{ - return rte_vhost_gpa_to_vva(vdev->mem, addr); -} - struct spdk_vhost_scsi_dev { struct spdk_vhost_dev vdev; @@ -95,6 +89,24 @@ struct spdk_vhost_scsi_dev { struct spdk_poller *controlq_poller; } __rte_cache_aligned; +static int new_device(int vid); +static void destroy_device(int vid); + +const struct spdk_vhost_dev_backend spdk_vhost_scsi_device_backend = { + .virtio_features = SPDK_VHOST_SCSI_FEATURES, + .disabled_features = SPDK_VHOST_SCSI_DISABLED_FEATURES, + .ops = { + .new_device = new_device, + .destroy_device = destroy_device, + } +}; + +static uint64_t +gpa_to_vva(struct spdk_vhost_dev *vdev, uint64_t addr) +{ + return rte_vhost_gpa_to_vva(vdev->mem, addr); +} + /* * Get available requests from avail ring. */ @@ -717,63 +729,6 @@ remove_vdev_cb(void *arg1, void *arg2) sem_post((sem_t *)arg2); } -static void -destroy_device(int vid) -{ - struct spdk_vhost_scsi_dev *svdev; - struct spdk_vhost_dev *vdev; - struct spdk_event *event; - sem_t done_sem; - uint32_t i; - - vdev = spdk_vhost_dev_find_by_vid(vid); - if (vdev == NULL) { - rte_panic("Couldn't find device with vid %d to stop.\n", vid); - } - svdev = (struct spdk_vhost_scsi_dev *) vdev; - - event = vhost_sem_event_alloc(vdev->lcore, vdev_event_done_cb, NULL, &done_sem); - spdk_poller_unregister(&svdev->requestq_poller, event); - if (vhost_sem_timedwait(&done_sem, 1)) - rte_panic("%s: failed to unregister request queue poller.\n", vdev->name); - - event = vhost_sem_event_alloc(vdev->lcore, vdev_event_done_cb, NULL, &done_sem); - spdk_poller_unregister(&svdev->controlq_poller, event); - if (vhost_sem_timedwait(&done_sem, 1)) - rte_panic("%s: failed to unregister control queue poller.\n", vdev->name); - - /* 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); - } - - event = vhost_sem_event_alloc(vdev->lcore, remove_vdev_cb, svdev, &done_sem); - spdk_event_call(event); - if (vhost_sem_timedwait(&done_sem, 1)) - rte_panic("%s: failed to unregister poller.\n", vdev->name); - - spdk_vhost_free_reactor(vdev->lcore); - vdev->lcore = -1; - - spdk_vhost_dev_destruct(vdev); -} - -static int new_device(int vid); -static void destroy_device(int vid); - -const struct spdk_vhost_dev_backend spdk_vhost_scsi_device_backend = { - .virtio_features = SPDK_VHOST_SCSI_FEATURES, - .disabled_features = SPDK_VHOST_SCSI_DISABLED_FEATURES, - .ops = { - .new_device = new_device, - .destroy_device = destroy_device, - } -}; - int spdk_vhost_scsi_dev_construct(const char *name, uint64_t cpumask) { @@ -1048,6 +1003,51 @@ new_device(int vid) return 0; } +static void +destroy_device(int vid) +{ + struct spdk_vhost_scsi_dev *svdev; + struct spdk_vhost_dev *vdev; + struct spdk_event *event; + sem_t done_sem; + uint32_t i; + + vdev = spdk_vhost_dev_find_by_vid(vid); + if (vdev == NULL) { + rte_panic("Couldn't find device with vid %d to stop.\n", vid); + } + svdev = (struct spdk_vhost_scsi_dev *) vdev; + + event = vhost_sem_event_alloc(vdev->lcore, vdev_event_done_cb, NULL, &done_sem); + spdk_poller_unregister(&svdev->requestq_poller, event); + if (vhost_sem_timedwait(&done_sem, 1)) + rte_panic("%s: failed to unregister request queue poller.\n", vdev->name); + + event = vhost_sem_event_alloc(vdev->lcore, vdev_event_done_cb, NULL, &done_sem); + spdk_poller_unregister(&svdev->controlq_poller, event); + if (vhost_sem_timedwait(&done_sem, 1)) + rte_panic("%s: failed to unregister control queue poller.\n", vdev->name); + + /* 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); + } + + event = vhost_sem_event_alloc(vdev->lcore, remove_vdev_cb, svdev, &done_sem); + spdk_event_call(event); + if (vhost_sem_timedwait(&done_sem, 1)) + rte_panic("%s: failed to unregister poller.\n", vdev->name); + + spdk_vhost_free_reactor(vdev->lcore); + vdev->lcore = -1; + + spdk_vhost_dev_destruct(vdev); +} + SPDK_LOG_REGISTER_TRACE_FLAG("vhost", SPDK_TRACE_VHOST) SPDK_LOG_REGISTER_TRACE_FLAG("vhost_ring", SPDK_TRACE_VHOST_RING) SPDK_LOG_REGISTER_TRACE_FLAG("vhost_queue", SPDK_TRACE_VHOST_QUEUE)