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:
rafalste 2020-07-16 07:19:17 +02:00 committed by Tomasz Zawadzki
parent 102f6256b8
commit 4d91b4ef01
6 changed files with 58 additions and 22 deletions

View File

@ -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);
}

View File

@ -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,

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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"