Commit 4d91b4ef authored by rafalste's avatar rafalste Committed by Tomasz Zawadzki
Browse files

bdev/ocf: add cache line size



Define cache line size when creating cache device.

Signed-off-by: default avatarrafalste <rafal.stefanowski@intel.com>
Change-Id: Ica536a9bda35c355b4dd4e406a241defc1453f53
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/3449


Community-CI: Mellanox Build Bot
Reviewed-by: default avatarTomasz Zawadzki <tomasz.zawadzki@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
parent 102f6256
Loading
Loading
Loading
Loading
+29 −12
Original line number Diff line number Diff line
@@ -761,6 +761,8 @@ vbdev_ocf_write_json_config(struct spdk_bdev *bdev, struct spdk_json_write_ctx *
	spdk_json_write_named_string(w, "name", vbdev->name);
	spdk_json_write_named_string(w, "mode",
				     ocf_get_cache_modename(ocf_cache_get_mode(vbdev->ocf_cache)));
	spdk_json_write_named_uint32(w, "cache_line_size",
				     ocf_cache_get_line_size(vbdev->ocf_cache));
	spdk_json_write_named_string(w, "cache_bdev_name", vbdev->cache.name);
	spdk_json_write_named_string(w, "core_bdev_name", vbdev->core.name);
	spdk_json_write_object_end(w);
@@ -1139,17 +1141,11 @@ init_vbdev_config(struct vbdev_ocf *vbdev)
	 * metadata support */
	cfg->cache.metadata_volatile = false;

	/* TODO [cache line size]: make cache line size configurable
	 * Using standard 4KiB for now */
	cfg->cache.cache_line_size = ocf_cache_line_size_4;

	/* This are suggested values that
	 * should be sufficient for most use cases */
	cfg->cache.backfill.max_queue_size = 65536;
	cfg->cache.backfill.queue_unblock_size = 60000;

	/* TODO [cache line size] */
	cfg->device.cache_line_size = ocf_cache_line_size_4;
	cfg->device.force = true;
	cfg->device.perform_test = false;
	cfg->device.discard_on_start = false;
@@ -1184,6 +1180,7 @@ init_vbdev_config(struct vbdev_ocf *vbdev)
static int
init_vbdev(const char *vbdev_name,
	   const char *cache_mode_name,
	   const uint64_t cache_line_size,
	   const char *cache_name,
	   const char *core_name,
	   bool loadq)
@@ -1220,6 +1217,17 @@ init_vbdev(const char *vbdev_name,
		goto error_free;
	}

	ocf_cache_line_size_t set_cache_line_size = cache_line_size ?
			(ocf_cache_line_size_t)cache_line_size * KiB :
			ocf_cache_line_size_default;
	if (set_cache_line_size == 0) {
		SPDK_ERRLOG("Cache line size should be non-zero.\n");
		rc = -EINVAL;
		goto error_free;
	}
	vbdev->cfg.device.cache_line_size = set_cache_line_size;
	vbdev->cfg.cache.cache_line_size = set_cache_line_size;

	vbdev->name = strdup(vbdev_name);
	if (!vbdev->name) {
		goto error_mem;
@@ -1252,9 +1260,10 @@ error_free:
static int
vbdev_ocf_init(void)
{
	const char *vbdev_name, *modename, *cache_name, *core_name;
	const char *vbdev_name, *modename, *cache_line_size, *cache_name, *core_name;
	struct spdk_conf_section *sp;
	int status;
	uint64_t cache_line_size_uint64;

	status = vbdev_ocf_ctx_init();
	if (status) {
@@ -1291,19 +1300,26 @@ vbdev_ocf_init(void)
			continue;
		}

		cache_name = spdk_conf_section_get_nmval(sp, "OCF", i, 2);
		cache_line_size = spdk_conf_section_get_nmval(sp, "OCF", i, 2);
		if (!cache_line_size) {
			SPDK_ERRLOG("No cache line size specified for OCF vbdev '%s'\n", vbdev_name);
			continue;
		}
		cache_line_size_uint64 = strtoull(cache_line_size, NULL, 10);

		cache_name = spdk_conf_section_get_nmval(sp, "OCF", i, 3);
		if (!cache_name) {
			SPDK_ERRLOG("No cache device specified for OCF vbdev '%s'\n", vbdev_name);
			continue;
		}

		core_name = spdk_conf_section_get_nmval(sp, "OCF", i, 3);
		core_name = spdk_conf_section_get_nmval(sp, "OCF", i, 4);
		if (!core_name) {
			SPDK_ERRLOG("No core devices specified for OCF vbdev '%s'\n", vbdev_name);
			continue;
		}

		status = init_vbdev(vbdev_name, modename, cache_name, core_name, false);
		status = init_vbdev(vbdev_name, modename, cache_line_size_uint64, cache_name, core_name, false);
		if (status) {
			SPDK_ERRLOG("Config initialization failed with code: %d\n", status);
		}
@@ -1437,6 +1453,7 @@ attach_base_bdevs(struct vbdev_ocf *vbdev,
void
vbdev_ocf_construct(const char *vbdev_name,
		    const char *cache_mode_name,
		    const uint64_t cache_line_size,
		    const char *cache_name,
		    const char *core_name,
		    bool loadq,
@@ -1448,7 +1465,7 @@ vbdev_ocf_construct(const char *vbdev_name,
	struct spdk_bdev *core_bdev = spdk_bdev_get_by_name(core_name);
	struct vbdev_ocf *vbdev;

	rc = init_vbdev(vbdev_name, cache_mode_name, cache_name, core_name, loadq);
	rc = init_vbdev(vbdev_name, cache_mode_name, cache_line_size, cache_name, core_name, loadq);
	if (rc) {
		cb(rc, NULL, cb_arg);
		return;
@@ -1602,7 +1619,7 @@ metadata_probe_cores_construct(void *priv, int error, unsigned int num_cores)
		}

		ctx->refcnt++;
		vbdev_ocf_construct(vbdev_name, NULL, cache_name, core_name, true,
		vbdev_ocf_construct(vbdev_name, NULL, 0, cache_name, core_name, true,
				    metadata_probe_construct_cb, ctx);
	}

+1 −0
Original line number Diff line number Diff line
@@ -185,6 +185,7 @@ struct vbdev_ocf {
void vbdev_ocf_construct(
	const char *vbdev_name,
	const char *cache_mode_name,
	const uint64_t cache_line_size,
	const char *cache_name,
	const char *core_name,
	bool loadq,
+8 −6
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@
struct rpc_bdev_ocf_create {
	char *name;			/* master vbdev */
	char *mode;			/* OCF mode (choose one) */
	uint64_t cache_line_size;	/* OCF cache line size */
	char *cache_bdev_name;		/* sub bdev */
	char *core_bdev_name;		/* sub bdev */
};
@@ -58,6 +59,7 @@ free_rpc_bdev_ocf_create(struct rpc_bdev_ocf_create *r)
static const struct spdk_json_object_decoder rpc_bdev_ocf_create_decoders[] = {
	{"name", offsetof(struct rpc_bdev_ocf_create, name), spdk_json_decode_string},
	{"mode", offsetof(struct rpc_bdev_ocf_create, mode), spdk_json_decode_string},
	{"cache_line_size", offsetof(struct rpc_bdev_ocf_create, cache_line_size), spdk_json_decode_uint64, true},
	{"cache_bdev_name", offsetof(struct rpc_bdev_ocf_create, cache_bdev_name), spdk_json_decode_string},
	{"core_bdev_name", offsetof(struct rpc_bdev_ocf_create, core_bdev_name), spdk_json_decode_string},
};
@@ -96,8 +98,8 @@ rpc_bdev_ocf_create(struct spdk_jsonrpc_request *request,
		return;
	}

	vbdev_ocf_construct(req.name, req.mode, req.cache_bdev_name, req.core_bdev_name, false,
			    construct_cb, request);
	vbdev_ocf_construct(req.name, req.mode, req.cache_line_size, req.cache_bdev_name,
			    req.core_bdev_name, false, construct_cb, request);
	free_rpc_bdev_ocf_create(&req);
}
SPDK_RPC_REGISTER("bdev_ocf_create", rpc_bdev_ocf_create, SPDK_RPC_RUNTIME)
+9 −0
Original line number Diff line number Diff line
@@ -243,12 +243,21 @@ if __name__ == "__main__":
        print_json(rpc.bdev.bdev_ocf_create(args.client,
                                            name=args.name,
                                            mode=args.mode,
                                            cache_line_size=args.cache_line_size,
                                            cache_bdev_name=args.cache_bdev_name,
                                            core_bdev_name=args.core_bdev_name))
    p = subparsers.add_parser('bdev_ocf_create', aliases=['construct_ocf_bdev'],
                              help='Add an OCF block device')
    p.add_argument('name', help='Name of resulting OCF bdev')
    p.add_argument('mode', help='OCF cache mode', choices=['wb', 'wt', 'pt', 'wa', 'wi', 'wo'])
    p.add_argument(
        '--cache-line-size',
        help='OCF cache line size. The unit is KiB',
        type=int,
        choices=[4, 8, 16, 32, 64],
        required=False,
        default=0,
    )
    p.add_argument('cache_bdev_name', help='Name of underlying cache bdev')
    p.add_argument('core_bdev_name', help='Name of unerlying core bdev')
    p.set_defaults(func=bdev_ocf_create)
+9 −2
Original line number Diff line number Diff line
@@ -110,19 +110,26 @@ def bdev_crypto_delete(client, name):


@deprecated_alias('construct_ocf_bdev')
def bdev_ocf_create(client, name, mode, cache_bdev_name, core_bdev_name):
def bdev_ocf_create(client, name, mode, cache_line_size, cache_bdev_name, core_bdev_name):
    """Add an OCF block device

    Args:
        name: name of constructed OCF bdev
        mode: OCF cache mode: {'wb', 'wt', 'pt', 'wa', 'wi', 'wo'}
        cache_line_size: OCF cache line size. The unit is KiB: {4, 8, 16, 32, 64}
        cache_bdev_name: name of underlying cache bdev
        core_bdev_name: name of underlying core bdev

    Returns:
        Name of created block device
    """
    params = {'name': name, 'mode': mode, 'cache_bdev_name': cache_bdev_name, 'core_bdev_name': core_bdev_name}
    params = {
        'name': name,
        'mode': mode,
        'cache_line_size': cache_line_size,
        'cache_bdev_name': cache_bdev_name,
        'core_bdev_name': core_bdev_name,
    }

    return client.call('bdev_ocf_create', params)

Loading