1#!/bin/bash 2# SPDX-License-Identifier: GPL-2.0 3# Test: shmem_zc with fio verify over filesystem on loop target 4# 5# mkfs + mount ext4 on the ublk device, then run fio verify on a 6# file inside that filesystem. Exercises the full stack: 7# filesystem -> block layer -> ublk shmem_zc -> loop target backing file. 8 9. "$(cd "$(dirname "$0")" && pwd)"/test_common.sh 10 11ERR_CODE=0 12 13_prep_test "shmem_zc" "loop target hugetlbfs shmem zero-copy fs verify test" 14 15if ! _have_program fio; then 16 echo "SKIP: fio not available" 17 exit "$UBLK_SKIP_CODE" 18fi 19 20if ! grep -q hugetlbfs /proc/filesystems; then 21 echo "SKIP: hugetlbfs not supported" 22 exit "$UBLK_SKIP_CODE" 23fi 24 25# Allocate hugepages 26OLD_NR_HP=$(cat /proc/sys/vm/nr_hugepages) 27echo 10 > /proc/sys/vm/nr_hugepages 28NR_HP=$(cat /proc/sys/vm/nr_hugepages) 29if [ "$NR_HP" -lt 2 ]; then 30 echo "SKIP: cannot allocate hugepages" 31 echo "$OLD_NR_HP" > /proc/sys/vm/nr_hugepages 32 exit "$UBLK_SKIP_CODE" 33fi 34 35# Mount hugetlbfs 36HTLB_MNT=$(mktemp -d "${UBLK_TEST_DIR}/htlb_mnt_XXXXXX") 37if ! mount -t hugetlbfs none "$HTLB_MNT"; then 38 echo "SKIP: cannot mount hugetlbfs" 39 rmdir "$HTLB_MNT" 40 echo "$OLD_NR_HP" > /proc/sys/vm/nr_hugepages 41 exit "$UBLK_SKIP_CODE" 42fi 43 44HTLB_FILE="$HTLB_MNT/ublk_buf" 45fallocate -l 4M "$HTLB_FILE" 46 47_create_backfile 0 256M 48BACKFILE="${UBLK_BACKFILES[0]}" 49 50dev_id=$(_add_ublk_dev -t loop --shmem_zc --htlb "$HTLB_FILE" "$BACKFILE") 51_check_add_dev $TID $? 52 53_mkfs_mount_test /dev/ublkb"${dev_id}" \ 54 _run_fio_verify_io --filename=testfile \ 55 --size=128M \ 56 --mem=mmaphuge:"$HTLB_FILE" 57ERR_CODE=$? 58 59# Delete device first so daemon releases the htlb mmap 60_ublk_del_dev "${dev_id}" 61 62rm -f "$HTLB_FILE" 63umount "$HTLB_MNT" 64rmdir "$HTLB_MNT" 65echo "$OLD_NR_HP" > /proc/sys/vm/nr_hugepages 66 67_cleanup_test 68 69_show_result $TID $ERR_CODE 70