1#!/bin/bash 2# SPDX-License-Identifier: GPL-2.0 3# Test: shmem_zc with read-only buffer registration on null target 4# 5# Same as test_shmemzc_01 but with --rdonly_shmem_buf: pages are pinned 6# without FOLL_WRITE (UBLK_BUF_F_READ). Write I/O works because 7# the server only reads from the shared buffer. 8 9. "$(cd "$(dirname "$0")" && pwd)"/test_common.sh 10 11ERR_CODE=0 12 13_prep_test "shmem_zc" "null target hugetlbfs shmem zero-copy rdonly_buf 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 47dev_id=$(_add_ublk_dev -t null --shmem_zc --htlb "$HTLB_FILE" --rdonly_shmem_buf) 48_check_add_dev $TID $? 49 50fio --name=htlb_zc_rdonly \ 51 --filename=/dev/ublkb"${dev_id}" \ 52 --ioengine=io_uring \ 53 --rw=randwrite \ 54 --direct=1 \ 55 --bs=4k \ 56 --size=4M \ 57 --iodepth=32 \ 58 --mem=mmaphuge:"$HTLB_FILE" \ 59 > /dev/null 2>&1 60ERR_CODE=$? 61 62# Delete device first so daemon releases the htlb mmap 63_ublk_del_dev "${dev_id}" 64 65rm -f "$HTLB_FILE" 66umount "$HTLB_MNT" 67rmdir "$HTLB_MNT" 68echo "$OLD_NR_HP" > /proc/sys/vm/nr_hugepages 69 70_cleanup_test "shmem_zc" 71 72_show_result $TID $ERR_CODE 73