1d4866503SMing Lei#!/bin/bash 2d4866503SMing Lei# SPDX-License-Identifier: GPL-2.0 3d4866503SMing Lei# Test: shmem_zc with hugetlbfs buffer on loop target 4d4866503SMing Lei# 5d4866503SMing Lei# kublk and fio both mmap the same hugetlbfs file (MAP_SHARED), 6d4866503SMing Lei# so they share physical pages. The kernel PFN match enables 7d4866503SMing Lei# zero-copy I/O without socket-based fd passing. 8d4866503SMing Lei 9d4866503SMing Lei. "$(cd "$(dirname "$0")" && pwd)"/test_common.sh 10d4866503SMing Lei 11d4866503SMing LeiERR_CODE=0 12d4866503SMing Lei 13d4866503SMing Lei_prep_test "shmem_zc" "loop target hugetlbfs shmem zero-copy test" 14d4866503SMing Lei 15d4866503SMing Leiif ! _have_program fio; then 16d4866503SMing Lei echo "SKIP: fio not available" 17d4866503SMing Lei exit "$UBLK_SKIP_CODE" 18d4866503SMing Leifi 19d4866503SMing Lei 20d4866503SMing Leiif ! grep -q hugetlbfs /proc/filesystems; then 21d4866503SMing Lei echo "SKIP: hugetlbfs not supported" 22d4866503SMing Lei exit "$UBLK_SKIP_CODE" 23d4866503SMing Leifi 24d4866503SMing Lei 25d4866503SMing Lei# Allocate hugepages 26d4866503SMing LeiOLD_NR_HP=$(cat /proc/sys/vm/nr_hugepages) 27d4866503SMing Leiecho 10 > /proc/sys/vm/nr_hugepages 28d4866503SMing LeiNR_HP=$(cat /proc/sys/vm/nr_hugepages) 29d4866503SMing Leiif [ "$NR_HP" -lt 2 ]; then 30d4866503SMing Lei echo "SKIP: cannot allocate hugepages" 31d4866503SMing Lei echo "$OLD_NR_HP" > /proc/sys/vm/nr_hugepages 32d4866503SMing Lei exit "$UBLK_SKIP_CODE" 33d4866503SMing Leifi 34d4866503SMing Lei 35d4866503SMing Lei# Mount hugetlbfs 36d4866503SMing LeiHTLB_MNT=$(mktemp -d "${UBLK_TEST_DIR}/htlb_mnt_XXXXXX") 37d4866503SMing Leiif ! mount -t hugetlbfs none "$HTLB_MNT"; then 38d4866503SMing Lei echo "SKIP: cannot mount hugetlbfs" 39d4866503SMing Lei rmdir "$HTLB_MNT" 40d4866503SMing Lei echo "$OLD_NR_HP" > /proc/sys/vm/nr_hugepages 41d4866503SMing Lei exit "$UBLK_SKIP_CODE" 42d4866503SMing Leifi 43d4866503SMing Lei 44d4866503SMing LeiHTLB_FILE="$HTLB_MNT/ublk_buf" 45d4866503SMing Leifallocate -l 4M "$HTLB_FILE" 46d4866503SMing Lei 47d4866503SMing Lei_create_backfile 0 128M 48d4866503SMing LeiBACKFILE="${UBLK_BACKFILES[0]}" 49d4866503SMing Lei 50d4866503SMing Leidev_id=$(_add_ublk_dev -t loop --shmem_zc --htlb "$HTLB_FILE" "$BACKFILE") 51d4866503SMing Lei_check_add_dev $TID $? 52d4866503SMing Lei 53d4866503SMing Lei_run_fio_verify_io --filename=/dev/ublkb"${dev_id}" \ 54d4866503SMing Lei --size=128M \ 55d4866503SMing Lei --mem=mmaphuge:"$HTLB_FILE" 56d4866503SMing LeiERR_CODE=$? 57d4866503SMing Lei 58d4866503SMing Lei# Delete device first so daemon releases the htlb mmap 59d4866503SMing Lei_ublk_del_dev "${dev_id}" 60d4866503SMing Lei 61d4866503SMing Leirm -f "$HTLB_FILE" 62d4866503SMing Leiumount "$HTLB_MNT" 63d4866503SMing Leirmdir "$HTLB_MNT" 64d4866503SMing Leiecho "$OLD_NR_HP" > /proc/sys/vm/nr_hugepages 65d4866503SMing Lei 66*eac857a1SCaleb Sander Mateos_cleanup_test 67d4866503SMing Lei 68d4866503SMing Lei_show_result $TID $ERR_CODE 69