12f1e9468SMing Lei#!/bin/bash 22f1e9468SMing Lei# SPDX-License-Identifier: GPL-2.0 32f1e9468SMing Lei# Test: shmem_zc with hugetlbfs buffer on null target 42f1e9468SMing Lei# 52f1e9468SMing Lei# kublk and fio both mmap the same hugetlbfs file (MAP_SHARED), 62f1e9468SMing Lei# so they share physical pages. The kernel PFN match enables 72f1e9468SMing Lei# zero-copy I/O without socket-based fd passing. 82f1e9468SMing Lei 92f1e9468SMing Lei. "$(cd "$(dirname "$0")" && pwd)"/test_common.sh 102f1e9468SMing Lei 112f1e9468SMing LeiERR_CODE=0 122f1e9468SMing Lei 132f1e9468SMing Lei_prep_test "shmem_zc" "null target hugetlbfs shmem zero-copy test" 142f1e9468SMing Lei 152f1e9468SMing Leiif ! _have_program fio; then 162f1e9468SMing Lei echo "SKIP: fio not available" 172f1e9468SMing Lei exit "$UBLK_SKIP_CODE" 182f1e9468SMing Leifi 192f1e9468SMing Lei 202f1e9468SMing Leiif ! grep -q hugetlbfs /proc/filesystems; then 212f1e9468SMing Lei echo "SKIP: hugetlbfs not supported" 222f1e9468SMing Lei exit "$UBLK_SKIP_CODE" 232f1e9468SMing Leifi 242f1e9468SMing Lei 252f1e9468SMing Lei# Allocate hugepages 262f1e9468SMing LeiOLD_NR_HP=$(cat /proc/sys/vm/nr_hugepages) 272f1e9468SMing Leiecho 10 > /proc/sys/vm/nr_hugepages 282f1e9468SMing LeiNR_HP=$(cat /proc/sys/vm/nr_hugepages) 292f1e9468SMing Leiif [ "$NR_HP" -lt 2 ]; then 302f1e9468SMing Lei echo "SKIP: cannot allocate hugepages" 312f1e9468SMing Lei echo "$OLD_NR_HP" > /proc/sys/vm/nr_hugepages 322f1e9468SMing Lei exit "$UBLK_SKIP_CODE" 332f1e9468SMing Leifi 342f1e9468SMing Lei 352f1e9468SMing Lei# Mount hugetlbfs 362f1e9468SMing LeiHTLB_MNT=$(mktemp -d "${UBLK_TEST_DIR}/htlb_mnt_XXXXXX") 372f1e9468SMing Leiif ! mount -t hugetlbfs none "$HTLB_MNT"; then 382f1e9468SMing Lei echo "SKIP: cannot mount hugetlbfs" 392f1e9468SMing Lei rmdir "$HTLB_MNT" 402f1e9468SMing Lei echo "$OLD_NR_HP" > /proc/sys/vm/nr_hugepages 412f1e9468SMing Lei exit "$UBLK_SKIP_CODE" 422f1e9468SMing Leifi 432f1e9468SMing Lei 442f1e9468SMing LeiHTLB_FILE="$HTLB_MNT/ublk_buf" 452f1e9468SMing Leifallocate -l 4M "$HTLB_FILE" 462f1e9468SMing Lei 472f1e9468SMing Leidev_id=$(_add_ublk_dev -t null --shmem_zc --htlb "$HTLB_FILE") 482f1e9468SMing Lei_check_add_dev $TID $? 492f1e9468SMing Lei 502f1e9468SMing Leifio --name=htlb_zc \ 512f1e9468SMing Lei --filename=/dev/ublkb"${dev_id}" \ 522f1e9468SMing Lei --ioengine=io_uring \ 532f1e9468SMing Lei --rw=randwrite \ 542f1e9468SMing Lei --direct=1 \ 552f1e9468SMing Lei --bs=4k \ 562f1e9468SMing Lei --size=4M \ 572f1e9468SMing Lei --iodepth=32 \ 582f1e9468SMing Lei --mem=mmaphuge:"$HTLB_FILE" \ 592f1e9468SMing Lei > /dev/null 2>&1 602f1e9468SMing LeiERR_CODE=$? 612f1e9468SMing Lei 622f1e9468SMing Lei# Delete device first so daemon releases the htlb mmap 632f1e9468SMing Lei_ublk_del_dev "${dev_id}" 642f1e9468SMing Lei 652f1e9468SMing Leirm -f "$HTLB_FILE" 662f1e9468SMing Leiumount "$HTLB_MNT" 672f1e9468SMing Leirmdir "$HTLB_MNT" 682f1e9468SMing Leiecho "$OLD_NR_HP" > /proc/sys/vm/nr_hugepages 692f1e9468SMing Lei 70*eac857a1SCaleb Sander Mateos_cleanup_test 712f1e9468SMing Lei 722f1e9468SMing Lei_show_result $TID $ERR_CODE 73