Commit 12075992 authored by Ming Lei's avatar Ming Lei Committed by Jens Axboe
Browse files

selftests/ublk: add filesystem fio verify test for shmem_zc



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: default avatarMing Lei <ming.lei@redhat.com>
Link: https://patch.msgid.link/20260331153207.3635125-10-ming.lei@redhat.com


Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent d4866503
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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
+11 −4
Original line number Diff line number Diff line
@@ -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"
	if [ $err_code -eq 0 ]; then
		err_code=$?
	fi
	_remove_tmp_dir "$mnt_dir"
	if [ $err_code -ne 0 ]; then
	return $err_code
	fi
}

_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
+69 −0
Original line number Diff line number Diff line
#!/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