From 3b683c188e8097c2fe8018b91fe599310dbfee2a Mon Sep 17 00:00:00 2001 From: Ben Walker Date: Wed, 17 May 2017 13:50:36 -0700 Subject: [PATCH] blobfs: Use a separate io_device for io channels This allows us to have a different queue depth on I/O channels than on metadata/sync channels Change-Id: I30dfc95af550082efffec4b12ed6c4cd4b8c11cf Signed-off-by: Ben Walker Reviewed-on: https://review.gerrithub.io/361672 Tested-by: Reviewed-by: Jim Harris --- lib/blobfs/blobfs.c | 41 +++++++++++++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/lib/blobfs/blobfs.c b/lib/blobfs/blobfs.c index ebf45b74b..350dcc87f 100644 --- a/lib/blobfs/blobfs.c +++ b/lib/blobfs/blobfs.c @@ -40,6 +40,7 @@ #include "spdk/io_channel.h" #include "spdk/assert.h" #include "spdk/env.h" +#include "spdk/util.h" #include "spdk_internal/log.h" #define BLOBFS_TRACE(file, str, args...) \ @@ -104,6 +105,10 @@ struct spdk_filesystem { struct spdk_fs_channel *sync_fs_channel; struct spdk_io_channel *md_io_channel; struct spdk_fs_channel *md_fs_channel; + + struct { + uint32_t max_ops; + } io_target; }; struct spdk_fs_cb_args { @@ -236,12 +241,10 @@ free_fs_request(struct spdk_fs_request *req) } static int -_spdk_fs_channel_create(void *io_device, uint32_t priority, void *ctx_buf, void *unique_ctx) +_spdk_fs_channel_create(struct spdk_filesystem *fs, struct spdk_fs_channel *channel, + uint32_t max_ops) { - struct spdk_filesystem *fs = io_device; - struct spdk_fs_channel *channel = ctx_buf; - uint32_t max_ops = 512; - uint32_t i; + uint32_t i; channel->req_mem = calloc(max_ops, sizeof(struct spdk_fs_request)); if (!channel->req_mem) { @@ -260,6 +263,23 @@ _spdk_fs_channel_create(void *io_device, uint32_t priority, void *ctx_buf, void return 0; } +static int +_spdk_fs_md_channel_create(void *io_device, uint32_t priority, void *ctx_buf, void *unique_ctx) +{ + return _spdk_fs_channel_create(io_device, ctx_buf, 512); +} + +static int +_spdk_fs_io_channel_create(void *io_device, uint32_t priority, void *ctx_buf, void *unique_ctx) +{ + struct spdk_filesystem *fs; + struct spdk_fs_channel *channel = ctx_buf; + + fs = SPDK_CONTAINEROF(io_device, struct spdk_filesystem, io_target); + + return _spdk_fs_channel_create(fs, channel, fs->io_target.max_ops); +} + static void _spdk_fs_channel_destroy(void *io_device, void *ctx_buf) { @@ -319,7 +339,7 @@ fs_alloc(struct spdk_bs_dev *dev, fs_send_request_fn send_request_fn) fs->bdev = dev; fs->send_request = send_request_fn; TAILQ_INIT(&fs->files); - spdk_io_device_register(fs, _spdk_fs_channel_create, _spdk_fs_channel_destroy, + spdk_io_device_register(fs, _spdk_fs_md_channel_create, _spdk_fs_channel_destroy, sizeof(struct spdk_fs_channel)); fs->md_io_channel = spdk_get_io_channel(fs, SPDK_IO_PRIORITY_DEFAULT, true, NULL); @@ -328,6 +348,10 @@ fs_alloc(struct spdk_bs_dev *dev, fs_send_request_fn send_request_fn) fs->sync_io_channel = spdk_get_io_channel(fs, SPDK_IO_PRIORITY_DEFAULT, true, NULL); fs->sync_fs_channel = spdk_io_channel_get_ctx(fs->sync_io_channel); + fs->io_target.max_ops = 512; + spdk_io_device_register(&fs->io_target, _spdk_fs_io_channel_create, _spdk_fs_channel_destroy, + sizeof(struct spdk_fs_channel)); + __initialize_cache(); return fs; @@ -490,6 +514,7 @@ unload_cb(void *ctx, int bserrno) args->fn.fs_op(args->arg, bserrno); free(req); + spdk_io_device_unregister(&fs->io_target); spdk_io_device_unregister(fs); free(fs); } @@ -1363,7 +1388,7 @@ spdk_fs_alloc_io_channel(struct spdk_filesystem *fs, uint32_t priority) struct spdk_io_channel *io_channel; struct spdk_fs_channel *fs_channel; - io_channel = spdk_get_io_channel(fs, priority, true, NULL); + io_channel = spdk_get_io_channel(&fs->io_target, priority, false, NULL); fs_channel = spdk_io_channel_get_ctx(io_channel); fs_channel->bs_channel = spdk_bs_alloc_io_channel(fs->bs, SPDK_IO_PRIORITY_DEFAULT); fs_channel->send_request = __send_request_direct; @@ -1377,7 +1402,7 @@ spdk_fs_alloc_io_channel_sync(struct spdk_filesystem *fs, uint32_t priority) struct spdk_io_channel *io_channel; struct spdk_fs_channel *fs_channel; - io_channel = spdk_get_io_channel(fs, priority, true, NULL); + io_channel = spdk_get_io_channel(&fs->io_target, priority, false, NULL); fs_channel = spdk_io_channel_get_ctx(io_channel); fs_channel->send_request = fs->send_request;