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 <benjamin.walker@intel.com>
Reviewed-on: https://review.gerrithub.io/361672
Tested-by: <sys_sgsw@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
Ben Walker 2017-05-17 13:50:36 -07:00 committed by Daniel Verkamp
parent 345f3d7ddb
commit 3b683c188e

View File

@ -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;