Commit 714a5646 authored by Ben Walker's avatar Ben Walker Committed by Jim Harris
Browse files

test/nvmf: allow running as unprivileged user



Add a new test flag SPDK_RUN_NON_ROOT forcing some of the
SPDK applications to run as an unprivileged user. For now
we implement it in nvmf tests. If enabled, nvmf_tgt will
run as the user who invoked `sudo ./autotest.sh`.

Running SPDK as non-root has two major prerequisites right now:
 * there must be an IOMMU in the system in order to use PCI devices
 * DPDK version must be either < 18.05 or >= 19.08-rc1

Change-Id: If1ba9dfcc09fc6cac059867408a1b54eddecfb4b
Signed-off-by: default avatarBen Walker <benjamin.walker@intel.com>
Signed-off-by: default avatarDarek Stojaczyk <dariusz.stojaczyk@intel.com>
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/454679


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
parent c049304a
Loading
Loading
Loading
Loading
+14 −2
Original line number Diff line number Diff line
@@ -56,6 +56,7 @@ export RUN_NIGHTLY_FAILING
: ${SPDK_RUN_ASAN=0}; export SPDK_RUN_ASAN
: ${SPDK_RUN_UBSAN=0}; export SPDK_RUN_UBSAN
: ${SPDK_RUN_INSTALLED_DPDK=0}; export SPDK_RUN_INSTALLED_DPDK
: ${SPDK_RUN_NON_ROOT=0}; export SPDK_RUN_NON_ROOT
: ${SPDK_TEST_CRYPTO=0}; export SPDK_TEST_CRYPTO
: ${SPDK_TEST_FTL=0}; export SPDK_TEST_FTL
: ${SPDK_TEST_BDEV_FTL=0}; export SPDK_TEST_BDEV_FTL
@@ -433,8 +434,19 @@ function killprocess() {
	fi

	if kill -0 $1; then
		if [ "$(ps --no-headers -o comm= $1)" = "sudo" ]; then
			# kill the child process, which is the actual app
			# (assume $1 has just one child)
			local child="$(pgrep -P $1)"
			echo "killing process with pid $child"
			kill $child
		else
			echo "killing process with pid $1"
			kill $1
		fi

		# wait for the process regardless if its the dummy sudo one
		# or the actual app - it should terminate anyway
		wait $1
	fi
}
+10 −1
Original line number Diff line number Diff line
@@ -4,8 +4,17 @@ NVMF_IP_LEAST_ADDR=8
NVMF_TCP_IP_ADDRESS="127.0.0.1"
NVMF_TRANSPORT_OPTS=""

function build_nvmf_app_args()
{
	if [ $SPDK_RUN_NON_ROOT -eq 1 ]; then
		echo "sudo -u $(logname) ./app/nvmf_tgt/nvmf_tgt -i $NVMF_APP_SHM_ID -e 0xFFFF"
	else
		echo "./app/nvmf_tgt/nvmf_tgt -i $NVMF_APP_SHM_ID -e 0xFFFF"
	fi
}

: ${NVMF_APP_SHM_ID="0"}; export NVMF_APP_SHM_ID
: ${NVMF_APP="./app/nvmf_tgt/nvmf_tgt -i $NVMF_APP_SHM_ID -e 0xFFFF"}; export NVMF_APP
: ${NVMF_APP="$(build_nvmf_app_args)"}; export NVMF_APP

have_pci_nics=0

+6 −1
Original line number Diff line number Diff line
@@ -33,7 +33,12 @@ $rpc_py nvmf_subsystem_add_listener nqn.2016-06.io.spdk:cnode1 -t $TEST_TRANSPOR

# Test multi-process access to local NVMe device
if [ -n "$local_nvme_trid" ]; then
	$rootdir/examples/nvme/perf/perf -i $NVMF_APP_SHM_ID -q 32 -o 4096 -w randrw -M 50 -t 1 -r "$local_nvme_trid"
	if [ $SPDK_RUN_NON_ROOT -eq 1 ]; then
		perf_app="sudo -u $(logname) $rootdir/examples/nvme/perf/perf"
	else
		perf_app="$rootdir/examples/nvme/perf/perf"
	fi
	$perf_app -i $NVMF_APP_SHM_ID -q 32 -o 4096 -w randrw -M 50 -t 1 -r "$local_nvme_trid"
fi

$rootdir/examples/nvme/perf/perf -q 32 -o 4096 -w randrw -M 50 -t 1 -r "trtype:$TEST_TRANSPORT adrfam:IPv4 traddr:$NVMF_FIRST_TARGET_IP trsvcid:$NVMF_PORT"