bdev/ocf: Update OCF to 22.6.1

This OCF update is mainly focused on:
- New volume API
- New cache attach config instead of old cache device config
- UUID moved to different struct
- Persistent metadata is not supported due to metadata flapping (see 689c44c76ba87f80a9538c17220bb9ca6bffdda0 in OCF)

Signed-off-by: Amir Haroush <amir.haroush@huawei.com>
Signed-off-by: Shai Fultheim <shai.fultheim@huawei.com>
Change-Id: Ic3bc0f1b58550dc3b03b0afc9bcb43b2b9b988c6
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/17066
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Mellanox Build Bot
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Robert Baldyga
This commit is contained in:
Amir Haroush 2023-03-05 22:58:47 +02:00 committed by Jim Harris
parent 8e8c360b53
commit 3797564736
5 changed files with 49 additions and 203 deletions

View File

@ -115,6 +115,15 @@ is_ocf_cache_running(struct vbdev_ocf *vbdev)
return false;
}
static bool
is_ocf_cache_initializing(struct vbdev_ocf *vbdev)
{
if (vbdev->cache.attached && vbdev->ocf_cache) {
return ocf_cache_is_initializing(vbdev->ocf_cache);
}
return false;
}
/* Get existing OCF cache instance
* that is started by other vbdev */
static ocf_cache_t
@ -129,7 +138,7 @@ get_other_cache_instance(struct vbdev_ocf *vbdev)
if (strcmp(cmp->cache.name, vbdev->cache.name)) {
continue;
}
if (is_ocf_cache_running(cmp)) {
if (is_ocf_cache_running(cmp) || is_ocf_cache_initializing(cmp)) {
return cmp->ocf_cache;
}
}
@ -604,7 +613,8 @@ io_handle(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io)
flags = OCF_WRITE_FLUSH;
}
io = ocf_core_new_io(vbdev->ocf_core, qctx->queue, offset, len, dir, 0, flags);
io = ocf_volume_new_io(ocf_core_get_front_volume(vbdev->ocf_core), qctx->queue, offset, len, dir, 0,
flags);
if (!io) {
err = -ENOMEM;
goto fail;
@ -994,7 +1004,7 @@ start_cache_cmpl(ocf_cache_t cache, void *priv, int error)
error, vbdev->name);
if (error == -OCF_ERR_NO_MEM) {
ocf_mngt_get_ram_needed(cache, &vbdev->cfg.device, &mem_needed);
ocf_mngt_get_ram_needed(cache, &vbdev->cfg.attach.device, &mem_needed);
SPDK_NOTICELOG("Try to increase hugepage memory size or cache line size. "
"For your configuration:\nDevice size: %"PRIu64" bytes\n"
@ -1095,9 +1105,9 @@ start_cache(struct vbdev_ocf *vbdev)
}
if (vbdev->cfg.loadq) {
ocf_mngt_cache_load(vbdev->ocf_cache, &vbdev->cfg.device, start_cache_cmpl, vbdev);
ocf_mngt_cache_load(vbdev->ocf_cache, &vbdev->cfg.attach, start_cache_cmpl, vbdev);
} else {
ocf_mngt_cache_attach(vbdev->ocf_cache, &vbdev->cfg.device, start_cache_cmpl, vbdev);
ocf_mngt_cache_attach(vbdev->ocf_cache, &vbdev->cfg.attach, start_cache_cmpl, vbdev);
}
}
@ -1129,27 +1139,30 @@ register_vbdev(struct vbdev_ocf *vbdev, vbdev_ocf_mngt_callback cb, void *cb_arg
/* Init OCF configuration options
* for core and cache devices */
static void
static int
init_vbdev_config(struct vbdev_ocf *vbdev)
{
struct vbdev_ocf_config *cfg = &vbdev->cfg;
struct ocf_volume_uuid uuid;
ocf_volume_type_t type;
int ret;
/* Initialize OCF defaults first */
ocf_mngt_cache_device_config_set_default(&cfg->device);
ocf_mngt_cache_attach_config_set_default(&cfg->attach);
ocf_mngt_cache_config_set_default(&cfg->cache);
ocf_mngt_core_config_set_default(&cfg->core);
snprintf(cfg->cache.name, sizeof(cfg->cache.name), "%s", vbdev->name);
snprintf(cfg->core.name, sizeof(cfg->core.name), "%s", vbdev->core.name);
cfg->device.open_cores = false;
cfg->device.perform_test = false;
cfg->device.discard_on_start = false;
cfg->attach.open_cores = false;
cfg->attach.device.perform_test = false;
cfg->attach.discard_on_start = false;
vbdev->cfg.cache.locked = true;
cfg->core.volume_type = SPDK_OBJECT;
cfg->device.volume_type = SPDK_OBJECT;
if (vbdev->cfg.loadq) {
/* When doing cache_load(), we need to set try_add to true,
@ -1159,14 +1172,24 @@ init_vbdev_config(struct vbdev_ocf *vbdev)
} else {
/* When cache is initialized as new, set force flag to true,
* to ignore warnings about existing metadata */
cfg->device.force = true;
cfg->attach.force = true;
}
/* Serialize bdev names in OCF UUID to interpret on future loads
* Core UUID is a triple of (core name, vbdev name, cache name)
* Cache UUID is cache bdev name */
cfg->device.uuid.size = strlen(vbdev->cache.name) + 1;
cfg->device.uuid.data = vbdev->cache.name;
type = ocf_ctx_get_volume_type(vbdev_ocf_ctx, SPDK_OBJECT);
if (!type) {
SPDK_ERRLOG("Fail to get volume type\n");
return -EINVAL;
}
uuid.size = strlen(vbdev->cache.name) + 1;
uuid.data = vbdev->cache.name;
ret = ocf_volume_create(&cfg->attach.device.volume, type, &uuid);
if (ret) {
SPDK_ERRLOG("Fail to create volume\n");
return -EINVAL;
}
snprintf(vbdev->uuid, VBDEV_OCF_MD_MAX_LEN, "%s %s %s",
vbdev->core.name, vbdev->name, vbdev->cache.name);
@ -1174,6 +1197,8 @@ init_vbdev_config(struct vbdev_ocf *vbdev)
cfg->core.uuid.data = vbdev->uuid;
vbdev->uuid[strlen(vbdev->core.name)] = 0;
vbdev->uuid[strlen(vbdev->core.name) + 1 + strlen(vbdev->name)] = 0;
return 0;
}
/* Allocate vbdev structure object and add it to the global list */
@ -1219,7 +1244,12 @@ init_vbdev(const char *vbdev_name,
vbdev->core.is_cache = false;
vbdev->cfg.loadq = loadq;
init_vbdev_config(vbdev);
rc = init_vbdev_config(vbdev);
if (rc) {
SPDK_ERRLOG("Fail to init vbdev config\n");
goto error_free;
}
if (cache_mode_name) {
vbdev->cfg.cache.cache_mode
@ -1243,7 +1273,7 @@ init_vbdev(const char *vbdev_name,
rc = -EINVAL;
goto error_free;
}
vbdev->cfg.device.cache_line_size = set_cache_line_size;
vbdev->cfg.attach.cache_line_size = set_cache_line_size;
vbdev->cfg.cache.cache_line_size = set_cache_line_size;
TAILQ_INSERT_TAIL(&g_ocf_vbdev_head, vbdev, tailq);
@ -1625,85 +1655,6 @@ examine_ctx_put(struct metadata_probe_ctx *ctx)
free(ctx);
}
static void
metadata_probe_construct_cb(int rc, struct vbdev_ocf *vbdev, void *vctx)
{
struct metadata_probe_ctx *ctx = vctx;
examine_ctx_put(ctx);
}
/* This is second callback for ocf_metadata_probe_cores()
* Here we create vbdev configurations based on UUIDs */
static void
metadata_probe_cores_construct(void *priv, int error, unsigned int num_cores)
{
struct metadata_probe_ctx *ctx = priv;
const char *vbdev_name;
const char *core_name;
const char *cache_name;
unsigned int i;
if (error) {
ctx->result = error;
examine_ctx_put(ctx);
return;
}
for (i = 0; i < num_cores; i++) {
core_name = ocf_uuid_to_str(&ctx->core_uuids[i]);
vbdev_name = core_name + strlen(core_name) + 1;
cache_name = vbdev_name + strlen(vbdev_name) + 1;
if (strcmp(ctx->base.bdev->name, cache_name)) {
SPDK_NOTICELOG("OCF metadata found on %s belongs to bdev named '%s'\n",
ctx->base.bdev->name, cache_name);
}
ctx->refcnt++;
vbdev_ocf_construct(vbdev_name, NULL, 0, cache_name, core_name, true,
metadata_probe_construct_cb, ctx);
}
examine_ctx_put(ctx);
}
/* This callback is called after OCF reads cores UUIDs from cache metadata
* Here we allocate memory for those UUIDs and call ocf_metadata_probe_cores() again */
static void
metadata_probe_cores_get_num(void *priv, int error, unsigned int num_cores)
{
struct metadata_probe_ctx *ctx = priv;
unsigned int i;
if (error) {
ctx->result = error;
examine_ctx_put(ctx);
return;
}
ctx->uuid_count = num_cores;
ctx->core_uuids = calloc(num_cores, sizeof(struct ocf_volume_uuid));
if (!ctx->core_uuids) {
ctx->result = -ENOMEM;
examine_ctx_put(ctx);
return;
}
for (i = 0; i < ctx->uuid_count; i++) {
ctx->core_uuids[i].size = OCF_VOLUME_UUID_MAX_SIZE;
ctx->core_uuids[i].data = malloc(OCF_VOLUME_UUID_MAX_SIZE);
if (!ctx->core_uuids[i].data) {
ctx->result = -ENOMEM;
examine_ctx_put(ctx);
return;
}
}
ocf_metadata_probe_cores(vbdev_ocf_ctx, ctx->volume, ctx->core_uuids, ctx->uuid_count,
metadata_probe_cores_construct, ctx);
}
static void
metadata_probe_cb(void *priv, int rc,
struct ocf_metadata_probe_status *status)
@ -1715,12 +1666,9 @@ metadata_probe_cb(void *priv, int rc,
if (rc != -OCF_ERR_NO_METADATA) {
ctx->result = rc;
}
examine_ctx_put(ctx);
return;
}
ocf_metadata_probe_cores(vbdev_ocf_ctx, ctx->volume, NULL, 0,
metadata_probe_cores_get_num, ctx);
examine_ctx_put(ctx);
}
/* This is called after vbdev_ocf_examine

View File

@ -57,7 +57,7 @@ struct vbdev_ocf_config {
struct ocf_mngt_cache_config cache;
/* Cache device config */
struct ocf_mngt_cache_device_config device;
struct ocf_mngt_cache_attach_config attach;
/* Core initial config */
struct ocf_mngt_core_config core;

2
ocf

@ -1 +1 @@
Subproject commit 4477cb55a0bcd313a5ebcfdf877ca76a31695df7
Subproject commit d1d6d7cb5f55b616d2aa5123f84ce4ece10fdb0b

View File

@ -1,101 +0,0 @@
#!/usr/bin/env bash
# SPDX-License-Identifier: BSD-3-Clause
# Copyright (C) 2019 Intel Corporation
# All rights reserved.
#
curdir=$(dirname $(readlink -f "${BASH_SOURCE[0]}"))
rootdir=$(readlink -f $curdir/../../..)
source $rootdir/test/ocf/common.sh
source $rootdir/scripts/common.sh
source $rootdir/test/common/autotest_common.sh
rpc_py=$rootdir/scripts/rpc.py
$rootdir/scripts/setup.sh
mapfile -t config < <("$rootdir/scripts/gen_nvme.sh")
# Drop anything from last closing ] so we can inject our own config pieces ...
config=("${config[@]::${#config[@]}-2}")
# ... and now convert entire array to a single string item
config=("${config[*]}")
config+=(
"$(
cat <<- JSON
{
"method": "bdev_split_create",
"params": {
"base_bdev": "Nvme0n1",
"split_count": 7,
"split_size_mb": 128
}
}
JSON
)"
)
config+=(
"$(
cat <<- JSON
{
"method": "bdev_wait_for_examine"
}
JSON
)"
)
# First ']}' closes our config and bdev subsystem blocks
jq . <<- CONFIG > "$curdir/config"
{"subsystems":[
$(
IFS=","
printf '%s\n' "${config[*]}"
)
]}]}
CONFIG
# Clear nvme device which we will use in test
clear_nvme
"$SPDK_BIN_DIR/iscsi_tgt" --json "$curdir/config" &
spdk_pid=$!
waitforlisten $spdk_pid
# Create ocf on persistent storage
$rpc_py bdev_ocf_create ocfWT wt Nvme0n1p0 Nvme0n1p1
$rpc_py bdev_ocf_create ocfPT pt Nvme0n1p2 Nvme0n1p3
$rpc_py bdev_ocf_create ocfWB0 wb Nvme0n1p4 Nvme0n1p5
$rpc_py bdev_ocf_create ocfWB1 wb Nvme0n1p4 Nvme0n1p6
# Sorting bdevs because we dont guarantee that they are going to be
# in the same order after shutdown
($rpc_py bdev_ocf_get_bdevs | jq '(.. | arrays) |= sort') > ./ocf_bdevs
trap - SIGINT SIGTERM EXIT
killprocess $spdk_pid
# Check for ocf persistency after restart
"$SPDK_BIN_DIR/iscsi_tgt" --json "$curdir/config" &
spdk_pid=$!
trap 'killprocess $spdk_pid; rm -f $curdir/config ocf_bdevs ocf_bdevs_verify; exit 1' SIGINT SIGTERM EXIT
waitforlisten $spdk_pid
sleep 5
# OCF should be loaded now as well
($rpc_py bdev_ocf_get_bdevs | jq '(.. | arrays) |= sort') > ./ocf_bdevs_verify
diff ocf_bdevs ocf_bdevs_verify
trap - SIGINT SIGTERM EXIT
killprocess $spdk_pid
rm -f $curdir/config ocf_bdevs ocf_bdevs_verify
clear_nvme $bdf

View File

@ -14,6 +14,5 @@ run_test "ocf_stats" "$testdir/integrity/stats.sh"
run_test "ocf_flush" "$testdir/integrity/flush.sh"
run_test "ocf_create_destruct" "$testdir/management/create-destruct.sh"
run_test "ocf_multicore" "$testdir/management/multicore.sh"
run_test "ocf_persistent_metadata" "$testdir/management/persistent-metadata.sh"
run_test "ocf_remove" "$testdir/management/remove.sh"
run_test "ocf_configuration_change" "$testdir/management/configuration-change.sh"