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, "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);
|
||||
}
|
||||
|
||||
|
@ -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,
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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"
|
||||
|
Loading…
Reference in New Issue
Block a user