bdev/ftl: Remove punit parameter from ftl bdev configuration

FTL library is consuming whole OCSSD device
so punit parameter is not needed for bdev ftl
configuration.

Change-Id: I56f62ea6d09b3157b70c02ccfffcd3cb07ba4597
Signed-off-by: Wojciech Malikowski <wojciech.malikowski@intel.com>
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/467950
Reviewed-by: Konrad Sztyber <konrad.sztyber@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Broadcom SPDK FC-NVMe CI <spdk-ci.pdl@broadcom.com>
This commit is contained in:
Wojciech Malikowski 2019-09-10 09:01:27 -04:00 committed by Tomasz Zawadzki
parent e47e16d3a4
commit 52a9661d94
14 changed files with 42 additions and 129 deletions

View File

@ -1106,7 +1106,6 @@ spdk_ftl_dev_init(const struct spdk_ftl_dev_init_opts *_opts, spdk_ftl_init_fn c
dev->init_ctx.cb_fn = cb_fn;
dev->init_ctx.cb_arg = cb_arg;
dev->init_ctx.thread = spdk_get_thread();
dev->range = opts.range;
dev->limit = SPDK_FTL_LIMIT_MAX;
dev->name = strdup(opts.name);
@ -1127,6 +1126,9 @@ spdk_ftl_dev_init(const struct spdk_ftl_dev_init_opts *_opts, spdk_ftl_init_fn c
goto fail_sync;
}
dev->range.begin = 0;
dev->range.end = dev->geo.num_pu * dev->geo.num_grp - 1;
if (ftl_check_init_opts(&opts, &dev->geo)) {
SPDK_ERRLOG("Invalid device configuration\n");
goto fail_sync;

View File

@ -418,7 +418,6 @@ _bdev_ftl_write_config_info(struct ftl_bdev *ftl_bdev, struct spdk_json_write_ct
}
spdk_json_write_named_string(w, "traddr", ftl_bdev->ctrlr->trid.traddr);
spdk_json_write_named_string_fmt(w, "punits", "%d-%d", attrs.range.begin, attrs.range.end);
if (ftl_bdev->cache_bdev_desc) {
cache_bdev = spdk_bdev_get_name(spdk_bdev_desc_get_bdev(ftl_bdev->cache_bdev_desc));
@ -492,59 +491,6 @@ static const struct spdk_bdev_fn_table ftl_fn_table = {
.dump_info_json = bdev_ftl_dump_info_json,
};
int
bdev_ftl_parse_punits(struct spdk_ftl_punit_range *range, const char *range_string)
{
regex_t range_regex;
regmatch_t range_match;
unsigned long begin = 0, end = 0;
char *str_ptr;
int rc = -1;
if (regcomp(&range_regex, "\\b[[:digit:]]+-[[:digit:]]+\\b", REG_EXTENDED)) {
SPDK_ERRLOG("Regex init error\n");
return -1;
}
if (regexec(&range_regex, range_string, 1, &range_match, 0)) {
SPDK_WARNLOG("Invalid range\n");
goto out;
}
errno = 0;
begin = strtoul(range_string + range_match.rm_so, &str_ptr, 10);
if ((begin == ULONG_MAX && errno == ERANGE) || (begin == 0 && errno == EINVAL)) {
SPDK_WARNLOG("Invalid range '%s'\n", range_string);
goto out;
}
errno = 0;
/* +1 to skip the '-' delimiter */
end = strtoul(str_ptr + 1, NULL, 10);
if ((end == ULONG_MAX && errno == ERANGE) || (end == 0 && errno == EINVAL)) {
SPDK_WARNLOG("Invalid range '%s'\n", range_string);
goto out;
}
if (begin > UINT_MAX || end > UINT_MAX) {
SPDK_WARNLOG("Invalid range '%s'\n", range_string);
goto out;
}
if (begin > end) {
SPDK_WARNLOG("Invalid range '%s'\n", range_string);
goto out;
}
range->begin = (unsigned int)begin;
range->end = (unsigned int)end;
rc = 0;
out:
regfree(&range_regex);
return rc;
}
static int
bdev_ftl_defer_init(struct ftl_bdev_init_opts *opts)
{
@ -599,19 +545,6 @@ bdev_ftl_read_bdev_config(struct spdk_conf_section *sp,
opts->name = val;
val = spdk_conf_section_get_nmval(sp, "TransportID", i, 2);
if (!val) {
SPDK_ERRLOG("No punit range provided for TransportID: %s\n", trid);
rc = -1;
break;
}
if (bdev_ftl_parse_punits(&opts->range, val)) {
SPDK_ERRLOG("Invalid punit range for TransportID: %s\n", trid);
rc = -1;
break;
}
val = spdk_conf_section_get_nmval(sp, "TransportID", i, 3);
if (!val) {
SPDK_ERRLOG("No UUID provided for TransportID: %s\n", trid);
rc = -1;
@ -631,7 +564,7 @@ bdev_ftl_read_bdev_config(struct spdk_conf_section *sp,
opts->mode = 0;
}
val = spdk_conf_section_get_nmval(sp, "TransportID", i, 4);
val = spdk_conf_section_get_nmval(sp, "TransportID", i, 3);
if (!val) {
continue;
}
@ -741,8 +674,6 @@ bdev_ftl_create_cb(struct spdk_ftl_dev *dev, void *ctx, int status)
SPDK_DEBUGLOG(SPDK_LOG_BDEV_FTL, "Creating bdev %s:\n", ftl_bdev->bdev.name);
SPDK_DEBUGLOG(SPDK_LOG_BDEV_FTL, "\tblock_len:\t%zu\n", attrs.lbk_size);
SPDK_DEBUGLOG(SPDK_LOG_BDEV_FTL, "\tblock_cnt:\t%"PRIu64"\n", attrs.lbk_cnt);
SPDK_DEBUGLOG(SPDK_LOG_BDEV_FTL, "\tpunits:\t\t%u-%u\n", attrs.range.begin,
attrs.range.end);
ftl_bdev->bdev.ctxt = ftl_bdev;
ftl_bdev->bdev.fn_table = &ftl_fn_table;
@ -841,7 +772,6 @@ bdev_ftl_create(struct spdk_nvme_ctrlr *ctrlr, const struct ftl_bdev_init_opts *
opts.ctrlr = ctrlr;
opts.trid = bdev_opts->trid;
opts.range = bdev_opts->range;
opts.mode = bdev_opts->mode;
opts.uuid = bdev_opts->uuid;
opts.name = ftl_bdev->bdev.name;

View File

@ -41,7 +41,6 @@
#define FTL_MAX_CONTROLLERS 64
#define FTL_MAX_BDEVS (FTL_MAX_CONTROLLERS * 128)
#define FTL_RANGE_MAX_LENGTH 32
struct spdk_bdev;
struct spdk_uuid;
@ -54,8 +53,6 @@ struct ftl_bdev_info {
struct ftl_bdev_init_opts {
/* NVMe controller's transport ID */
struct spdk_nvme_transport_id trid;
/* Parallel unit range */
struct spdk_ftl_punit_range range;
/* Bdev's name */
const char *name;
/* Write buffer bdev's name */
@ -70,7 +67,6 @@ struct ftl_bdev_init_opts {
typedef void (*ftl_bdev_init_fn)(const struct ftl_bdev_info *, void *, int);
int bdev_ftl_parse_punits(struct spdk_ftl_punit_range *range, const char *range_string);
int bdev_ftl_init_bdev(struct ftl_bdev_init_opts *opts, ftl_bdev_init_fn cb,
void *cb_arg);
void bdev_ftl_delete_bdev(const char *name, spdk_bdev_unregister_cb cb_fn, void *cb_arg);

View File

@ -43,7 +43,6 @@ struct rpc_bdev_ftl_create {
char *name;
char *trtype;
char *traddr;
char *punits;
char *uuid;
char *cache_bdev;
struct spdk_ftl_conf ftl_conf;
@ -55,7 +54,6 @@ free_rpc_bdev_ftl_create(struct rpc_bdev_ftl_create *req)
free(req->name);
free(req->trtype);
free(req->traddr);
free(req->punits);
free(req->uuid);
free(req->cache_bdev);
}
@ -64,7 +62,6 @@ static const struct spdk_json_object_decoder rpc_bdev_ftl_create_decoders[] = {
{"name", offsetof(struct rpc_bdev_ftl_create, name), spdk_json_decode_string},
{"trtype", offsetof(struct rpc_bdev_ftl_create, trtype), spdk_json_decode_string},
{"traddr", offsetof(struct rpc_bdev_ftl_create, traddr), spdk_json_decode_string},
{"punits", offsetof(struct rpc_bdev_ftl_create, punits), spdk_json_decode_string},
{"uuid", offsetof(struct rpc_bdev_ftl_create, uuid), spdk_json_decode_string, true},
{"cache", offsetof(struct rpc_bdev_ftl_create, cache_bdev), spdk_json_decode_string, true},
{
@ -125,8 +122,6 @@ static const struct spdk_json_object_decoder rpc_bdev_ftl_create_decoders[] = {
},
};
#define FTL_RANGE_MAX_LENGTH 32
static void
_spdk_rpc_bdev_ftl_create_cb(const struct ftl_bdev_info *bdev_info, void *ctx, int status)
{
@ -156,7 +151,6 @@ spdk_rpc_bdev_ftl_create(struct spdk_jsonrpc_request *request,
{
struct rpc_bdev_ftl_create req = {};
struct ftl_bdev_init_opts opts = {};
char range[FTL_RANGE_MAX_LENGTH];
int rc;
spdk_ftl_conf_init_defaults(&req.ftl_conf);
@ -198,14 +192,6 @@ spdk_rpc_bdev_ftl_create(struct spdk_jsonrpc_request *request,
/* Parse traddr */
snprintf(opts.trid.traddr, sizeof(opts.trid.traddr), "%s", req.traddr);
snprintf(range, sizeof(range), "%s", req.punits);
if (bdev_ftl_parse_punits(&opts.range, req.punits)) {
spdk_jsonrpc_send_error_response_fmt(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS,
"Failed to parse parallel unit range: %s",
req.punits);
goto invalid;
}
if (req.uuid) {
if (spdk_uuid_parse(&opts.uuid, req.uuid) < 0) {

View File

@ -5,20 +5,19 @@ set -e
rootdir=$(readlink -f $(dirname $0))/..
function usage {
echo "Usage: [-j] $0 -a TRANSPORT_ADDR -n BDEV_NAME -l PUNITS [-u UUID] [-c CACHE]"
echo "Usage: [-j] $0 -a TRANSPORT_ADDR -n BDEV_NAME [-u UUID] [-c CACHE]"
echo "UUID is required when restoring device state"
echo
echo "-j json format"
echo "TRANSPORT_ADDR - SSD's PCIe address"
echo "BDEV_NAME - name of the bdev"
echo "PUNITS - bdev's parallel unit range (e.g. 0-3)"
echo "UUID - bdev's uuid (used when in restore mode)"
echo "CACHE - name of the bdev to be used as write buffer cache"
}
function create_classic_config {
echo "[Ftl]"
echo " TransportID \"trtype:PCIe traddr:$1\" $2 $3 $4 $5"
echo " TransportID \"trtype:PCIe traddr:$1\" $2 $3 $4"
}
function create_json_config()
@ -32,12 +31,11 @@ function create_json_config()
echo "\"name\": \"$2\","
echo '"trtype": "PCIe",'
echo "\"traddr\": \"$1\","
echo "\"punits\": \"$3\","
if [ -n "$5" ]; then
echo "\"uuid\": \"$4\","
echo "\"cache\": \"$5\""
if [ -n "$4" ]; then
echo "\"uuid\": \"$3\","
echo "\"cache\": \"$4\""
else
echo "\"uuid\": \"$4\""
echo "\"uuid\": \"$3\""
fi
echo '}'
echo '}'
@ -52,7 +50,6 @@ while getopts "ja:n:l:m:u:c:h" arg; do
j) json=1 ;;
a) addr=$OPTARG ;;
n) name=$OPTARG ;;
l) punits=$OPTARG ;;
u) uuid=$OPTARG ;;
c) cache=$OPTARG ;;
h) usage
@ -62,13 +59,13 @@ while getopts "ja:n:l:m:u:c:h" arg; do
esac
done
if [[ -z "$addr" || -z "$name" || -z "$punits" ]]; then
if [[ -z "$addr" || -z "$name" ]]; then
usage
exit 1
fi
if [ -n "$json" ]; then
create_json_config $addr $name $punits $uuid $cache
create_json_config $addr $name $uuid $cache
else
create_classic_config $addr $name $punits $uuid $cache
create_classic_config $addr $name $uuid $cache
fi

View File

@ -1542,7 +1542,6 @@ Format: 'user:u1 secret:s1 muser:mu1 msecret:ms1,user:u2 secret:s2 muser:mu2 mse
name=args.name,
trtype=args.trtype,
traddr=args.traddr,
punits=args.punits,
uuid=args.uuid,
cache=args.cache,
allow_open_bands=args.allow_open_bands,
@ -1556,8 +1555,6 @@ Format: 'user:u1 secret:s1 muser:mu1 msecret:ms1,user:u2 secret:s2 muser:mu2 mse
help='NVMe target trtype: e.g., pcie', default='pcie')
p.add_argument('-a', '--traddr',
help='NVMe target address: e.g., an ip address or BDF', required=True)
p.add_argument('-l', '--punits', help='Parallel unit range in the form of start-end: e.g. 4-8',
required=True)
p.add_argument('-u', '--uuid', help='UUID of restored bdev (not applicable when creating new '
'instance): e.g. b286d19a-0059-4709-abcd-9f7732b1567d (optional)')
p.add_argument('-c', '--cache', help='Name of the bdev to be used as a write buffer cache (optional)')

View File

@ -884,20 +884,18 @@ def bdev_split_delete(client, base_bdev):
@deprecated_alias('construct_ftl_bdev')
def bdev_ftl_create(client, name, trtype, traddr, punits, **kwargs):
def bdev_ftl_create(client, name, trtype, traddr, **kwargs):
"""Construct FTL bdev
Args:
name: name of the bdev
trtype: transport type
traddr: transport address
punit: parallel unit range
kwargs: optional parameters
"""
params = {'name': name,
'trtype': trtype,
'traddr': traddr,
'punits': punits}
'traddr': traddr}
for key, value in kwargs.items():
if value is not None:
params[key] = value

View File

@ -8,7 +8,7 @@ tests=('-q 1 -w randwrite -t 4 -o 69632' '-q 128 -w randwrite -t 4 -o 4096' '-q
device=$1
ftl_bdev_conf=$testdir/config/ftl.conf
$rootdir/scripts/gen_ftl.sh -a $device -n nvme0 -l 0-3 > $ftl_bdev_conf
$rootdir/scripts/gen_ftl.sh -a $device -n nvme0 > $ftl_bdev_conf
for (( i=0; i<${#tests[@]}; i++ )) do
timing_enter "${tests[$i]}"

View File

@ -5,6 +5,16 @@ function get_chunk_size() {
grep 'Logical blks per chunk' | sed 's/[^0-9]//g'
}
function get_num_group() {
$rootdir/examples/nvme/identify/identify -r "trtype:PCIe traddr:$1" |
grep 'Groups' | sed 's/[^0-9]//g'
}
function get_num_pu() {
$rootdir/examples/nvme/identify/identify -r "trtype:PCIe traddr:$1" |
grep 'PUs' | sed 's/[^0-9]//g'
}
function has_separate_md() {
local md_type
md_type=$($rootdir/examples/nvme/identify/identify -r "trtype:PCIe traddr:$1" | \

View File

@ -6,8 +6,6 @@ source $rootdir/test/common/autotest_common.sh
source $testdir/common.sh
rpc_py=$rootdir/scripts/rpc.py
pu_start=0
pu_end=3
while getopts ':u:c:' opt; do
case $opt in
@ -33,7 +31,9 @@ restore_kill() {
trap "restore_kill; exit 1" SIGINT SIGTERM EXIT
chunk_size=$(get_chunk_size $device)
pu_count=$((pu_end - pu_start + 1))
num_group=$(get_num_group $device)
num_pu=$(get_num_pu $device)
pu_count=$((num_group * num_pu))
# Write one band worth of data + one extra chunk
data_size=$((chunk_size * (pu_count + 1)))
@ -45,7 +45,7 @@ if [ -n "$nv_cache" ]; then
nvc_bdev=$(create_nv_cache_bdev nvc0 $device $nv_cache $pu_count)
fi
ftl_construct_args="bdev_ftl_create -b nvme0 -a $device -l $pu_start-$pu_end -o"
ftl_construct_args="bdev_ftl_create -b nvme0 -a $device -o"
[ -n "$nvc_bdev" ] && ftl_construct_args+=" -c $nvc_bdev"
[ -n "$uuid" ] && ftl_construct_args+=" -u $uuid"

View File

@ -26,9 +26,9 @@ export FTL_BDEV_CONF=$testdir/config/ftl.conf
export FTL_BDEV_NAME=nvme0
if [ -z "$uuid" ]; then
$rootdir/scripts/gen_ftl.sh -a $device -n nvme0 -l 0-3 > $FTL_BDEV_CONF
$rootdir/scripts/gen_ftl.sh -a $device -n nvme0 > $FTL_BDEV_CONF
else
$rootdir/scripts/gen_ftl.sh -a $device -n nvme0 -l 0-3 -u $uuid > $FTL_BDEV_CONF
$rootdir/scripts/gen_ftl.sh -a $device -n nvme0 -u $uuid > $FTL_BDEV_CONF
fi
for test in ${tests}; do

View File

@ -67,7 +67,7 @@ if [ $SPDK_TEST_FTL_EXTENDED -eq 1 ]; then
trap 'killprocess $svc_pid; exit 1' SIGINT SIGTERM EXIT
waitforlisten $svc_pid
uuid=$($rpc_py bdev_ftl_create -b nvme0 -a $device -l 0-3 | jq -r '.uuid')
uuid=$($rpc_py bdev_ftl_create -b nvme0 -a $device | jq -r '.uuid')
killprocess $svc_pid
trap - SIGINT SIGTERM EXIT

View File

@ -20,21 +20,17 @@ $rootdir/app/spdk_tgt/spdk_tgt & svcpid=$!
waitforlisten $svcpid
# Create new bdev from json configuration
$rootdir/scripts/gen_ftl.sh -j -a $device -n nvme0 -l 0-1 | $rpc_py load_subsystem_config
$rootdir/scripts/gen_ftl.sh -j -a $device -n nvme0 | $rpc_py load_subsystem_config
uuid=$($rpc_py bdev_get_bdevs | jq -r '.[0].uuid')
$rpc_py bdev_ftl_delete -b nvme0
# Restore bdev from json configuration
$rootdir/scripts/gen_ftl.sh -j -a $device -n nvme0 -l 0-1 -u $uuid | $rpc_py load_subsystem_config
# Create new bdev from json configuration
$rootdir/scripts/gen_ftl.sh -j -a $device -n nvme1 -l 2-2 | $rpc_py load_subsystem_config
# Create new bdev from RPC
$rpc_py bdev_ftl_create -b nvme2 -a $device -l 3-3
$rpc_py bdev_ftl_delete -b nvme2
$rootdir/scripts/gen_ftl.sh -j -a $device -n nvme0 -u $uuid | $rpc_py load_subsystem_config
$rpc_py bdev_ftl_delete -b nvme0
# Create new bdev from RPC
$rpc_py bdev_ftl_create -b nvme1 -a $device
$rpc_py bdev_ftl_delete -b nvme1
# TODO: add negative test cases

View File

@ -8,8 +8,6 @@ source $testdir/common.sh
rpc_py=$rootdir/scripts/rpc.py
mount_dir=$(mktemp -d)
pu_start=0
pu_end=3
while getopts ':u:c:' opt; do
case $opt in
@ -20,6 +18,9 @@ while getopts ':u:c:' opt; do
done
shift $((OPTIND -1))
device=$1
num_group=$(get_num_group $device)
num_pu=$(get_num_pu $device)
pu_count=$((num_group * num_pu))
restore_kill() {
if mount | grep $mount_dir; then
@ -42,10 +43,10 @@ $rootdir/app/spdk_tgt/spdk_tgt & svcpid=$!
waitforlisten $svcpid
if [ -n "$nv_cache" ]; then
nvc_bdev=$(create_nv_cache_bdev nvc0 $device $nv_cache $((pu_end - pu_start + 1)))
nvc_bdev=$(create_nv_cache_bdev nvc0 $device $nv_cache $pu_count)
fi
ftl_construct_args="bdev_ftl_create -b nvme0 -a $device -l ${pu_start}-${pu_end}"
ftl_construct_args="bdev_ftl_create -b nvme0 -a $device"
[ -n "$uuid" ] && ftl_construct_args+=" -u $uuid"
[ -n "$nv_cache" ] && ftl_construct_args+=" -c $nvc_bdev"