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_EVENTQ 1
|
||||||
#define VIRTIO_SCSI_REQUESTQ 2
|
#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_scsi_dev {
|
||||||
struct spdk_vhost_dev vdev;
|
struct spdk_vhost_dev vdev;
|
||||||
|
|
||||||
@ -95,6 +89,24 @@ struct spdk_vhost_scsi_dev {
|
|||||||
struct spdk_poller *controlq_poller;
|
struct spdk_poller *controlq_poller;
|
||||||
} __rte_cache_aligned;
|
} __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.
|
* Get available requests from avail ring.
|
||||||
*/
|
*/
|
||||||
@ -717,63 +729,6 @@ remove_vdev_cb(void *arg1, void *arg2)
|
|||||||
sem_post((sem_t *)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
|
int
|
||||||
spdk_vhost_scsi_dev_construct(const char *name, uint64_t cpumask)
|
spdk_vhost_scsi_dev_construct(const char *name, uint64_t cpumask)
|
||||||
{
|
{
|
||||||
@ -1048,6 +1003,51 @@ new_device(int vid)
|
|||||||
return 0;
|
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", SPDK_TRACE_VHOST)
|
||||||
SPDK_LOG_REGISTER_TRACE_FLAG("vhost_ring", SPDK_TRACE_VHOST_RING)
|
SPDK_LOG_REGISTER_TRACE_FLAG("vhost_ring", SPDK_TRACE_VHOST_RING)
|
||||||
SPDK_LOG_REGISTER_TRACE_FLAG("vhost_queue", SPDK_TRACE_VHOST_QUEUE)
|
SPDK_LOG_REGISTER_TRACE_FLAG("vhost_queue", SPDK_TRACE_VHOST_QUEUE)
|
||||||
|
Loading…
Reference in New Issue
Block a user