vhost: reordered functions in vhost_scsi.c
General cleanup. Change-Id: I31083a7210634b8fc9d1336aff08f9793b249930 Signed-off-by: Dariusz Stojaczyk <dariuszx.stojaczyk@intel.com> Reviewed-on: https://review.gerrithub.io/362296 Tested-by: SPDK Automated Test System <sys_sgsw@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Reviewed-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com>
This commit is contained in:
parent
d237aba3b9
commit
d5b6b1880e
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user