1affb5f67SMing Lei#!/bin/bash 2affb5f67SMing Lei# SPDX-License-Identifier: GPL-2.0 3affb5f67SMing Lei# Test: shmem_zc with read-only buffer registration on null target 4affb5f67SMing Lei# 5affb5f67SMing Lei# Same as test_shmemzc_01 but with --rdonly_shmem_buf: pages are pinned 6affb5f67SMing Lei# without FOLL_WRITE (UBLK_BUF_F_READ). Write I/O works because 7affb5f67SMing Lei# the server only reads from the shared buffer. 8affb5f67SMing Lei 9affb5f67SMing Lei. "$(cd "$(dirname "$0")" && pwd)"/test_common.sh 10affb5f67SMing Lei 11affb5f67SMing LeiERR_CODE=0 12affb5f67SMing Lei 13affb5f67SMing Lei_prep_test "shmem_zc" "null target hugetlbfs shmem zero-copy rdonly_buf test" 14affb5f67SMing Lei 15affb5f67SMing Leiif ! _have_program fio; then 16affb5f67SMing Lei echo "SKIP: fio not available" 17affb5f67SMing Lei exit "$UBLK_SKIP_CODE" 18affb5f67SMing Leifi 19affb5f67SMing Lei 20affb5f67SMing Leiif ! grep -q hugetlbfs /proc/filesystems; then 21affb5f67SMing Lei echo "SKIP: hugetlbfs not supported" 22affb5f67SMing Lei exit "$UBLK_SKIP_CODE" 23affb5f67SMing Leifi 24affb5f67SMing Lei 25affb5f67SMing Lei# Allocate hugepages 26affb5f67SMing LeiOLD_NR_HP=$(cat /proc/sys/vm/nr_hugepages) 27affb5f67SMing Leiecho 10 > /proc/sys/vm/nr_hugepages 28affb5f67SMing LeiNR_HP=$(cat /proc/sys/vm/nr_hugepages) 29affb5f67SMing Leiif [ "$NR_HP" -lt 2 ]; then 30affb5f67SMing Lei echo "SKIP: cannot allocate hugepages" 31affb5f67SMing Lei echo "$OLD_NR_HP" > /proc/sys/vm/nr_hugepages 32affb5f67SMing Lei exit "$UBLK_SKIP_CODE" 33affb5f67SMing Leifi 34affb5f67SMing Lei 35affb5f67SMing Lei# Mount hugetlbfs 36affb5f67SMing LeiHTLB_MNT=$(mktemp -d "${UBLK_TEST_DIR}/htlb_mnt_XXXXXX") 37affb5f67SMing Leiif ! mount -t hugetlbfs none "$HTLB_MNT"; then 38affb5f67SMing Lei echo "SKIP: cannot mount hugetlbfs" 39affb5f67SMing Lei rmdir "$HTLB_MNT" 40affb5f67SMing Lei echo "$OLD_NR_HP" > /proc/sys/vm/nr_hugepages 41affb5f67SMing Lei exit "$UBLK_SKIP_CODE" 42affb5f67SMing Leifi 43affb5f67SMing Lei 44affb5f67SMing LeiHTLB_FILE="$HTLB_MNT/ublk_buf" 45affb5f67SMing Leifallocate -l 4M "$HTLB_FILE" 46affb5f67SMing Lei 47affb5f67SMing Leidev_id=$(_add_ublk_dev -t null --shmem_zc --htlb "$HTLB_FILE" --rdonly_shmem_buf) 48affb5f67SMing Lei_check_add_dev $TID $? 49affb5f67SMing Lei 50affb5f67SMing Leifio --name=htlb_zc_rdonly \ 51affb5f67SMing Lei --filename=/dev/ublkb"${dev_id}" \ 52affb5f67SMing Lei --ioengine=io_uring \ 53affb5f67SMing Lei --rw=randwrite \ 54affb5f67SMing Lei --direct=1 \ 55affb5f67SMing Lei --bs=4k \ 56affb5f67SMing Lei --size=4M \ 57affb5f67SMing Lei --iodepth=32 \ 58affb5f67SMing Lei --mem=mmaphuge:"$HTLB_FILE" \ 59affb5f67SMing Lei > /dev/null 2>&1 60affb5f67SMing LeiERR_CODE=$? 61affb5f67SMing Lei 62affb5f67SMing Lei# Delete device first so daemon releases the htlb mmap 63affb5f67SMing Lei_ublk_del_dev "${dev_id}" 64affb5f67SMing Lei 65affb5f67SMing Leirm -f "$HTLB_FILE" 66affb5f67SMing Leiumount "$HTLB_MNT" 67affb5f67SMing Leirmdir "$HTLB_MNT" 68affb5f67SMing Leiecho "$OLD_NR_HP" > /proc/sys/vm/nr_hugepages 69affb5f67SMing Lei 70*eac857a1SCaleb Sander Mateos_cleanup_test 71affb5f67SMing Lei 72affb5f67SMing Lei_show_result $TID $ERR_CODE 73