diff --git a/module/bdev/ocf/vbdev_ocf.c b/module/bdev/ocf/vbdev_ocf.c index 4997772cd..2a32dca8f 100644 --- a/module/bdev/ocf/vbdev_ocf.c +++ b/module/bdev/ocf/vbdev_ocf.c @@ -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); } diff --git a/module/bdev/ocf/vbdev_ocf.h b/module/bdev/ocf/vbdev_ocf.h index d0fd0b183..b313e9e0c 100644 --- a/module/bdev/ocf/vbdev_ocf.h +++ b/module/bdev/ocf/vbdev_ocf.h @@ -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, diff --git a/module/bdev/ocf/vbdev_ocf_rpc.c b/module/bdev/ocf/vbdev_ocf_rpc.c index 89286fe23..8cba65093 100644 --- a/module/bdev/ocf/vbdev_ocf_rpc.c +++ b/module/bdev/ocf/vbdev_ocf_rpc.c @@ -39,10 +39,11 @@ /* Structure to hold the parameters for this RPC method. */ struct rpc_bdev_ocf_create { - char *name; /* master vbdev */ - char *mode; /* OCF mode (choose one) */ - char *cache_bdev_name; /* sub bdev */ - char *core_bdev_name; /* sub bdev */ + 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 */ }; static void @@ -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) diff --git a/scripts/rpc.py b/scripts/rpc.py index 722b6fb5f..55fadaad0 100755 --- a/scripts/rpc.py +++ b/scripts/rpc.py @@ -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) diff --git a/scripts/rpc/bdev.py b/scripts/rpc/bdev.py index aa5dc1c12..fc4182aee 100644 --- a/scripts/rpc/bdev.py +++ b/scripts/rpc/bdev.py @@ -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) diff --git a/test/ocf/management/create-destruct.sh b/test/ocf/management/create-destruct.sh index 162f7a679..c1fd66b36 100755 --- a/test/ocf/management/create-destruct.sh +++ b/test/ocf/management/create-destruct.sh @@ -43,7 +43,7 @@ if bdev_check_claimed Malloc0; then exit 1 fi -$rpc_py bdev_ocf_create FullCache wt Malloc0 Malloc1 +$rpc_py bdev_ocf_create FullCache wt Malloc0 Malloc1 --cache-line-size 8 $rpc_py bdev_ocf_get_bdevs FullCache | jq -e \ '.[0] | .started and .cache.attached and .core.attached' @@ -59,7 +59,7 @@ if bdev_check_claimed Malloc0 && bdev_check_claimed Malloc1; then exit 1 fi -$rpc_py bdev_ocf_create HotCache wt Malloc0 Malloc1 +$rpc_py bdev_ocf_create HotCache wt Malloc0 Malloc1 --cache-line-size 16 if ! (bdev_check_claimed Malloc0 && bdev_check_claimed Malloc1); then echo >&2 "Base devices expected to be claimed now"