From: Aurelien Aptel <aaptel@nvidia.com>
To: aaptel@nvidia.com, linux-block@vger.kernel.org,
linux-nvme@lists.infradead.org
Cc: Daniel Wagner <dwagner@suse.de>,
Chaitanya Kulkarni <chaitanyak@nvidia.com>,
Shai Malin <smalin@nvidia.com>,
Shin'ichiro Kawasaki <shinichiro.kawasaki@wdc.com>
Subject: [PATCH blktests v4 1/5] nvme/rc: introduce remote target support
Date: Tue, 26 Nov 2024 22:38:52 +0200 [thread overview]
Message-ID: <20241126203857.27210-2-aaptel@nvidia.com> (raw)
In-Reply-To: <20241126203857.27210-1-aaptel@nvidia.com>
From: Daniel Wagner <dwagner@suse.de>
Most of the NVMEeoF tests are exercising the host code of the nvme
subsystem. There is no real reason not to run these against an arbitrary
target. We just have to skip the soft target setup and make it possible
to setup a remote target.
Because all tests use now the common setup/cleanup helpers we just need
to intercept this call and forward it to an external component.
As we already have various nvme variables to setup the target which we
should allow to overwrite. Also introduce a NVME_TARGET_CONTROL variable
which points to a script which gets executed whenever a targets needs to
be created/destroyed.
Signed-off-by: Daniel Wagner <dwagner@suse.de>
Signed-off-by: Aurelien Aptel <aaptel@nvidia.com>
---
Documentation/running-tests.md | 33 ++++++++++++++++
check | 4 ++
common/nvme | 71 ++++++++++++++++++++++++++++++----
tests/nvme/rc | 14 +++++++
4 files changed, 114 insertions(+), 8 deletions(-)
diff --git a/Documentation/running-tests.md b/Documentation/running-tests.md
index 968702e..fe4f729 100644
--- a/Documentation/running-tests.md
+++ b/Documentation/running-tests.md
@@ -120,6 +120,9 @@ The NVMe tests can be additionally parameterized via environment variables.
- NVME_NUM_ITER: 1000 (default)
The number of iterations a test should do. This parameter had an old name
'nvme_num_iter'. The old name is still usable, but not recommended.
+- NVME_TARGET_CONTROL: When defined, the generic target setup/cleanup code will
+ be skipped and this script gets called. This makes it possible to run
+ the fabric nvme tests against a real target.
### Running nvme-rdma and SRP tests
@@ -167,3 +170,33 @@ if ! findmnt -t configfs /sys/kernel/config > /dev/null; then
mount -t configfs configfs /sys/kernel/config
fi
```
+### NVME_TARGET_CONTROL
+
+When NVME_TARGET_CONTROL is set, blktests will call the script which the
+environment variable points to, to fetch the configuration values to be used for
+the runs, e.g subsysnqn or hostnqn. This allows the blktest to be run against
+external configured/setup targets.
+
+The blktests expects that the script interface implements following
+commands:
+
+config:
+ --show-blkdev-type
+ --show-trtype
+ --show-hostnqn
+ --show-hostid
+ --show-host-traddr
+ --show-traddr
+ --show-trsvid
+ --show-subsys-uuid
+ --show-subsysnqn
+
+setup:
+ --subsysnqn SUBSYSNQN
+ --subsys-uuid SUBSYS_UUID
+ --hostnqn HOSTNQN
+ --ctrlkey CTRLKEY
+ --hostkey HOSTKEY
+
+cleanup:
+ --subsysnqn SUBSYSNQN
diff --git a/check b/check
index 7f43a31..dad5e70 100755
--- a/check
+++ b/check
@@ -603,6 +603,10 @@ _run_group() {
# shellcheck disable=SC1090
. "tests/${group}/rc"
+ if declare -fF group_setup >/dev/null; then
+ group_setup
+ fi
+
if declare -fF group_requires >/dev/null; then
group_requires
if [[ -v SKIP_REASONS ]]; then
diff --git a/common/nvme b/common/nvme
index fd472fe..f99af5a 100644
--- a/common/nvme
+++ b/common/nvme
@@ -22,6 +22,7 @@ _check_conflict_and_set_default NVME_IMG_SIZE nvme_img_size 1G
_check_conflict_and_set_default NVME_NUM_ITER nvme_num_iter 1000
nvmet_blkdev_type=${nvmet_blkdev_type:-"device"}
NVMET_BLKDEV_TYPES=${NVMET_BLKDEV_TYPES:-"device file"}
+nvme_target_control="${NVME_TARGET_CONTROL:-}"
NVMET_CFS="/sys/kernel/config/nvmet/"
nvme_trtype=${nvme_trtype:-}
nvme_adrfam=${nvme_adrfam:-}
@@ -157,6 +158,10 @@ _cleanup_nvmet() {
fi
done
+ if [[ -n "${nvme_target_control}" ]]; then
+ return
+ fi
+
for port in "${NVMET_CFS}"/ports/*; do
name=$(basename "${port}")
echo "WARNING: Test did not clean up port: ${name}"
@@ -208,6 +213,18 @@ _cleanup_nvmet() {
_setup_nvmet() {
_register_test_cleanup _cleanup_nvmet
+
+ if [[ -n "${nvme_target_control}" ]]; then
+ def_hostnqn="$(${nvme_target_control} config --show-hostnqn)"
+ def_hostid="$(${nvme_target_control} config --show-hostid)"
+ def_host_traddr="$(${nvme_target_control} config --show-host-traddr)"
+ def_traddr="$(${nvme_target_control} config --show-traddr)"
+ def_trsvcid="$(${nvme_target_control} config --show-trsvid)"
+ def_subsys_uuid="$(${nvme_target_control} config --show-subsys-uuid)"
+ def_subsysnqn="$(${nvme_target_control} config --show-subsysnqn)"
+ return
+ fi
+
modprobe -q nvmet
if [[ "${nvme_trtype}" != "loop" ]]; then
modprobe -q nvmet-"${nvme_trtype}"
@@ -320,17 +337,23 @@ _nvme_connect_subsys() {
esac
done
- if [[ -z "${port}" ]]; then
- local ports
-
- _get_nvmet_ports "${subsysnqn}" ports
- port="${ports[0]##*/}"
+ if [[ -n "${nvme_target_control}" && -z "${port}" ]]; then
+ ARGS+=(--transport "$(${nvme_target_control} config --show-trtype)")
+ ARGS+=(--traddr "${def_traddr}")
+ ARGS+=(--trsvcid "${def_trsvcid}")
+ else
if [[ -z "${port}" ]]; then
- echo "WARNING: no port found"
- return 1
+ local ports
+
+ _get_nvmet_ports "${subsysnqn}" ports
+ port="${ports[0]##*/}"
+ if [[ -z "${port}" ]]; then
+ echo "WARNING: no port found"
+ return 1
+ fi
fi
+ _get_nvmet_port_params "${port}" ARGS
fi
- _get_nvmet_port_params "${port}" ARGS
ARGS+=(--nqn "${subsysnqn}")
ARGS+=(--hostnqn="${hostnqn}")
ARGS+=(--hostid="${hostid}")
@@ -762,11 +785,13 @@ _find_nvme_ns() {
_nvmet_target_setup() {
local blkdev_type="${nvmet_blkdev_type}"
local blkdev
+ local ARGS=()
local ctrlkey=""
local hostkey=""
local subsysnqn="${def_subsysnqn}"
local subsys_uuid
local port
+ local resv_enable=""
local -a ARGS
while [[ $# -gt 0 ]]; do
@@ -811,6 +836,29 @@ _nvmet_target_setup() {
fi
fi
+ if [[ -n "${hostkey}" ]]; then
+ ARGS+=(--hostkey "${hostkey}")
+ fi
+ if [[ -n "${ctrlkey}" ]]; then
+ ARGS+=(--ctrkey "${ctrlkey}")
+ fi
+
+ if [[ -n "${nvme_target_control}" ]]; then
+ eval "${nvme_target_control}" setup \
+ --subsysnqn "${subsysnqn}" \
+ --subsys-uuid "${subsys_uuid:-$def_subsys_uuid}" \
+ --hostnqn "${def_hostnqn}" \
+ "${ARGS[@]}" &> /dev/null
+ return
+ fi
+
+ truncate -s "${NVME_IMG_SIZE}" "$(_nvme_def_file_path)"
+ if [[ "${blkdev_type}" == "device" ]]; then
+ blkdev="$(losetup -f --show "$(_nvme_def_file_path)")"
+ else
+ blkdev="$(_nvme_def_file_path)"
+ fi
+
ARGS=(--subsysnqn "${subsysnqn}")
if [[ -n "${blkdev}" ]]; then
ARGS+=(--blkdev "${blkdev}")
@@ -853,6 +901,13 @@ _nvmet_target_cleanup() {
esac
done
+ if [[ -n "${nvme_target_control}" ]]; then
+ eval "${nvme_target_control}" cleanup \
+ --subsysnqn "${subsysnqn}" \
+ > /dev/null
+ return
+ fi
+
_get_nvmet_ports "${subsysnqn}" ports
for port in "${ports[@]}"; do
diff --git a/tests/nvme/rc b/tests/nvme/rc
index d63afd1..9ad9a52 100644
--- a/tests/nvme/rc
+++ b/tests/nvme/rc
@@ -113,6 +113,13 @@ _nvme_requires() {
return 0
}
+group_setup() {
+ if [[ -n "${nvme_target_control}" ]]; then
+ NVMET_TRTYPES="$(${nvme_target_control} config --show-trtype)"
+ NVMET_BLKDEV_TYPES="$(${nvme_target_control} config --show-blkdev-type)"
+ fi
+}
+
group_requires() {
_have_root
_NVMET_TRTYPES_is_valid
@@ -392,6 +399,13 @@ _nvmet_passthru_target_cleanup() {
esac
done
+ if [[ -n "${nvme_target_control}" ]]; then
+ eval "${nvme_target_control}" cleanup \
+ --subsysnqn "${subsysnqn}" \
+ > /dev/null
+ return
+ fi
+
_get_nvmet_ports "${subsysnqn}" ports
for port in "${ports[@]}"; do
--
2.34.1
next prev parent reply other threads:[~2024-11-26 20:39 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-11-26 20:38 [PATCH blktests v4 0/5] Add support to run against arbitrary targets Aurelien Aptel
2024-11-26 20:38 ` Aurelien Aptel [this message]
2024-11-29 10:01 ` [PATCH blktests v4 1/5] nvme/rc: introduce remote target support Shinichiro Kawasaki
2024-12-02 10:23 ` Aurelien Aptel
2024-11-26 20:38 ` [PATCH blktests v4 2/5] common/nvme: add digest options to __nvme_connect_subsys() Aurelien Aptel
2024-11-26 20:38 ` [PATCH blktests v4 3/5] nvme/030: only run against kernel soft target Aurelien Aptel
2024-11-26 20:38 ` [PATCH blktests v4 4/5] contrib: add remote target setup/cleanup script Aurelien Aptel
2024-11-26 20:38 ` [PATCH blktests v4 5/5] nvme/055: add test for nvme-tcp zero-copy offload Aurelien Aptel
2024-11-29 10:20 ` Shinichiro Kawasaki
2024-12-02 10:09 ` Aurelien Aptel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20241126203857.27210-2-aaptel@nvidia.com \
--to=aaptel@nvidia.com \
--cc=chaitanyak@nvidia.com \
--cc=dwagner@suse.de \
--cc=linux-block@vger.kernel.org \
--cc=linux-nvme@lists.infradead.org \
--cc=shinichiro.kawasaki@wdc.com \
--cc=smalin@nvidia.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).