]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
selftests/ublk: add filesystem fio verify test for shmem_zc
authorMing Lei <ming.lei@redhat.com>
Tue, 31 Mar 2026 15:32:00 +0000 (23:32 +0800)
committerJens Axboe <axboe@kernel.dk>
Tue, 7 Apr 2026 13:42:23 +0000 (07:42 -0600)
Add test_shmemzc_03.sh which exercises shmem_zc through the full
filesystem stack: mkfs ext4 on the ublk device, mount it, then run
fio verify on a file inside the filesystem with --mem=mmaphuge.

Extend _mkfs_mount_test() to accept an optional command that runs
between mount and umount. The function cd's into the mount directory
so the command can use relative file paths. Existing callers that
pass only the device are unaffected.

Signed-off-by: Ming Lei <ming.lei@redhat.com>
Link: https://patch.msgid.link/20260331153207.3635125-10-ming.lei@redhat.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
tools/testing/selftests/ublk/Makefile
tools/testing/selftests/ublk/test_common.sh
tools/testing/selftests/ublk/test_shmemzc_03.sh [new file with mode: 0755]

index 799cdcc39643b062c0d3c9224e69f628d1c616b4..c453cd3690880c1fb298c5c639a567e875c17099 100644 (file)
@@ -54,6 +54,7 @@ TEST_PROGS += test_part_02.sh
 
 TEST_PROGS += test_shmemzc_01.sh
 TEST_PROGS += test_shmemzc_02.sh
+TEST_PROGS += test_shmemzc_03.sh
 
 TEST_PROGS += test_stress_01.sh
 TEST_PROGS += test_stress_02.sh
index 163a4000791029179b97106adec35271c106c0b2..af2ea4fa1111ff19183f6723c76b72688a346dab 100755 (executable)
@@ -88,6 +88,7 @@ _remove_tmp_dir() {
 _mkfs_mount_test()
 {
        local dev=$1
+       shift
        local err_code=0
        local mnt_dir;
 
@@ -99,12 +100,17 @@ _mkfs_mount_test()
        fi
 
        mount -t ext4 "$dev" "$mnt_dir" > /dev/null 2>&1
+       if [ $# -gt 0 ]; then
+               cd "$mnt_dir" && "$@"
+               err_code=$?
+               cd - > /dev/null
+       fi
        umount "$dev"
-       err_code=$?
-       _remove_tmp_dir "$mnt_dir"
-       if [ $err_code -ne 0 ]; then
-               return $err_code
+       if [ $err_code -eq 0 ]; then
+               err_code=$?
        fi
+       _remove_tmp_dir "$mnt_dir"
+       return $err_code
 }
 
 _check_root() {
@@ -132,6 +138,7 @@ _prep_test() {
        local base_dir=${TMPDIR:-./ublktest-dir}
        mkdir -p "$base_dir"
        UBLK_TEST_DIR=$(mktemp -d ${base_dir}/${TID}.XXXXXX)
+       UBLK_TEST_DIR=$(realpath ${UBLK_TEST_DIR})
        UBLK_TMP=$(mktemp ${UBLK_TEST_DIR}/ublk_test_XXXXX)
        [ "$UBLK_TEST_QUIET" -eq 0 ] && echo "ublk $type: $*"
        echo "ublk selftest: $TID starting at $(date '+%F %T')" | tee /dev/kmsg
diff --git a/tools/testing/selftests/ublk/test_shmemzc_03.sh b/tools/testing/selftests/ublk/test_shmemzc_03.sh
new file mode 100755 (executable)
index 0000000..db967a9
--- /dev/null
@@ -0,0 +1,69 @@
+#!/bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Test: shmem_zc with fio verify over filesystem on loop target
+#
+# mkfs + mount ext4 on the ublk device, then run fio verify on a
+# file inside that filesystem.  Exercises the full stack:
+# filesystem -> block layer -> ublk shmem_zc -> loop target backing file.
+
+. "$(cd "$(dirname "$0")" && pwd)"/test_common.sh
+
+ERR_CODE=0
+
+_prep_test "shmem_zc" "loop target hugetlbfs shmem zero-copy fs verify test"
+
+if ! _have_program fio; then
+       echo "SKIP: fio not available"
+       exit "$UBLK_SKIP_CODE"
+fi
+
+if ! grep -q hugetlbfs /proc/filesystems; then
+       echo "SKIP: hugetlbfs not supported"
+       exit "$UBLK_SKIP_CODE"
+fi
+
+# Allocate hugepages
+OLD_NR_HP=$(cat /proc/sys/vm/nr_hugepages)
+echo 10 > /proc/sys/vm/nr_hugepages
+NR_HP=$(cat /proc/sys/vm/nr_hugepages)
+if [ "$NR_HP" -lt 2 ]; then
+       echo "SKIP: cannot allocate hugepages"
+       echo "$OLD_NR_HP" > /proc/sys/vm/nr_hugepages
+       exit "$UBLK_SKIP_CODE"
+fi
+
+# Mount hugetlbfs
+HTLB_MNT=$(mktemp -d "${UBLK_TEST_DIR}/htlb_mnt_XXXXXX")
+if ! mount -t hugetlbfs none "$HTLB_MNT"; then
+       echo "SKIP: cannot mount hugetlbfs"
+       rmdir "$HTLB_MNT"
+       echo "$OLD_NR_HP" > /proc/sys/vm/nr_hugepages
+       exit "$UBLK_SKIP_CODE"
+fi
+
+HTLB_FILE="$HTLB_MNT/ublk_buf"
+fallocate -l 4M "$HTLB_FILE"
+
+_create_backfile 0 256M
+BACKFILE="${UBLK_BACKFILES[0]}"
+
+dev_id=$(_add_ublk_dev -t loop --shmem_zc --htlb "$HTLB_FILE" "$BACKFILE")
+_check_add_dev $TID $?
+
+_mkfs_mount_test /dev/ublkb"${dev_id}" \
+       _run_fio_verify_io --filename=testfile \
+               --size=128M \
+               --mem=mmaphuge:"$HTLB_FILE"
+ERR_CODE=$?
+
+# Delete device first so daemon releases the htlb mmap
+_ublk_del_dev "${dev_id}"
+
+rm -f "$HTLB_FILE"
+umount "$HTLB_MNT"
+rmdir "$HTLB_MNT"
+echo "$OLD_NR_HP" > /proc/sys/vm/nr_hugepages
+
+_cleanup_test "shmem_zc"
+
+_show_result $TID $ERR_CODE