From 97c45f56312bcf697f09258fd5abdd01db0c6bd9 Mon Sep 17 00:00:00 2001 From: wuzhouhui Date: Sun, 30 Sep 2018 17:43:41 +0800 Subject: [PATCH] vhost: embed destroy ctx into vhost dev struct So we don't need to do extra memory allocation when stop vhost device. This makes code more clean. Change-Id: I27a1b446621ce4f452fee62acd634737b4ffe174 Signed-off-by: wuzhouhui Reviewed-on: https://review.gerrithub.io/427336 Reviewed-by: Darek Stojaczyk Reviewed-by: Ben Walker Reviewed-by: Jim Harris Chandler-Test-Pool: SPDK Automated Test System Tested-by: SPDK CI Jenkins --- lib/vhost/vhost_blk.c | 31 +++++++------------------------ lib/vhost/vhost_internal.h | 5 +++++ lib/vhost/vhost_nvme.c | 32 ++++++-------------------------- lib/vhost/vhost_scsi.c | 30 +++++++----------------------- 4 files changed, 25 insertions(+), 73 deletions(-) diff --git a/lib/vhost/vhost_blk.c b/lib/vhost/vhost_blk.c index 47914307e..0f2def8a6 100644 --- a/lib/vhost/vhost_blk.c +++ b/lib/vhost/vhost_blk.c @@ -71,6 +71,7 @@ struct spdk_vhost_blk_dev { struct spdk_bdev_desc *bdev_desc; struct spdk_io_channel *bdev_io_channel; struct spdk_poller *requestq_poller; + struct spdk_vhost_dev_destroy_ctx destroy_ctx; bool readonly; }; @@ -588,17 +589,10 @@ out: return rc; } -struct spdk_vhost_dev_destroy_ctx { - struct spdk_vhost_blk_dev *bvdev; - struct spdk_poller *poller; - void *event_ctx; -}; - static int destroy_device_poller_cb(void *arg) { - struct spdk_vhost_dev_destroy_ctx *ctx = arg; - struct spdk_vhost_blk_dev *bvdev = ctx->bvdev; + struct spdk_vhost_blk_dev *bvdev = arg; int i; if (bvdev->vdev.task_cnt > 0) { @@ -618,10 +612,8 @@ destroy_device_poller_cb(void *arg) } free_task_pool(bvdev); - - spdk_poller_unregister(&ctx->poller); - spdk_vhost_dev_backend_event_done(ctx->event_ctx, 0); - spdk_dma_free(ctx); + spdk_poller_unregister(&bvdev->destroy_ctx.poller); + spdk_vhost_dev_backend_event_done(bvdev->destroy_ctx.event_ctx, 0); return -1; } @@ -630,7 +622,6 @@ static int spdk_vhost_blk_stop(struct spdk_vhost_dev *vdev, void *event_ctx) { struct spdk_vhost_blk_dev *bvdev; - struct spdk_vhost_dev_destroy_ctx *destroy_ctx; bvdev = to_blk_dev(vdev); if (bvdev == NULL) { @@ -638,18 +629,10 @@ spdk_vhost_blk_stop(struct spdk_vhost_dev *vdev, void *event_ctx) goto err; } - destroy_ctx = spdk_dma_zmalloc(sizeof(*destroy_ctx), SPDK_CACHE_LINE_SIZE, NULL); - if (destroy_ctx == NULL) { - SPDK_ERRLOG("Failed to alloc memory for destroying device.\n"); - goto err; - } - - destroy_ctx->bvdev = bvdev; - destroy_ctx->event_ctx = event_ctx; - + bvdev->destroy_ctx.event_ctx = event_ctx; spdk_poller_unregister(&bvdev->requestq_poller); - destroy_ctx->poller = spdk_poller_register(destroy_device_poller_cb, - destroy_ctx, 1000); + bvdev->destroy_ctx.poller = spdk_poller_register(destroy_device_poller_cb, + bvdev, 1000); return 0; err: diff --git a/lib/vhost/vhost_internal.h b/lib/vhost/vhost_internal.h index dfc0bf623..9c0ad211d 100644 --- a/lib/vhost/vhost_internal.h +++ b/lib/vhost/vhost_internal.h @@ -176,6 +176,11 @@ struct spdk_vhost_dev { TAILQ_ENTRY(spdk_vhost_dev) tailq; }; +struct spdk_vhost_dev_destroy_ctx { + struct spdk_poller *poller; + void *event_ctx; +}; + struct spdk_vhost_dev *spdk_vhost_dev_find(const char *ctrlr_name); void *spdk_vhost_gpa_to_vva(struct spdk_vhost_dev *vdev, uint64_t addr, uint64_t len); diff --git a/lib/vhost/vhost_nvme.c b/lib/vhost/vhost_nvme.c index 94bb80c3b..ff64a56bb 100644 --- a/lib/vhost/vhost_nvme.c +++ b/lib/vhost/vhost_nvme.c @@ -139,6 +139,7 @@ struct spdk_vhost_nvme_dev { TAILQ_ENTRY(spdk_vhost_nvme_dev) tailq; STAILQ_HEAD(, spdk_vhost_nvme_task) free_tasks; struct spdk_poller *requestq_poller; + struct spdk_vhost_dev_destroy_ctx destroy_ctx; }; static const struct spdk_vhost_dev_backend spdk_vhost_nvme_device_backend; @@ -1025,17 +1026,10 @@ bdev_remove_cb(void *remove_ctx) spdk_vhost_nvme_deactive_ns(ns); } -struct spdk_vhost_dev_destroy_ctx { - struct spdk_vhost_nvme_dev *bvdev; - struct spdk_poller *poller; - void *event_ctx; -}; - static int destroy_device_poller_cb(void *arg) { - struct spdk_vhost_dev_destroy_ctx *ctx = arg; - struct spdk_vhost_nvme_dev *nvme = ctx->bvdev; + struct spdk_vhost_nvme_dev *nvme = arg; struct spdk_vhost_nvme_dev *dev, *tmp; struct spdk_vhost_nvme_ns *ns_dev; uint32_t i; @@ -1058,9 +1052,8 @@ destroy_device_poller_cb(void *arg) } } - spdk_poller_unregister(&ctx->poller); - spdk_vhost_dev_backend_event_done(ctx->event_ctx, 0); - free(ctx); + spdk_poller_unregister(&nvme->destroy_ctx.poller); + spdk_vhost_dev_backend_event_done(nvme->destroy_ctx.event_ctx, 0); return -1; } @@ -1071,7 +1064,6 @@ static int spdk_vhost_nvme_stop_device(struct spdk_vhost_dev *vdev, void *event_ctx) { struct spdk_vhost_nvme_dev *nvme = to_nvme_dev(vdev); - struct spdk_vhost_dev_destroy_ctx *destroy_ctx; if (nvme == NULL) { return -1; @@ -1080,23 +1072,11 @@ spdk_vhost_nvme_stop_device(struct spdk_vhost_dev *vdev, void *event_ctx) free_task_pool(nvme); SPDK_NOTICELOG("Stopping Device %u, Path %s\n", vdev->vid, vdev->path); - destroy_ctx = malloc(sizeof(*destroy_ctx)); - if (destroy_ctx == NULL) { - SPDK_ERRLOG("Failed to alloc memory for destroying device.\n"); - goto err; - } - - destroy_ctx->bvdev = nvme; - destroy_ctx->event_ctx = event_ctx; - + nvme->destroy_ctx.event_ctx = event_ctx; spdk_poller_unregister(&nvme->requestq_poller); - destroy_ctx->poller = spdk_poller_register(destroy_device_poller_cb, destroy_ctx, 1000); + nvme->destroy_ctx.poller = spdk_poller_register(destroy_device_poller_cb, nvme, 1000); return 0; - -err: - spdk_vhost_dev_backend_event_done(event_ctx, -1); - return -1; } static void diff --git a/lib/vhost/vhost_scsi.c b/lib/vhost/vhost_scsi.c index f8da0d776..aefa4c451 100644 --- a/lib/vhost/vhost_scsi.c +++ b/lib/vhost/vhost_scsi.c @@ -80,6 +80,7 @@ struct spdk_vhost_scsi_dev { struct spdk_poller *requestq_poller; struct spdk_poller *mgmt_poller; + struct spdk_vhost_dev_destroy_ctx destroy_ctx; } __rte_cache_aligned; struct spdk_vhost_scsi_task { @@ -1111,17 +1112,10 @@ out: return rc; } -struct spdk_vhost_dev_destroy_ctx { - struct spdk_vhost_scsi_dev *svdev; - struct spdk_poller *poller; - void *event_ctx; -}; - static int destroy_device_poller_cb(void *arg) { - struct spdk_vhost_dev_destroy_ctx *ctx = arg; - struct spdk_vhost_scsi_dev *svdev = ctx->svdev; + struct spdk_vhost_scsi_dev *svdev = arg; uint32_t i; if (svdev->vdev.task_cnt > 0) { @@ -1144,9 +1138,8 @@ destroy_device_poller_cb(void *arg) free_task_pool(svdev); - spdk_poller_unregister(&ctx->poller); - spdk_vhost_dev_backend_event_done(ctx->event_ctx, 0); - spdk_dma_free(ctx); + spdk_poller_unregister(&svdev->destroy_ctx.poller); + spdk_vhost_dev_backend_event_done(svdev->destroy_ctx.event_ctx, 0); return -1; } @@ -1155,7 +1148,6 @@ static int spdk_vhost_scsi_stop(struct spdk_vhost_dev *vdev, void *event_ctx) { struct spdk_vhost_scsi_dev *svdev; - struct spdk_vhost_dev_destroy_ctx *destroy_ctx; svdev = to_scsi_dev(vdev); if (svdev == NULL) { @@ -1163,19 +1155,11 @@ spdk_vhost_scsi_stop(struct spdk_vhost_dev *vdev, void *event_ctx) goto err; } - destroy_ctx = spdk_dma_zmalloc(sizeof(*destroy_ctx), SPDK_CACHE_LINE_SIZE, NULL); - if (destroy_ctx == NULL) { - SPDK_ERRLOG("Failed to alloc memory for destroying device.\n"); - goto err; - } - - destroy_ctx->svdev = svdev; - destroy_ctx->event_ctx = event_ctx; - + svdev->destroy_ctx.event_ctx = event_ctx; spdk_poller_unregister(&svdev->requestq_poller); spdk_poller_unregister(&svdev->mgmt_poller); - destroy_ctx->poller = spdk_poller_register(destroy_device_poller_cb, destroy_ctx, - 1000); + svdev->destroy_ctx.poller = spdk_poller_register(destroy_device_poller_cb, svdev, + 1000); return 0;