Commit 3b683c18 authored by Ben Walker's avatar Ben Walker Committed by Daniel Verkamp
Browse files

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: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-on: https://review.gerrithub.io/361672


Tested-by: default avatar <sys_sgsw@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
parent 345f3d7d
Loading
Loading
Loading
Loading
+33 −8
Original line number Diff line number Diff line
@@ -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,11 +241,9 @@ 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;

	channel->req_mem = calloc(max_ops, sizeof(struct spdk_fs_request));
@@ -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;