diff --git a/test/scheduler/cgroups.sh b/test/scheduler/cgroups.sh index 445946cc0..8a3ebbf5a 100644 --- a/test/scheduler/cgroups.sh +++ b/test/scheduler/cgroups.sh @@ -142,5 +142,11 @@ kill_in_cgroup() { fi } +remove_cpuset_cgroup() { + if ((cgroup_version == 2)); then + remove_cgroup /cpuset + fi +} + declare -r sysfs_cgroup=/sys/fs/cgroup cgroup_version=$(check_cgroup) diff --git a/test/scheduler/common.sh b/test/scheduler/common.sh index 11deca08f..f5ac5847c 100644 --- a/test/scheduler/common.sh +++ b/test/scheduler/common.sh @@ -379,7 +379,7 @@ exec_under_dynamic_scheduler() { if [[ -e /proc/$spdk_pid/status ]]; then killprocess "$spdk_pid" fi - "$@" --wait-for-rpc & + exec_in_cgroup "/cpuset/spdk" "$@" --wait-for-rpc & spdk_pid=$! # Give some time for the app to init itself waitforlisten "$spdk_pid" diff --git a/test/scheduler/isolate_cores.sh b/test/scheduler/isolate_cores.sh index 0e806b414..5b272c1e7 100644 --- a/test/scheduler/isolate_cores.sh +++ b/test/scheduler/isolate_cores.sh @@ -3,9 +3,21 @@ xtrace_disable source "$testdir/common.sh" +restore_cgroups() { + xtrace_disable + kill_in_cgroup "/cpuset/spdk" + remove_cgroup "/cpuset/spdk" + remove_cgroup "/cpuset/all" + remove_cpuset_cgroup + xtrace_restore +} + +trap "restore_cgroups" EXIT + # Number of cpus to include in the mask NUM_CPUS=${NUM_CPUS:-8} +init_cpuset_cgroup map_cpus # Build core mask. Avoid all CPUs that may be offline and skip cpu0 @@ -33,6 +45,16 @@ filter_allowed_list all_cpus=("${allowed[@]}") all_cpus_csv=$(fold_array_onto_string "${all_cpus[@]}") all_cpumask=$(mask_cpus "${all_cpus[@]}") +all_cpus_mems=0 + +# Pin spdk cores to a new cgroup +create_cgroup "/cpuset/spdk" +create_cgroup "/cpuset/all" +set_cgroup_attr "/cpuset/spdk" cpuset.cpus "$spdk_cpus_csv" +set_cgroup_attr "/cpuset/spdk" cpuset.mems "$spdk_cpus_mems" +set_cgroup_attr "/cpuset/all" cpuset.cpus "$all_cpus_csv" +set_cgroup_attr "/cpuset/all" cpuset.mems "$all_cpus_mems" +move_cgroup_procs "/cpuset" "/cpuset/all" export \ "spdk_cpumask=$spdk_cpumask" \