From a8599cd4f0f35d1cfb1f4aa70c5cd0c3344ff7dc Mon Sep 17 00:00:00 2001 From: Dariusz Stojaczyk Date: Fri, 8 Sep 2017 13:06:41 +0200 Subject: [PATCH] vhost: sync controller creation with g_spdk_vhost_mutex Controller creation RPC can't be done on controller's reactor (as there's obviously no controller yet...), so a special set of vhost_mutex_lock/unlock() functions to has been added to synchronise controller creation with the rest of ctrlr-enumerating code. Change-Id: Ib6e4b894a85ff1f70ebd047832c5a3568a00f1a7 Signed-off-by: Dariusz Stojaczyk Reviewed-on: https://review.gerrithub.io/377651 Tested-by: SPDK Automated Test System Reviewed-by: Jim Harris Reviewed-by: Changpeng Liu Reviewed-by: Daniel Verkamp --- lib/vhost/vhost.c | 12 +++++++ lib/vhost/vhost_blk.c | 35 +++++++++++-------- lib/vhost/vhost_internal.h | 2 ++ lib/vhost/vhost_scsi.c | 5 +-- .../unit/lib/vhost/vhost_blk.c/vhost_blk_ut.c | 2 ++ .../lib/vhost/vhost_scsi.c/vhost_scsi_ut.c | 2 ++ 6 files changed, 41 insertions(+), 17 deletions(-) diff --git a/lib/vhost/vhost.c b/lib/vhost/vhost.c index 0187758b8..45bbfdab5 100644 --- a/lib/vhost/vhost.c +++ b/lib/vhost/vhost.c @@ -901,4 +901,16 @@ spdk_vhost_call_external_event(const char *ctrlr_name, spdk_vhost_event_fn fn, v pthread_mutex_unlock(&g_spdk_vhost_mutex); } +void +spdk_vhost_lock(void) +{ + pthread_mutex_lock(&g_spdk_vhost_mutex); +} + +void +spdk_vhost_unlock(void) +{ + pthread_mutex_unlock(&g_spdk_vhost_mutex); +} + SPDK_LOG_REGISTER_TRACE_FLAG("vhost_ring", SPDK_TRACE_VHOST_RING) diff --git a/lib/vhost/vhost_blk.c b/lib/vhost/vhost_blk.c index e31e503f4..efb98fa17 100644 --- a/lib/vhost/vhost_blk.c +++ b/lib/vhost/vhost_blk.c @@ -671,27 +671,31 @@ spdk_vhost_blk_controller_construct(void) int spdk_vhost_blk_construct(const char *name, const char *cpumask, const char *dev_name, bool readonly) { - struct spdk_vhost_blk_dev *bvdev; + struct spdk_vhost_blk_dev *bvdev = NULL; struct spdk_bdev *bdev; - int ret; + int ret = 0; + spdk_vhost_lock(); bdev = spdk_bdev_get_by_name(dev_name); if (bdev == NULL) { SPDK_ERRLOG("Controller %s: bdev '%s' not found\n", name, dev_name); - return -1; + ret = -1; + goto out; } bvdev = spdk_dma_zmalloc(sizeof(*bvdev), SPDK_CACHE_LINE_SIZE, NULL); if (bvdev == NULL) { - return -1; + ret = -1; + goto out; } ret = spdk_bdev_open(bdev, true, bdev_remove_cb, bvdev, &bvdev->bdev_desc); if (ret != 0) { SPDK_ERRLOG("Controller %s: could not open bdev '%s', error=%d\n", name, dev_name, ret); - goto err; + ret = -1; + goto out; } bvdev->bdev = bdev; @@ -700,7 +704,8 @@ spdk_vhost_blk_construct(const char *name, const char *cpumask, const char *dev_ &vhost_blk_device_backend); if (ret != 0) { spdk_bdev_close(bvdev->bdev_desc); - goto err; + ret = -1; + goto out; } if (readonly && rte_vhost_driver_enable_features(bvdev->vdev.path, (1ULL << VIRTIO_BLK_F_RO))) { @@ -711,17 +716,17 @@ spdk_vhost_blk_construct(const char *name, const char *cpumask, const char *dev_ SPDK_ERRLOG("Controller %s: failed to remove controller\n", name); } - goto err; + ret = -1; + goto out; } - SPDK_NOTICELOG("Controller %s: using bdev '%s'\n", - name, dev_name); - - return 0; - -err: - spdk_dma_free(bvdev); - return -1; + SPDK_NOTICELOG("Controller %s: using bdev '%s'\n", name, dev_name); +out: + if (ret != 0 && bvdev) { + spdk_dma_free(bvdev); + } + spdk_vhost_unlock(); + return ret; } int diff --git a/lib/vhost/vhost_internal.h b/lib/vhost/vhost_internal.h index a93e0a90f..60566773c 100644 --- a/lib/vhost/vhost_internal.h +++ b/lib/vhost/vhost_internal.h @@ -149,5 +149,7 @@ int spdk_vhost_dev_remove(struct spdk_vhost_dev *vdev); int spdk_vhost_blk_controller_construct(void); void spdk_vhost_dump_config_json(struct spdk_vhost_dev *vdev, struct spdk_json_write_ctx *w); void spdk_vhost_dev_backend_event_done(void *event_ctx, int response); +void spdk_vhost_lock(void); +void spdk_vhost_unlock(void); #endif /* SPDK_VHOST_INTERNAL_H */ diff --git a/lib/vhost/vhost_scsi.c b/lib/vhost/vhost_scsi.c index 2f06c607b..bf1538fac 100644 --- a/lib/vhost/vhost_scsi.c +++ b/lib/vhost/vhost_scsi.c @@ -715,16 +715,17 @@ spdk_vhost_scsi_dev_construct(const char *name, const char *cpumask) return -ENOMEM; } + spdk_vhost_lock(); rc = spdk_vhost_dev_construct(&svdev->vdev, name, cpumask, SPDK_VHOST_DEV_T_SCSI, &spdk_vhost_scsi_device_backend); if (rc) { spdk_ring_free(svdev->vhost_events); spdk_dma_free(svdev); - return rc; } - return 0; + spdk_vhost_unlock(); + return rc; } int diff --git a/test/unit/lib/vhost/vhost_blk.c/vhost_blk_ut.c b/test/unit/lib/vhost/vhost_blk.c/vhost_blk_ut.c index 49f567ff8..7eec37d04 100644 --- a/test/unit/lib/vhost/vhost_blk.c/vhost_blk_ut.c +++ b/test/unit/lib/vhost/vhost_blk.c/vhost_blk_ut.c @@ -122,6 +122,8 @@ DEFINE_STUB_P(spdk_bdev_get_io_channel, struct spdk_io_channel, (struct spdk_bde DEFINE_STUB_V(spdk_vhost_call_external_event, (const char *ctrlr_name, spdk_vhost_event_fn fn, void *arg)); DEFINE_STUB_V(spdk_vhost_dev_backend_event_done, (void *event_ctx, int response)); +DEFINE_STUB_V(spdk_vhost_lock, (void)); +DEFINE_STUB_V(spdk_vhost_unlock, (void)); /* This sets spdk_vhost_dev_remove to either to fail or success */ DEFINE_STUB(spdk_vhost_dev_remove_fail, bool, (void), false); diff --git a/test/unit/lib/vhost/vhost_scsi.c/vhost_scsi_ut.c b/test/unit/lib/vhost/vhost_scsi.c/vhost_scsi_ut.c index 61e50e038..25f067cee 100644 --- a/test/unit/lib/vhost/vhost_scsi.c/vhost_scsi_ut.c +++ b/test/unit/lib/vhost/vhost_scsi.c/vhost_scsi_ut.c @@ -118,6 +118,8 @@ DEFINE_STUB(spdk_json_write_array_begin, int, (struct spdk_json_write_ctx *w), 0 DEFINE_STUB(spdk_json_write_object_end, int, (struct spdk_json_write_ctx *w), 0); DEFINE_STUB(spdk_json_write_array_end, int, (struct spdk_json_write_ctx *w), 0); DEFINE_STUB_V(spdk_vhost_dev_backend_event_done, (void *event_ctx, int response)); +DEFINE_STUB_V(spdk_vhost_lock, (void)); +DEFINE_STUB_V(spdk_vhost_unlock, (void)); /* This sets spdk_vhost_dev_remove to either to fail or success */ DEFINE_STUB(spdk_vhost_dev_remove_fail, bool, (void), false);