Linux block layer
 help / color / mirror / Atom feed
From: John Meneghini <jmeneghi@redhat.com>
To: Jesse Taube <jtaubepe@redhat.com>, linux-block@vger.kernel.org
Cc: linux-nvme@lists.infradead.org, shinichiro.kawasaki@wdc.com,
	Daniel Wagner <dwagner@suse.de>
Subject: Re: [PATCH blktests 2/2] nvme/070: Test multipath and marginal ports
Date: Wed, 12 Aug 2026 15:03:22 -0400	[thread overview]
Message-ID: <3c866f6f-4064-4ef1-ac6b-c374e53a518d@redhat.com> (raw)
In-Reply-To: <20260812174503.3705830-3-jtaubepe@redhat.com>

Reviewed-by: John Meneghini <jmeneghi@redhat.com>
Tested-by: John Meneghini <jmeneghi@redhat.com>

John A. Meneghini
Senior Principal Platform Storage Engineer
RHEL SST - Platform Storage Group
jmeneghi@redhat.com

On 8/12/26 13:45, Jesse Taube wrote:
> Add tests/nvme/070 to test various multipath and marginal port
> scenarios, while confirming the port useage and state. This test is
> intended to emulate receiving an FPIN event in a multipath environment.
> 
> Suggested-by: John Meneghini <jmeneghi@redhat.com>
> Signed-off-by: Jesse Taube <jtaubepe@redhat.com>
> ---
>   tests/nvme/070     | 521 +++++++++++++++++++++++++++++++++++++++++++++
>   tests/nvme/070.out |  43 ++++
>   2 files changed, 564 insertions(+)
>   create mode 100755 tests/nvme/070
>   create mode 100644 tests/nvme/070.out
> 
> diff --git a/tests/nvme/070 b/tests/nvme/070
> new file mode 100755
> index 0000000..a8002f8
> --- /dev/null
> +++ b/tests/nvme/070
> @@ -0,0 +1,521 @@
> +#!/bin/bash
> +# SPDX-License-Identifier: GPL-3.0+
> +# Copyright (C) 2024 John Meneghini <jmeneghi@redhat.com>
> +#
> +# Test nvme-fc marginal path handling with fcloop
> +
> +. tests/nvme/rc
> +
> +DESCRIPTION="test nvme-fc marginal path handling"
> +
> +requires() {
> +	_nvme_requires
> +	_have_loop
> +	_have_fio
> +	_require_nvme_trtype fc
> +}
> +
> +set_conditions() {
> +	_set_nvme_trtype "$@"
> +}
> +
> +_subsys_rport_addr() {
> +	local RPORT=$1 # /sys/devices/virtual/nvme-subsystem/nvme-subsys3/nvme9
> +
> +	cat "$RPORT"/address
> +	# traddr=nn-0x2047d039ea98949e:pn-0x2048d039ea98949e,host_traddr=nn-0x200000109b9b7e4e:pn-0x100000109b9b7e4e
> +}
> +
> +_subsys_get_port() {
> +	local RPORT=$1 # /sys/devices/virtual/nvme-subsystem/nvme-subsys3/nvme9
> +	local port
> +	local address
> +
> +	address=$(_subsys_rport_addr "$RPORT")
> +	port=$(echo "$address" | sed -n 's/.*pn-\(.*\),.*/\1/p')
> +	echo $(( port - $(_remote_wwpn 0) ))
> +	# a number representing the port number, e.g. 0, 1, 2, 3
> +}
> +
> +_rport_set_iopolicy() {
> +	local RPORT=$1 # /sys/devices/virtual/nvme-subsystem/nvme-subsys3/nvme9
> +	local POLICY=$2 # numa queue-depth round-robin
> +
> +	echo "$POLICY" | sudo tee "$RPORT"/iopolicy > /dev/null
> +	# Returns none
> +}
> +
> +_rport_set_marginal() {
> +	local RPORT=$1 # /sys/devices/virtual/nvme-subsystem/nvme-subsys3/nvme9
> +
> +	_setup_nvmet_port_marginal "$(_subsys_get_port "$RPORT")" "marginal"
> +}
> +
> +_rport_set_online() {
> +	local RPORT=$1 # /sys/devices/virtual/nvme-subsystem/nvme-subsys3/nvme9
> +
> +	_setup_nvmet_port_marginal "$(_subsys_get_port "$RPORT")" "live"
> +}
> +
> +_rport_is_online() {
> +	local RPORT=$1 # /sys/devices/virtual/nvme-subsystem/nvme-subsys3/nvme9
> +
> +	[[ "$(cat "$RPORT"/state)" == "live" ]]
> +	# Returns Success or Fail
> +}
> +
> +_rport_is_marginal() {
> +	local RPORT=$1 # /sys/devices/virtual/nvme-subsystem/nvme-subsys3/nvme9
> +
> +	[[ "$(cat "$RPORT"/state)" == "marginal" ]]
> +	# Returns Success or Fail
> +}
> +
> +_rport_in_use() {
> +	local SUBSYS_PATH=$1 # /sys/devices/virtual/nvme-subsystem/nvme-subsys3/nvme9
> +
> +	# there should only be one "nvme3c9n1" afaik
> +	[[ "$(cat "$SUBSYS_PATH"/nvme*/stat | awk '{print $9}')" != "0" ]]
> +	# Returns exit code 0 if in use, 1 if not in use
> +}
> +
> +_rport_optimized() {
> +	local SUBSYS_PATH=$1 # /sys/devices/virtual/nvme-subsystem/nvme-subsys3/nvme9
> +
> +	# there should only be one "nvme3c9n1" afaik
> +	[[ "$(cat "$SUBSYS_PATH"/nvme*/ana_state)" == "optimized" ]]
> +	# Returns exit code 0 if optimized, 1 if not optimized
> +}
> +
> +# check if link is marginal or not
> +_rport_check_online() {
> +	local RPORT=$1 # /sys/devices/virtual/nvme-subsystem/nvme-subsys3/nvme9
> +	local STATE=$2 # "Online"
> +
> +	if [[ "$STATE" == "Online" ]]; then
> +		if ! _rport_is_online "$RPORT"; then
> +			echo  FC port \("$RPORT"\) is not online, expteced online.
> +			return 1
> +		fi
> +	else
> +		if ! _rport_is_marginal "$RPORT"; then
> +			echo FC port \("$RPORT"\) is not marginal, expteced marginal.
> +			return 1
> +		fi
> +	fi
> +	# Returns Success or Fail
> +}
> +
> +# check if link is in use
> +_rport_check_use() {
> +	local RPORT=$1 # /sys/devices/virtual/nvme-subsystem/nvme-subsys3/nvme9
> +	local STATE=$2 # "Online"
> +
> +	if [[ "$STATE" == "Online" ]]; then
> +		if ! _rport_in_use "$RPORT" ; then
> +			echo FC port on \("$RPORT"\) is not being used, expected use.
> +			return 1
> +		fi
> +	else
> +		if _rport_in_use "$RPORT" ; then
> +			echo FC port on \("$RPORT"\) is being used, expected no use.
> +			return 1
> +		fi
> +	fi
> +	# Returns Success or Fail
> +}
> +
> +# check if all link is in state and use state if optimized
> +_rport_check_opt() {
> +	local RPORT=$1 # /sys/devices/virtual/nvme-subsystem/nvme-subsys3/nvme9
> +	local STATE=$2 # "Online"
> +
> +	_rport_check_online "$RPORT" "$STATE"
> +	# Only optimized paths will be in use
> +	if _rport_optimized "$RPORT"; then
> +		_rport_check_use "$RPORT" "$STATE"
> +	else
> +		_rport_check_use "$RPORT" Marginal
> +	fi
> +	# Returns Success or Fail
> +}
> +
> +# check if all link is in state and use state
> +_rport_check() {
> +	local RPORT=$1 # /sys/devices/virtual/nvme-subsystem/nvme-subsys3/nvme9
> +	local STATE=$2 # "Online"
> +
> +	_rport_check_online "$RPORT" "$STATE"
> +	_rport_check_use "$RPORT" "$STATE"
> +	# Returns Success or Fail
> +}
> +
> +# Check if one of the marginal paths is in use
> +_rport_check_one_use_online() {
> +	local RPORTS_PATHS=("$@") #  /sys/devices/virtual/nvme-subsystem/nvme-subsys3/nvme9
> +
> +	# Check if one of the online paths is in use
> +	for subsys_path in "${RPORTS_PATHS[@]}"; do
> +		# If path is Marginal, continue to the next path
> +		_rport_check_online "$subsys_path" Online || continue
> +		# One of the online paths should be in use
> +		# "!" inverts the return code, so returns false if path is in use,
> +		# running the return statement
> +		! _rport_in_use "$subsys_path" || return 0
> +	done
> +
> +	echo No FC ports are being used, expected atleast one in use when all are online in numa mode.
> +	# None of the online paths were in use
> +	return 1
> +
> +	# Returns Success or Fail
> +}
> +
> +test_set_all_online() {
> +	local IOPOLICY=$1 # "numa" "queue-depth" "round-robin"
> +	shift
> +	local -a RPORTS_PATHS=("$@") # /sys/devices/virtual/nvme-subsystem/nvme-subsys3/nvme9
> +
> +	for subsys_path in "${RPORTS_PATHS[@]}"; do
> +		_rport_set_online "$subsys_path" || return 1
> +		_rport_check_online "$subsys_path" Online || return 1
> +	done
> +
> +	if [ "$IOPOLICY" == "numa" ]; then
> +		_rport_check_one_use_online "${RPORTS_PATHS[@]}" || return 1
> +	else
> +		for subsys_path in "${RPORTS_PATHS[@]}"; do
> +			# Only optimized paths will be in use
> +			_rport_check_opt "$subsys_path" Online || return 1
> +		done
> +	fi
> +}
> +
> +test_set_one_host_marginal() {
> +	local HOST=$1 # host1
> +	shift
> +	local ARGS=("$@")
> +	local RPORTS_CNT="$(( $# / 2 ))"
> +	local PATHS_POS # /sys/devices/virtual/nvme-subsystem/nvme-subsys3/nvme9
> +	local HOSTS_POS # host1 host2
> +
> +	for (( PATHS_POS=0; PATHS_POS < RPORTS_CNT; PATHS_POS++ )); do
> +		HOSTS_POS="$(( RPORTS_CNT + PATHS_POS ))"
> +		if [[ "${ARGS[$HOSTS_POS]}" == "$HOST" ]]; then
> +			_rport_set_marginal "${ARGS[$PATHS_POS]}" || return 1
> +		fi
> +	done
> +
> +	# check if all links are of expected state on hosts
> +	for (( PATHS_POS=0; PATHS_POS < RPORTS_CNT; PATHS_POS++ )); do
> +		HOSTS_POS="$(( RPORTS_CNT + PATHS_POS ))"
> +		if [[ "${ARGS[$HOSTS_POS]}" == "$HOST" ]]; then
> +			_rport_check_opt "${ARGS[$PATHS_POS]}" "Marginal" || return 1
> +		else
> +			_rport_check_opt "${ARGS[$PATHS_POS]}" "Online" || return 1
> +		fi
> +	done
> +}
> +
> +
> +# Check if one of the marginal paths is in use
> +_rport_check_one_use_marginal() {
> +	local -a RPORTS_PATHS=("$@") # /sys/devices/virtual/nvme-subsystem/nvme-subsys3/nvme9
> +
> +	# Check if one of the marginal paths is in use
> +	for subsys_path in "${RPORTS_PATHS[@]}"; do
> +		_rport_check_online "$subsys_path" Marginal
> +		# One of the marginal paths should be in use
> +		# "!" inverts the return code, so returns false if path is in use,
> +		# running the return statement
> +		! _rport_in_use "$subsys_path" || return 0
> +	done
> +
> +	echo No FC ports are being used, expected one in use when all are marginal.
> +	# None of the marginal paths were in use
> +	return 1
> +
> +	# Returns Success or Fail
> +}
> +
> +test_set_all_marginal() {
> +	local -a RPORTS_PATHS=("$@") # /sys/devices/virtual/nvme-subsystem/nvme-subsys3/nvme9
> +
> +	for subsys_path in "${RPORTS_PATHS[@]}"; do
> +		_rport_set_marginal "$subsys_path" || return 1
> +	done
> +
> +	_rport_check_one_use_marginal "${RPORTS_PATHS[@]}"
> +}
> +
> +test_set_one_non_optimized_online() {
> +	local -a RPORTS_PATHS=("$@") # /sys/devices/virtual/nvme-subsystem/nvme-subsys3/nvme9
> +
> +	# Set one non-optimized online
> +	# First set one non-optimized online to online then check optimized paths
> +	local next_marginal=0
> +	for subsys_path in "${RPORTS_PATHS[@]}"; do
> +		if ! _rport_optimized "$subsys_path"; then
> +			if [ $next_marginal == 1 ]; then
> +				_rport_check "$subsys_path" Marginal || return 1
> +				break
> +			fi
> +			_rport_set_online "$subsys_path" || return 1
> +			_rport_check "$subsys_path" Online || return 1
> +			next_marginal=1
> +		fi
> +	done
> +	# Check optimized paths
> +	for subsys_path in "${RPORTS_PATHS[@]}"; do
> +		if _rport_optimized "$subsys_path"; then
> +			# Optimized paths will not be in use
> +			_rport_check_opt "$subsys_path" Marginal || return 1
> +		fi
> +	done
> +}
> +
> +test_set_all_non_optimized_online() {
> +	local IOPOLICY=$1 # "numa" "queue-depth" "round-robin"
> +	shift
> +	local -a RPORTS_PATHS=("$@") # /sys/devices/virtual/nvme-subsystem/nvme-subsys3/nvme9
> +
> +	# Set all non-optimized online
> +	local numa_in_use=0
> +	for subsys_path in "${RPORTS_PATHS[@]}"; do
> +		if _rport_optimized "$subsys_path"; then
> +			_rport_check "$subsys_path" Marginal || return 1
> +		else
> +			_rport_set_online "$subsys_path" || return 1
> +			if [ "$IOPOLICY" == "numa" ] && [ $numa_in_use == 0 ]; then
> +				_rport_check "$subsys_path" Online || return 1
> +				numa_in_use=1
> +			elif [ "$IOPOLICY" == "numa" ] && [ $numa_in_use == 1 ]; then
> +				_rport_check_online "$subsys_path" Online || return 1
> +				# Only one of the online paths should be in use
> +				_rport_check_use "$subsys_path" Marginal || return 1
> +			else
> +				_rport_check "$subsys_path" Online || return 1
> +			fi
> +		fi
> +	done
> +}
> +
> +set_one_optimized_online() {
> +	local -a RPORTS_PATHS=("$@") # /sys/devices/virtual/nvme-subsystem/nvme-subsys3/nvme9
> +
> +	# Set one optimized online
> +	local next_marginal=0
> +	for subsys_path in "${RPORTS_PATHS[@]}"; do
> +		if _rport_optimized "$subsys_path"; then
> +			if [ $next_marginal == 1 ]; then
> +				_rport_check "$subsys_path" Marginal || return 1
> +				break
> +			fi
> +			_rport_set_online "$subsys_path" || return 1
> +			_rport_check "$subsys_path" Online || return 1
> +			next_marginal=1
> +		fi
> +	done
> +}
> +
> +test_set_all_non_one_optimized_online() {
> +	local -a RPORTS_PATHS=("$@") # /sys/devices/virtual/nvme-subsystem/nvme-subsys3/nvme9
> +
> +	# Set one optimized online
> +	# First set one optimized online to online then check non-optimized paths
> +	set_one_optimized_online "${RPORTS_PATHS[@]}" || return 1
> +
> +	# Check non-optimized paths
> +	for subsys_path in "${RPORTS_PATHS[@]}"; do
> +		if ! _rport_optimized "$subsys_path"; then
> +			# Only optimized paths will be in use
> +			_rport_check_opt "$subsys_path" Online || return 1
> +		fi
> +	done
> +}
> +
> +test_set_one_optimized_online() {
> +	local -a RPORTS_PATHS=("$@") # /sys/devices/virtual/nvme-subsystem/nvme-subsys3/nvme9
> +
> +	# Set one optimized online
> +	# First set one optimized online to online then check non-optimized paths
> +	set_one_optimized_online "${RPORTS_PATHS[@]}" || return 1
> +
> +	# Check non-optimized paths
> +	for subsys_path in "${RPORTS_PATHS[@]}"; do
> +		if ! _rport_optimized "$subsys_path"; then
> +			# Only optimized paths will be in use
> +			_rport_check_opt "$subsys_path" Marginal || return 1
> +		fi
> +	done
> +}
> +
> +test_set_two_optimized_online() {
> +	local IOPOLICY=$1 # "numa" "queue-depth" "round-robin"
> +	shift
> +	local -a RPORTS_PATHS=("$@")
> +
> +	# Set two optimized online
> +	local numa_in_use=0
> +	for subsys_path in "${RPORTS_PATHS[@]}"; do
> +		if _rport_optimized "$subsys_path"; then
> +			_rport_set_online "$subsys_path" || return 1
> +			if [ "$IOPOLICY" == "numa" ] && [ $numa_in_use == 0 ]; then
> +				_rport_check "$subsys_path" Online || return 1
> +				numa_in_use=1
> +			elif [ "$IOPOLICY" == "numa" ] && [ $numa_in_use == 1 ]; then
> +				_rport_check_online "$subsys_path" Online || return 1
> +				# Only one of the online paths should be in use
> +				_rport_check_use "$subsys_path" Marginal || return 1
> +			else
> +				_rport_check "$subsys_path" Online || return 1
> +			fi
> +		else
> +			_rport_check "$subsys_path" Marginal || return 1
> +		fi
> +	done
> +}
> +
> +run_test() {
> +	local IOPOLICY=$1 # "numa" "queue-depth" "round-robin"
> +	shift
> +	local ARGS=("$@")
> +	local RPORTS_CNT="$(( $# / 2 ))"
> +	local -a RPORTS_PATHS # /sys/devices/virtual/nvme-subsystem/nvme-subsys3/nvme9
> +	local -a RPORTS_HOSTS # host1 host2
> +	local PATHS_POS # /sys/devices/virtual/nvme-subsystem/nvme-subsys3/nvme9
> +	local HOSTS_POS # host1 host2
> +
> +	# recrate the arrays
> +	for (( PATHS_POS=0; PATHS_POS < RPORTS_CNT; PATHS_POS++ )); do
> +		HOSTS_POS+="$(( RPORTS_CNT + PATHS_POS ))"
> +		RPORTS_PATHS+=("${ARGS[$PATHS_POS]}")
> +		RPORTS_HOSTS+=("${ARGS[$HOSTS_POS]}")
> +	done
> +
> +
> +	echo Changing FC links to online
> +	# Initial check to see if FC is operational and set ports to online
> +	test_set_all_online "$IOPOLICY" "${RPORTS_PATHS[@]}" && echo "Set all online: pass" || echo "Set all online: fail"
> +
> +	test_set_one_host_marginal "${RPORTS_HOSTS[0]}" "${RPORTS_PATHS[@]}" "${RPORTS_HOSTS[@]}" && echo "One host marginal: pass" || echo "One host marginal: fail"
> +	test_set_all_marginal "${RPORTS_PATHS[@]}" && echo "All marginal: pass" || echo "All marginal: fail"
> +
> +	test_set_one_non_optimized_online "${RPORTS_PATHS[@]}" && echo "One remote non-optimized online: pass" || echo "One remote non-optimized online: fail"
> +	test_set_all_non_optimized_online "$IOPOLICY" "${RPORTS_PATHS[@]}" && echo "Two remote non-optimized online: pass" || echo "Two remote non-optimized online: fail"
> +
> +	test_set_all_non_one_optimized_online "${RPORTS_PATHS[@]}" && echo "Two remote non-optimized, One remote optimized: pass" || echo "Two remote non-optimized, One remote optimized: fail"
> +	test_set_all_online "$IOPOLICY" "${RPORTS_PATHS[@]}" && echo "Set all online: pass" || echo "Set all online: fail"
> +
> +	test_set_all_marginal "${RPORTS_PATHS[@]}" && echo "All marginal: pass" || echo "All marginal: fail"
> +
> +	test_set_one_optimized_online "${RPORTS_PATHS[@]}" && echo "One remote optimized online: pass" || echo "One remote optimized online: fail"
> +	test_set_two_optimized_online "$IOPOLICY" "${RPORTS_PATHS[@]}" && echo "Two remote optimized online: pass" || echo "Two remote optimized online: fail"
> +	test_set_all_online "$IOPOLICY" "${RPORTS_PATHS[@]}" && echo "All online: pass" || echo "All online: fail"
> +}
> +
> +_nvmet_get_rport() {
> +	local PORT="$1"
> +
> +	local dev
> +	for dev in /sys/class/nvme/nvme*; do
> +		grep -q "io" "$dev/cntrltype" || continue
> +		[ -e "$dev" ] || continue
> +		dev="$(basename "$dev")"
> +		grep -q traddr="$(_fc_traddr "$PORT")" "/sys/class/nvme/$dev/address" && echo "$dev" || true
> +	done
> +	# nvme9
> +}
> +
> +run_tests() {
> +	local SUBSYS_PATH="$1"
> +	shift
> +	local PORTS=("$@")
> +	local -a RPORTS_PATHS # /sys/devices/virtual/nvme-subsystem/nvme-subsys3/nvme9
> +	local -a RPORTS_HOSTS # host1 host2
> +	local rport
> +
> +	for port in "${PORTS[@]}"; do
> +		RPORTS_HOSTS+=("$(_get_fc_host_port "$port")")
> +		rport="$(_nvmet_get_rport "$port")"
> +		if [ -z "$rport" ]; then
> +			echo "Could not find rport for port $port"
> +			return 1
> +		fi
> +		if [[ "$( echo "$rport" | sed -n '$=' )" -gt 1 ]]; then
> +			# One traddr has multiple /sys/class/nvme/nvme devices
> +			echo "Port $port has multiple rports with address"
> +			grep  traddr="$(_fc_traddr "$port")" /sys/class/nvme/nvme*/address
> +			return 1
> +		fi
> +		RPORTS_PATHS+=( "${SUBSYS_PATH}/$rport")
> +	done
> +
> +	local IOPOLICYS="numa queue-depth round-robin"
> +	for IOPOLICY in $IOPOLICYS; do
> +		_rport_set_iopolicy "$SUBSYS_PATH" "$IOPOLICY"
> +		echo "Testing iopolicy: $IOPOLICY"
> +		run_test "$IOPOLICY" "${RPORTS_PATHS[@]}" "${RPORTS_HOSTS[@]}"
> +	done
> +}
> +
> +_find_nvme_subsys() {
> +	local subsys=$1
> +	local subsysnqn
> +	local subsys_path
> +	for subsys_path in /sys/class/nvme-subsystem/nvme-subsys*; do
> +		[ -e "$subsys_path" ] || continue
> +		subsysnqn="$(cat "${subsys_path}/subsysnqn" 2>/dev/null)"
> +		if [[ "$subsysnqn" == "$subsys" ]]; then
> +			echo "$subsys_path"
> +			return
> +		fi
> +	done
> +}
> +
> +test() {
> +	local -a ports
> +	local ns
> +	local fio_pid
> +
> +	echo "Running ${TEST_NAME}"
> +
> +	_setup_nvmet 2
> +
> +	_nvmet_target_setup --ports 2
> +	_nvmet_target_add_ports --host_port 1 --ports 2
> +
> +	_get_nvmet_ports "${def_subsysnqn}" ports
> +
> +	for port in "${ports[@]}"; do
> +		if [[ $(_get_fc_host_port "${port}") == 0 ]]; then
> +			_setup_nvmet_port_ana "${port}" 1 "optimized"
> +		else
> +			_setup_nvmet_port_ana "${port}" 1 "non-optimized"
> +		fi
> +	done
> +
> +	for port in "${ports[@]}"; do
> +		_nvme_connect_subsys --port "${port}" --no-wait-ns || return 1
> +	done
> +
> +	# start fio job
> +	ns=$(_find_nvme_ns "$def_subsys_uuid")
> +	echo "Starting background I/O"
> +	_run_fio_verify_io --filename="/dev/${ns}" \
> +			   --group_reporting --ramp_time=5 \
> +			   --time_based --runtime=1m &> "$FULL" &
> +	fio_pid=$!
> +	sleep 10
> +
> +	run_tests "$(_find_nvme_subsys "${def_subsysnqn}")" "${ports[@]}"
> +
> +	# Stop background I/O
> +	echo "Stopping background I/O"
> +	{ kill "$fio_pid"; wait; } &> /dev/null
> +
> +	_nvme_disconnect_subsys
> +	_nvmet_target_cleanup
> +
> +	echo "Test complete"
> +}
> diff --git a/tests/nvme/070.out b/tests/nvme/070.out
> new file mode 100644
> index 0000000..61d5173
> --- /dev/null
> +++ b/tests/nvme/070.out
> @@ -0,0 +1,43 @@
> +Running nvme/070
> +Starting background I/O
> +Testing iopolicy: numa
> +Changing FC links to online
> +Set all online: pass
> +One host marginal: pass
> +All marginal: pass
> +One remote non-optimized online: pass
> +Two remote non-optimized online: pass
> +Two remote non-optimized, One remote optimized: pass
> +Set all online: pass
> +All marginal: pass
> +One remote optimized online: pass
> +Two remote optimized online: pass
> +All online: pass
> +Testing iopolicy: queue-depth
> +Changing FC links to online
> +Set all online: pass
> +One host marginal: pass
> +All marginal: pass
> +One remote non-optimized online: pass
> +Two remote non-optimized online: pass
> +Two remote non-optimized, One remote optimized: pass
> +Set all online: pass
> +All marginal: pass
> +One remote optimized online: pass
> +Two remote optimized online: pass
> +All online: pass
> +Testing iopolicy: round-robin
> +Changing FC links to online
> +Set all online: pass
> +One host marginal: pass
> +All marginal: pass
> +One remote non-optimized online: pass
> +Two remote non-optimized online: pass
> +Two remote non-optimized, One remote optimized: pass
> +Set all online: pass
> +All marginal: pass
> +One remote optimized online: pass
> +Two remote optimized online: pass
> +All online: pass
> +Stopping background I/O
> +Test complete


  reply	other threads:[~2026-08-12 19:03 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-12 17:45 [PATCH blktests 0/2] Test multipath and marginal ports Jesse Taube
2026-08-12 17:45 ` [PATCH blktests 1/2] nvme: Add _setup_nvmet_port_marginal Jesse Taube
2026-08-12 19:03   ` John Meneghini
2026-08-14 11:28   ` Shin'ichiro Kawasaki
2026-08-12 17:45 ` [PATCH blktests 2/2] nvme/070: Test multipath and marginal ports Jesse Taube
2026-08-12 19:03   ` John Meneghini [this message]
2026-08-14 11:47   ` Shin'ichiro Kawasaki
2026-08-14 15:10     ` John Meneghini
2026-08-14 11:24 ` [PATCH blktests 0/2] " Shin'ichiro Kawasaki
2026-08-14 14:18   ` Jesse Taube

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=3c866f6f-4064-4ef1-ac6b-c374e53a518d@redhat.com \
    --to=jmeneghi@redhat.com \
    --cc=dwagner@suse.de \
    --cc=jtaubepe@redhat.com \
    --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