From fcd5f601440508ed0afa2d123cb343d5faab7a58 Mon Sep 17 00:00:00 2001 From: Konrad Sztyber Date: Thu, 16 Dec 2021 09:28:25 +0100 Subject: [PATCH] bdev/malloc: malloc IO channel It'll allow the malloc bdev to store per-thread data. For now, it's only used to keep the pointer to the accel library's IO channel, more fields will be added in subsequent patches. Signed-off-by: Konrad Sztyber Change-Id: I604a38877ae8d6075b911f5a484d1793d4bc2ddb Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/10802 Community-CI: Broadcom CI Reviewed-by: Aleksey Marchuk Reviewed-by: Ben Walker Reviewed-by: Jim Harris Tested-by: SPDK CI Jenkins --- mk/spdk.lib_deps.mk | 2 +- module/bdev/malloc/bdev_malloc.c | 50 ++++++++++++++++++++++++++++---- 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/mk/spdk.lib_deps.mk b/mk/spdk.lib_deps.mk index 911f46c2c..ae6c7fe9f 100644 --- a/mk/spdk.lib_deps.mk +++ b/mk/spdk.lib_deps.mk @@ -142,7 +142,6 @@ DEPDIRS-bdev_gpt := bdev json log thread util DEPDIRS-bdev_error := $(BDEV_DEPS) DEPDIRS-bdev_lvol := $(BDEV_DEPS) lvol blob blob_bdev -DEPDIRS-bdev_malloc := $(BDEV_DEPS) accel DEPDIRS-bdev_rpc := $(BDEV_DEPS) DEPDIRS-bdev_split := $(BDEV_DEPS) @@ -151,6 +150,7 @@ DEPDIRS-bdev_compress := $(BDEV_DEPS_THREAD) reduce DEPDIRS-bdev_crypto := $(BDEV_DEPS_THREAD) DEPDIRS-bdev_delay := $(BDEV_DEPS_THREAD) DEPDIRS-bdev_iscsi := $(BDEV_DEPS_THREAD) +DEPDIRS-bdev_malloc := $(BDEV_DEPS_THREAD) accel DEPDIRS-bdev_null := $(BDEV_DEPS_THREAD) DEPDIRS-bdev_nvme = $(BDEV_DEPS_THREAD) accel nvme DEPDIRS-bdev_ocf := $(BDEV_DEPS_THREAD) diff --git a/module/bdev/malloc/bdev_malloc.c b/module/bdev/malloc/bdev_malloc.c index 4f9024310..49a4bc663 100644 --- a/module/bdev/malloc/bdev_malloc.c +++ b/module/bdev/malloc/bdev_malloc.c @@ -58,6 +58,10 @@ struct malloc_task { enum spdk_bdev_io_status status; }; +struct malloc_channel { + struct spdk_io_channel *accel_channel; +}; + static void malloc_done(void *ref, int status) { @@ -81,6 +85,7 @@ static TAILQ_HEAD(, malloc_disk) g_malloc_disks = TAILQ_HEAD_INITIALIZER(g_mallo int malloc_disk_count = 0; static int bdev_malloc_initialize(void); +static void bdev_malloc_deinitialize(void); static int bdev_malloc_get_ctx_size(void) @@ -91,6 +96,7 @@ bdev_malloc_get_ctx_size(void) static struct spdk_bdev_module malloc_if = { .name = "malloc", .module_init = bdev_malloc_initialize, + .module_fini = bdev_malloc_deinitialize, .get_ctx_size = bdev_malloc_get_ctx_size, }; @@ -235,6 +241,7 @@ bdev_malloc_reset(struct malloc_disk *mdisk, struct malloc_task *task) static int _bdev_malloc_submit_request(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io) { + struct malloc_channel *mch = spdk_io_channel_get_ctx(ch); uint32_t block_size = bdev_io->bdev->blocklen; switch (bdev_io->type) { @@ -250,7 +257,7 @@ static int _bdev_malloc_submit_request(struct spdk_io_channel *ch, struct spdk_b } bdev_malloc_readv((struct malloc_disk *)bdev_io->bdev->ctxt, - ch, + mch->accel_channel, (struct malloc_task *)bdev_io->driver_ctx, bdev_io->u.bdev.iovs, bdev_io->u.bdev.iovcnt, @@ -260,7 +267,7 @@ static int _bdev_malloc_submit_request(struct spdk_io_channel *ch, struct spdk_b case SPDK_BDEV_IO_TYPE_WRITE: bdev_malloc_writev((struct malloc_disk *)bdev_io->bdev->ctxt, - ch, + mch->accel_channel, (struct malloc_task *)bdev_io->driver_ctx, bdev_io->u.bdev.iovs, bdev_io->u.bdev.iovcnt, @@ -280,7 +287,7 @@ static int _bdev_malloc_submit_request(struct spdk_io_channel *ch, struct spdk_b case SPDK_BDEV_IO_TYPE_UNMAP: return bdev_malloc_unmap((struct malloc_disk *)bdev_io->bdev->ctxt, - ch, + mch->accel_channel, (struct malloc_task *)bdev_io->driver_ctx, bdev_io->u.bdev.offset_blocks * block_size, bdev_io->u.bdev.num_blocks * block_size); @@ -288,7 +295,7 @@ static int _bdev_malloc_submit_request(struct spdk_io_channel *ch, struct spdk_b case SPDK_BDEV_IO_TYPE_WRITE_ZEROES: /* bdev_malloc_unmap is implemented with a call to mem_cpy_fill which zeroes out all of the requested bytes. */ return bdev_malloc_unmap((struct malloc_disk *)bdev_io->bdev->ctxt, - ch, + mch->accel_channel, (struct malloc_task *)bdev_io->driver_ctx, bdev_io->u.bdev.offset_blocks * block_size, bdev_io->u.bdev.num_blocks * block_size); @@ -344,7 +351,7 @@ bdev_malloc_io_type_supported(void *ctx, enum spdk_bdev_io_type io_type) static struct spdk_io_channel * bdev_malloc_get_io_channel(void *ctx) { - return spdk_accel_engine_get_io_channel(); + return spdk_get_io_channel(&g_malloc_disks); } static void @@ -468,13 +475,46 @@ delete_malloc_disk(struct spdk_bdev *bdev, spdk_delete_malloc_complete cb_fn, vo spdk_bdev_unregister(bdev, cb_fn, cb_arg); } +static int +malloc_create_channel_cb(void *io_device, void *ctx) +{ + struct malloc_channel *ch = ctx; + + ch->accel_channel = spdk_accel_engine_get_io_channel(); + if (!ch->accel_channel) { + SPDK_ERRLOG("Failed to get accel engine's IO channel\n"); + return -ENOMEM; + } + + return 0; +} + +static void +malloc_destroy_channel_cb(void *io_device, void *ctx) +{ + struct malloc_channel *ch = ctx; + + spdk_put_io_channel(ch->accel_channel); +} + static int bdev_malloc_initialize(void) { /* This needs to be reset for each reinitialization of submodules. * Otherwise after enough devices or reinitializations the value gets too high. * TODO: Make malloc bdev name mandatory and remove this counter. */ malloc_disk_count = 0; + + spdk_io_device_register(&g_malloc_disks, malloc_create_channel_cb, + malloc_destroy_channel_cb, sizeof(struct malloc_channel), + "bdev_malloc"); + return 0; } +static void +bdev_malloc_deinitialize(void) +{ + spdk_io_device_unregister(&g_malloc_disks, NULL); +} + SPDK_LOG_REGISTER_COMPONENT(bdev_malloc)