[RFC blktests v2 1/3] nvme/rc: introduce remote target support

Shinichiro Kawasaki shinichiro.kawasaki at wdc.com
Thu Jun 13 22:09:50 PDT 2024


On Jun 12, 2024 / 13:04, 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 at suse.de>
> ---
>  Documentation/running-tests.md |  9 +++++++
>  tests/nvme/rc                  | 48 +++++++++++++++++++++++++++++++---
>  2 files changed, 53 insertions(+), 4 deletions(-)
> 
> diff --git a/Documentation/running-tests.md b/Documentation/running-tests.md
> index 968702e76bb5..99dedaebfab0 100644
> --- a/Documentation/running-tests.md
> +++ b/Documentation/running-tests.md
> @@ -120,6 +120,15 @@ 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_TRADDR: transport address. Overwrites the default
> +  transport address. See also NVME_TARGET_CONTROL.
> +- NVME_HOST_TRADDR: host address. Overwrites the default
> +  host address. See also NVME_TARGET_CONTROL.
> +- NVME_TRSVID: transport service id. Overwrite the default
> +  transport service ide. See also NVME_TARGET_CONTROL.
> +- 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.

It might be helpful to add the lines below:

  Refer _nvmet_target_setup() and _nvmet_target_cleanup() for the options
  provided to NVME_TARGET_CONTROL.

>  
>  ### Running nvme-rdma and SRP tests
>  
> diff --git a/tests/nvme/rc b/tests/nvme/rc
> index c1ddf412033b..aaa64453fe16 100644
> --- a/tests/nvme/rc
> +++ b/tests/nvme/rc
> @@ -7,9 +7,10 @@
>  . common/rc
>  . common/multipath-over-rdma
>  
> -def_traddr="127.0.0.1"
> +def_traddr="${NVME_TRADDR:-127.0.0.1}"
> +def_host_traddr="${NVME_HOST_TRADDDR:-}"
>  def_adrfam="ipv4"
> -def_trsvcid="4420"
> +def_trsvcid="${NVME_TRSVID:-4420}"
>  def_remote_wwnn="0x10001100aa000001"
>  def_remote_wwpn="0x20001100aa000001"
>  def_local_wwnn="0x10001100aa000002"
> @@ -23,6 +24,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
> @@ -359,6 +361,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 +409,19 @@ _cleanup_nvmet() {
>  
>  _setup_nvmet() {
>  	_register_test_cleanup _cleanup_nvmet
> +
> +	if [[ -n "${nvme_target_control}" ]]; then
> +		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 +439,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 +888,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 +926,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 2>&1

Nit: the line above can be a bit simpler: "${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 +981,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
> -- 
> 2.45.2
> 


More information about the Linux-nvme mailing list