xref: /linux/tools/testing/selftests/ublk/test_shmemzc_02.sh (revision f3e3dbcea15e20f7413afd8c791a496f0b80e80b)
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