bdev/ocf: add cache line size
Define cache line size when creating cache device. Signed-off-by: rafalste <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: Tomasz Zawadzki <tomasz.zawadzki@intel.com> Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com> Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
This commit is contained in:
parent
102f6256b8
commit
4d91b4ef01
@ -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, "name", vbdev->name);
|
||||||
spdk_json_write_named_string(w, "mode",
|
spdk_json_write_named_string(w, "mode",
|
||||||
ocf_get_cache_modename(ocf_cache_get_mode(vbdev->ocf_cache)));
|
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, "cache_bdev_name", vbdev->cache.name);
|
||||||
spdk_json_write_named_string(w, "core_bdev_name", vbdev->core.name);
|
spdk_json_write_named_string(w, "core_bdev_name", vbdev->core.name);
|
||||||
spdk_json_write_object_end(w);
|
spdk_json_write_object_end(w);
|
||||||
@ -1139,17 +1141,11 @@ init_vbdev_config(struct vbdev_ocf *vbdev)
|
|||||||
* metadata support */
|
* metadata support */
|
||||||
cfg->cache.metadata_volatile = false;
|
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
|
/* This are suggested values that
|
||||||
* should be sufficient for most use cases */
|
* should be sufficient for most use cases */
|
||||||
cfg->cache.backfill.max_queue_size = 65536;
|
cfg->cache.backfill.max_queue_size = 65536;
|
||||||
cfg->cache.backfill.queue_unblock_size = 60000;
|
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.force = true;
|
||||||
cfg->device.perform_test = false;
|
cfg->device.perform_test = false;
|
||||||
cfg->device.discard_on_start = false;
|
cfg->device.discard_on_start = false;
|
||||||
@ -1184,6 +1180,7 @@ init_vbdev_config(struct vbdev_ocf *vbdev)
|
|||||||
static int
|
static int
|
||||||
init_vbdev(const char *vbdev_name,
|
init_vbdev(const char *vbdev_name,
|
||||||
const char *cache_mode_name,
|
const char *cache_mode_name,
|
||||||
|
const uint64_t cache_line_size,
|
||||||
const char *cache_name,
|
const char *cache_name,
|
||||||
const char *core_name,
|
const char *core_name,
|
||||||
bool loadq)
|
bool loadq)
|
||||||
@ -1220,6 +1217,17 @@ init_vbdev(const char *vbdev_name,
|
|||||||
goto error_free;
|
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);
|
vbdev->name = strdup(vbdev_name);
|
||||||
if (!vbdev->name) {
|
if (!vbdev->name) {
|
||||||
goto error_mem;
|
goto error_mem;
|
||||||
@ -1252,9 +1260,10 @@ error_free:
|
|||||||
static int
|
static int
|
||||||
vbdev_ocf_init(void)
|
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;
|
struct spdk_conf_section *sp;
|
||||||
int status;
|
int status;
|
||||||
|
uint64_t cache_line_size_uint64;
|
||||||
|
|
||||||
status = vbdev_ocf_ctx_init();
|
status = vbdev_ocf_ctx_init();
|
||||||
if (status) {
|
if (status) {
|
||||||
@ -1291,19 +1300,26 @@ vbdev_ocf_init(void)
|
|||||||
continue;
|
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) {
|
if (!cache_name) {
|
||||||
SPDK_ERRLOG("No cache device specified for OCF vbdev '%s'\n", vbdev_name);
|
SPDK_ERRLOG("No cache device specified for OCF vbdev '%s'\n", vbdev_name);
|
||||||
continue;
|
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) {
|
if (!core_name) {
|
||||||
SPDK_ERRLOG("No core devices specified for OCF vbdev '%s'\n", vbdev_name);
|
SPDK_ERRLOG("No core devices specified for OCF vbdev '%s'\n", vbdev_name);
|
||||||
continue;
|
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) {
|
if (status) {
|
||||||
SPDK_ERRLOG("Config initialization failed with code: %d\n", status);
|
SPDK_ERRLOG("Config initialization failed with code: %d\n", status);
|
||||||
}
|
}
|
||||||
@ -1437,6 +1453,7 @@ attach_base_bdevs(struct vbdev_ocf *vbdev,
|
|||||||
void
|
void
|
||||||
vbdev_ocf_construct(const char *vbdev_name,
|
vbdev_ocf_construct(const char *vbdev_name,
|
||||||
const char *cache_mode_name,
|
const char *cache_mode_name,
|
||||||
|
const uint64_t cache_line_size,
|
||||||
const char *cache_name,
|
const char *cache_name,
|
||||||
const char *core_name,
|
const char *core_name,
|
||||||
bool loadq,
|
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 spdk_bdev *core_bdev = spdk_bdev_get_by_name(core_name);
|
||||||
struct vbdev_ocf *vbdev;
|
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) {
|
if (rc) {
|
||||||
cb(rc, NULL, cb_arg);
|
cb(rc, NULL, cb_arg);
|
||||||
return;
|
return;
|
||||||
@ -1602,7 +1619,7 @@ metadata_probe_cores_construct(void *priv, int error, unsigned int num_cores)
|
|||||||
}
|
}
|
||||||
|
|
||||||
ctx->refcnt++;
|
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);
|
metadata_probe_construct_cb, ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -185,6 +185,7 @@ struct vbdev_ocf {
|
|||||||
void vbdev_ocf_construct(
|
void vbdev_ocf_construct(
|
||||||
const char *vbdev_name,
|
const char *vbdev_name,
|
||||||
const char *cache_mode_name,
|
const char *cache_mode_name,
|
||||||
|
const uint64_t cache_line_size,
|
||||||
const char *cache_name,
|
const char *cache_name,
|
||||||
const char *core_name,
|
const char *core_name,
|
||||||
bool loadq,
|
bool loadq,
|
||||||
|
@ -39,10 +39,11 @@
|
|||||||
|
|
||||||
/* Structure to hold the parameters for this RPC method. */
|
/* Structure to hold the parameters for this RPC method. */
|
||||||
struct rpc_bdev_ocf_create {
|
struct rpc_bdev_ocf_create {
|
||||||
char *name; /* master vbdev */
|
char *name; /* master vbdev */
|
||||||
char *mode; /* OCF mode (choose one) */
|
char *mode; /* OCF mode (choose one) */
|
||||||
char *cache_bdev_name; /* sub bdev */
|
uint64_t cache_line_size; /* OCF cache line size */
|
||||||
char *core_bdev_name; /* sub bdev */
|
char *cache_bdev_name; /* sub bdev */
|
||||||
|
char *core_bdev_name; /* sub bdev */
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
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[] = {
|
static const struct spdk_json_object_decoder rpc_bdev_ocf_create_decoders[] = {
|
||||||
{"name", offsetof(struct rpc_bdev_ocf_create, name), spdk_json_decode_string},
|
{"name", offsetof(struct rpc_bdev_ocf_create, name), spdk_json_decode_string},
|
||||||
{"mode", offsetof(struct rpc_bdev_ocf_create, mode), 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},
|
{"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},
|
{"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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
vbdev_ocf_construct(req.name, req.mode, req.cache_bdev_name, req.core_bdev_name, false,
|
vbdev_ocf_construct(req.name, req.mode, req.cache_line_size, req.cache_bdev_name,
|
||||||
construct_cb, request);
|
req.core_bdev_name, false, construct_cb, request);
|
||||||
free_rpc_bdev_ocf_create(&req);
|
free_rpc_bdev_ocf_create(&req);
|
||||||
}
|
}
|
||||||
SPDK_RPC_REGISTER("bdev_ocf_create", rpc_bdev_ocf_create, SPDK_RPC_RUNTIME)
|
SPDK_RPC_REGISTER("bdev_ocf_create", rpc_bdev_ocf_create, SPDK_RPC_RUNTIME)
|
||||||
|
@ -243,12 +243,21 @@ if __name__ == "__main__":
|
|||||||
print_json(rpc.bdev.bdev_ocf_create(args.client,
|
print_json(rpc.bdev.bdev_ocf_create(args.client,
|
||||||
name=args.name,
|
name=args.name,
|
||||||
mode=args.mode,
|
mode=args.mode,
|
||||||
|
cache_line_size=args.cache_line_size,
|
||||||
cache_bdev_name=args.cache_bdev_name,
|
cache_bdev_name=args.cache_bdev_name,
|
||||||
core_bdev_name=args.core_bdev_name))
|
core_bdev_name=args.core_bdev_name))
|
||||||
p = subparsers.add_parser('bdev_ocf_create', aliases=['construct_ocf_bdev'],
|
p = subparsers.add_parser('bdev_ocf_create', aliases=['construct_ocf_bdev'],
|
||||||
help='Add an OCF block device')
|
help='Add an OCF block device')
|
||||||
p.add_argument('name', help='Name of resulting OCF bdev')
|
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('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('cache_bdev_name', help='Name of underlying cache bdev')
|
||||||
p.add_argument('core_bdev_name', help='Name of unerlying core bdev')
|
p.add_argument('core_bdev_name', help='Name of unerlying core bdev')
|
||||||
p.set_defaults(func=bdev_ocf_create)
|
p.set_defaults(func=bdev_ocf_create)
|
||||||
|
@ -110,19 +110,26 @@ def bdev_crypto_delete(client, name):
|
|||||||
|
|
||||||
|
|
||||||
@deprecated_alias('construct_ocf_bdev')
|
@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
|
"""Add an OCF block device
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
name: name of constructed OCF bdev
|
name: name of constructed OCF bdev
|
||||||
mode: OCF cache mode: {'wb', 'wt', 'pt', 'wa', 'wi', 'wo'}
|
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
|
cache_bdev_name: name of underlying cache bdev
|
||||||
core_bdev_name: name of underlying core bdev
|
core_bdev_name: name of underlying core bdev
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
Name of created block device
|
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)
|
return client.call('bdev_ocf_create', params)
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@ if bdev_check_claimed Malloc0; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
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 \
|
$rpc_py bdev_ocf_get_bdevs FullCache | jq -e \
|
||||||
'.[0] | .started and .cache.attached and .core.attached'
|
'.[0] | .started and .cache.attached and .core.attached'
|
||||||
@ -59,7 +59,7 @@ if bdev_check_claimed Malloc0 && bdev_check_claimed Malloc1; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
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
|
if ! (bdev_check_claimed Malloc0 && bdev_check_claimed Malloc1); then
|
||||||
echo >&2 "Base devices expected to be claimed now"
|
echo >&2 "Base devices expected to be claimed now"
|
||||||
|
Loading…
Reference in New Issue
Block a user