vhost: move memory registration to DPDK thread

Moved it to the DPDK thread, so that we don't stress
SPDK I/O reactors on device start/stop. This is mandatory
if we want to maintain hundreds of simultaneous connections.

This patch also fixes various memory registrations leaks
in cases where further device initiation fails.

Change-Id: I435062108fe96d7e67e2a078a3547acb1f73ad11
Signed-off-by: Dariusz Stojaczyk <dariuszx.stojaczyk@intel.com>
Reviewed-on: https://review.gerrithub.io/406960
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
Dariusz Stojaczyk 2018-04-09 18:40:48 +02:00 committed by Daniel Verkamp
parent aedbb3b81a
commit 6820d312e1
5 changed files with 5 additions and 12 deletions

View File

@ -493,7 +493,7 @@ spdk_vhost_dev_find_by_vid(int vid)
#define FLOOR_2MB(x) (((uintptr_t)x) / SIZE_2MB) << SHIFT_2MB #define FLOOR_2MB(x) (((uintptr_t)x) / SIZE_2MB) << SHIFT_2MB
#define CEIL_2MB(x) ((((uintptr_t)x) + SIZE_2MB - 1) / SIZE_2MB) << SHIFT_2MB #define CEIL_2MB(x) ((((uintptr_t)x) + SIZE_2MB - 1) / SIZE_2MB) << SHIFT_2MB
void static void
spdk_vhost_dev_mem_register(struct spdk_vhost_dev *vdev) spdk_vhost_dev_mem_register(struct spdk_vhost_dev *vdev)
{ {
struct rte_vhost_mem_region *region; struct rte_vhost_mem_region *region;
@ -516,7 +516,7 @@ spdk_vhost_dev_mem_register(struct spdk_vhost_dev *vdev)
} }
} }
void static void
spdk_vhost_dev_mem_unregister(struct spdk_vhost_dev *vdev) spdk_vhost_dev_mem_unregister(struct spdk_vhost_dev *vdev)
{ {
struct rte_vhost_mem_region *region; struct rte_vhost_mem_region *region;
@ -981,6 +981,7 @@ stop_device(int vid)
rte_vhost_set_vhost_vring_last_idx(vdev->vid, i, q->last_avail_idx, q->last_used_idx); rte_vhost_set_vhost_vring_last_idx(vdev->vid, i, q->last_avail_idx, q->last_used_idx);
} }
spdk_vhost_dev_mem_unregister(vdev);
free(vdev->mem); free(vdev->mem);
spdk_vhost_free_reactor(vdev->lcore); spdk_vhost_free_reactor(vdev->lcore);
vdev->lcore = -1; vdev->lcore = -1;
@ -1062,8 +1063,10 @@ start_device(int vid)
} }
vdev->lcore = spdk_vhost_allocate_reactor(vdev->cpumask); vdev->lcore = spdk_vhost_allocate_reactor(vdev->cpumask);
spdk_vhost_dev_mem_register(vdev);
rc = spdk_vhost_event_send(vdev, vdev->backend->start_device, 3, "start device"); rc = spdk_vhost_event_send(vdev, vdev->backend->start_device, 3, "start device");
if (rc != 0) { if (rc != 0) {
spdk_vhost_dev_mem_unregister(vdev);
free(vdev->mem); free(vdev->mem);
spdk_vhost_free_reactor(vdev->lcore); spdk_vhost_free_reactor(vdev->lcore);
vdev->lcore = -1; vdev->lcore = -1;

View File

@ -507,8 +507,6 @@ spdk_vhost_blk_start(struct spdk_vhost_dev *vdev, void *event_ctx)
goto out; goto out;
} }
spdk_vhost_dev_mem_register(&bvdev->vdev);
if (bvdev->bdev) { if (bvdev->bdev) {
bvdev->bdev_io_channel = spdk_bdev_get_io_channel(bvdev->bdev_desc); bvdev->bdev_io_channel = spdk_bdev_get_io_channel(bvdev->bdev_desc);
if (!bvdev->bdev_io_channel) { if (!bvdev->bdev_io_channel) {
@ -557,7 +555,6 @@ destroy_device_poller_cb(void *arg)
} }
free_task_pool(bvdev); free_task_pool(bvdev);
spdk_vhost_dev_mem_unregister(&bvdev->vdev);
spdk_poller_unregister(&ctx->poller); spdk_poller_unregister(&ctx->poller);
spdk_vhost_dev_backend_event_done(ctx->event_ctx, 0); spdk_vhost_dev_backend_event_done(ctx->event_ctx, 0);

View File

@ -170,8 +170,6 @@ struct spdk_vhost_dev {
}; };
struct spdk_vhost_dev *spdk_vhost_dev_find(const char *ctrlr_name); struct spdk_vhost_dev *spdk_vhost_dev_find(const char *ctrlr_name);
void spdk_vhost_dev_mem_register(struct spdk_vhost_dev *vdev);
void spdk_vhost_dev_mem_unregister(struct spdk_vhost_dev *vdev);
void *spdk_vhost_gpa_to_vva(struct spdk_vhost_dev *vdev, uint64_t addr); void *spdk_vhost_gpa_to_vva(struct spdk_vhost_dev *vdev, uint64_t addr);

View File

@ -886,7 +886,6 @@ spdk_vhost_nvme_start_device(struct spdk_vhost_dev *vdev, void *event_ctx)
return -1; return -1;
} }
spdk_vhost_dev_mem_register(vdev);
nvme->mem = vdev->mem; nvme->mem = vdev->mem;
if (alloc_task_pool(nvme)) { if (alloc_task_pool(nvme)) {
@ -961,7 +960,6 @@ destroy_device_poller_cb(void *arg)
nvme->num_cqs = 0; nvme->num_cqs = 0;
nvme->dbbuf_dbs = NULL; nvme->dbbuf_dbs = NULL;
nvme->dbbuf_eis = NULL; nvme->dbbuf_eis = NULL;
spdk_vhost_dev_mem_unregister(&nvme->vdev);
} }
} }

View File

@ -1085,8 +1085,6 @@ spdk_vhost_scsi_start(struct spdk_vhost_dev *vdev, void *event_ctx)
SPDK_INFOLOG(SPDK_LOG_VHOST, "Started poller for vhost controller %s on lcore %d\n", SPDK_INFOLOG(SPDK_LOG_VHOST, "Started poller for vhost controller %s on lcore %d\n",
vdev->name, vdev->lcore); vdev->name, vdev->lcore);
spdk_vhost_dev_mem_register(vdev);
svdev->requestq_poller = spdk_poller_register(vdev_worker, svdev, 0); svdev->requestq_poller = spdk_poller_register(vdev_worker, svdev, 0);
svdev->mgmt_poller = spdk_poller_register(vdev_mgmt_worker, svdev, svdev->mgmt_poller = spdk_poller_register(vdev_mgmt_worker, svdev,
MGMT_POLL_PERIOD_US); MGMT_POLL_PERIOD_US);
@ -1125,7 +1123,6 @@ destroy_device_poller_cb(void *arg)
} }
SPDK_INFOLOG(SPDK_LOG_VHOST, "Stopping poller for vhost controller %s\n", svdev->vdev.name); SPDK_INFOLOG(SPDK_LOG_VHOST, "Stopping poller for vhost controller %s\n", svdev->vdev.name);
spdk_vhost_dev_mem_unregister(&svdev->vdev);
free_task_pool(svdev); free_task_pool(svdev);