Since version v6.5, kernel no longer provides scheduler sysfs attribute of bio based device-mapper. If TEST_DEV is a bio based device-mapper and the test case requires specific scheduler, it is required to modify sysfs attributes of destination devices instead of TEST_DEV. To set scheduler to the sysfs attribute of destination devices, add the helper function _dm_destination_dev_set_scheduler. It saves the original scheduler value in the associative array SYSFS_QUEUE_SAVED so that it is restored at each test case end. Also add _test_dev_set_scheduler which sets scheduler regardless whether TEST_DEV is a bio based device-mapper or not. Signed-off-by: Shin'ichiro Kawasaki <shinichiro.kawasaki@xxxxxxx> --- common/dm | 21 +++++++++++++++++++++ common/rc | 9 +++++++++ 2 files changed, 30 insertions(+) diff --git a/common/dm b/common/dm index 85e1ed9..14f4265 100644 --- a/common/dm +++ b/common/dm @@ -21,3 +21,24 @@ _get_dev_path_by_id() { done return 1 } + +_dm_destination_dev_set_scheduler() { + local dest_dev_id dest_dev path + + while read -r dest_dev_id; do + if ! dest_dev=$(_get_dev_path_by_id "${dest_dev_id}"); then + continue + fi + path=${dest_dev/dev/sys\/block}/queue/scheduler + if [[ ! -w ${path} ]]; then + echo "Can not set scheduler of device mapper destination: ${dest_dev}" + continue + fi + if [[ ${SYSFS_QUEUE_SAVED["$path"]-unset} == unset ]]; then + SYSFS_QUEUE_SAVED["$path"]="$(sed \ + -e 's/.*\[//' -e 's/\].*//' "${path}")" + fi + echo "${1}" > "${path}" + done < <(dmsetup table "$(<"${TEST_DEV_SYSFS}/dm/name")" | + sed -n 's/.* \([0-9]*:[0-9]*\).*/\1/p') +} diff --git a/common/rc b/common/rc index 4984100..52d1602 100644 --- a/common/rc +++ b/common/rc @@ -10,6 +10,7 @@ shopt -s extglob # Include fio helpers by default. . common/fio . common/cgroup +. common/dm # If a test runs multiple "subtests", then each subtest should typically run # for TIMEOUT / number of subtests. @@ -294,6 +295,14 @@ _test_dev_queue_set() { echo "$2" >"$path" } +_test_dev_set_scheduler() { + if [[ -w "${TEST_DEV_SYSFS}/queue/scheduler" ]]; then + _test_dev_queue_set scheduler "$1" + elif _test_dev_is_dm; then + _dm_destination_dev_set_scheduler "$1" + fi +} + _require_test_dev_is_pci() { if ! readlink -f "$TEST_DEV_SYSFS/device" | grep -q pci; then # nvme needs some special casing -- 2.40.1