From 714a56466a5670ee9b9467f3098ebef6c2808b9e Mon Sep 17 00:00:00 2001 From: Ben Walker Date: Wed, 15 May 2019 15:23:36 -0700 Subject: [PATCH] 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: Ben Walker Signed-off-by: Darek Stojaczyk Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/454679 Tested-by: SPDK CI Jenkins Reviewed-by: Jim Harris --- test/common/autotest_common.sh | 16 ++++++++++++++-- test/nvmf/common.sh | 11 ++++++++++- test/nvmf/host/perf.sh | 7 ++++++- 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/test/common/autotest_common.sh b/test/common/autotest_common.sh index 0f30d0280..53c054fb3 100644 --- a/test/common/autotest_common.sh +++ b/test/common/autotest_common.sh @@ -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 - echo "killing process with pid $1" - kill $1 + 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 } diff --git a/test/nvmf/common.sh b/test/nvmf/common.sh index 164fa727f..f051cba7c 100644 --- a/test/nvmf/common.sh +++ b/test/nvmf/common.sh @@ -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 diff --git a/test/nvmf/host/perf.sh b/test/nvmf/host/perf.sh index 370ea57d2..f70f22a75 100755 --- a/test/nvmf/host/perf.sh +++ b/test/nvmf/host/perf.sh @@ -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"