public inbox for linux-nvme@lists.infradead.org
 help / color / mirror / Atom feed
From: Hannes Reinecke <hare@suse.de>
To: Daniel Wagner <dwagner@suse.de>,
	Shin'ichiro Kawasaki <shinichiro.kawasaki@wdc.com>
Cc: Chaitanya Kulkarni <chaitanyak@nvidia.com>,
	linux-block@vger.kernel.org, linux-nvme@lists.infradead.org
Subject: Re: [PATCH blktests v3 1/3] nvme/rc: introduce remote target support
Date: Thu, 27 Jun 2024 11:59:11 +0200	[thread overview]
Message-ID: <c3475515-e776-41cd-8c60-e0f5fccea052@suse.de> (raw)
In-Reply-To: <20240627091016.12752-2-dwagner@suse.de>

On 6/27/24 11:10, Daniel Wagner wrote:
> Most of the NVMEeoF tests are exercising the host code of the nvme
> subsystem. There is no real reason not to run these against a real
> 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>
> ---
>   Documentation/running-tests.md | 33 ++++++++++++++++++++
>   check                          |  4 +++
>   tests/nvme/rc                  | 57 ++++++++++++++++++++++++++++++++--
>   3 files changed, 92 insertions(+), 2 deletions(-)
> 
> diff --git a/Documentation/running-tests.md b/Documentation/running-tests.md
> index 968702e76bb5..fe4f729bd037 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 3ed4510f3f40..d0475629773d 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/tests/nvme/rc b/tests/nvme/rc
> index c1ddf412033b..4465dea0370b 100644
> --- a/tests/nvme/rc
> +++ b/tests/nvme/rc
> @@ -23,6 +23,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_TRTYPES_is_valid() {
>   	local type
> @@ -135,6 +136,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
> @@ -359,6 +367,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}"
> @@ -403,11 +415,26 @@ _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}"
>   	fi
> +
>   	modprobe -q nvme-"${nvme_trtype}"
> +
>   	if [[ "${nvme_trtype}" == "rdma" ]]; then
>   		start_soft_rdma
>   		for i in $(rdma_network_interfaces)
> @@ -425,6 +452,7 @@ _setup_nvmet() {
>   			fi
>   		done
>   	fi
> +
>   	if [[ "${nvme_trtype}" = "fc" ]]; then
>   		modprobe -q nvme-fcloop
>   		_setup_fcloop "${def_local_wwnn}" "${def_local_wwpn}" \
> @@ -873,11 +901,13 @@ _find_nvme_passthru_loop_dev() {
>   
>   _nvmet_target_setup() {
>   	local blkdev_type="${nvmet_blkdev_type}"
> +	local subsys_uuid="${def_subsys_uuid}"
> +	local subsysnqn="${def_subsysnqn}"
>   	local blkdev
> +	local ARGS=()
>   	local ctrlkey=""
>   	local hostkey=""
> -	local subsysnqn="${def_subsysnqn}"
> -	local subsys_uuid="${def_subsys_uuid}"
> +	local blkdev
>   	local port
>   
>   	while [[ $# -gt 0 ]]; do
> @@ -909,6 +939,22 @@ _nvmet_target_setup() {
>   		esac
>   	done
>   
> +	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}" \
> +			--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)")"
> @@ -948,6 +994,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

Hmm. This wasn't quite what I had in mind; I think it'd be simpler
if we could just check if the requested controller is visible to the
host already (ie checking sysfs here), and then skip all the setup
steps at they are obviously not required anymore.
That would save quite a lot of issues, and we wouldn't need to specify
a target setup script (or whatever).

Quite a bit of churn, I agree, as that would mean we have to roll

	_setup_nvmet

	_nvmet_target_setup

	_nvme_connect_subsys

all into one function. But it might be easier in the long run.
Hmm?

Cheers,

Hannes
-- 
Dr. Hannes Reinecke                  Kernel Storage Architect
hare@suse.de                                +49 911 74053 688
SUSE Software Solutions GmbH, Frankenstr. 146, 90461 Nürnberg
HRB 36809 (AG Nürnberg), GF: I. Totev, A. McDonald, W. Knoblich



  reply	other threads:[~2024-06-27  9:59 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-06-27  9:10 [PATCH blktests v3 0/3] Add support to run against real target Daniel Wagner
2024-06-27  9:10 ` [PATCH blktests v3 1/3] nvme/rc: introduce remote target support Daniel Wagner
2024-06-27  9:59   ` Hannes Reinecke [this message]
2024-06-27 10:23     ` Daniel Wagner
2024-07-02  8:51   ` Shinichiro Kawasaki
2024-07-02  9:31     ` Shinichiro Kawasaki
2024-06-27  9:10 ` [PATCH blktests v3 2/3] nvme/030: only run against kernel soft target Daniel Wagner
2024-06-27  9:10 ` [PATCH blktests v3 3/3] contrib: add remote target setup/cleanup script Daniel Wagner
2024-06-27  9:28 ` [PATCH blktests v3 0/3] Add support to run against real target Hannes Reinecke
2024-06-27 12:03 ` Christoph Hellwig

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=c3475515-e776-41cd-8c60-e0f5fccea052@suse.de \
    --to=hare@suse.de \
    --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 \
    /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