xref: /linux/tools/testing/selftests/mm/test_page_frag.sh (revision c771600c6af14749609b49565ffb4cac2959710d)
1*7fef0decSYunsheng Lin#!/bin/bash
2*7fef0decSYunsheng Lin# SPDX-License-Identifier: GPL-2.0
3*7fef0decSYunsheng Lin#
4*7fef0decSYunsheng Lin# Copyright (C) 2024 Yunsheng Lin <linyunsheng@huawei.com>
5*7fef0decSYunsheng Lin# Copyright (C) 2018 Uladzislau Rezki (Sony) <urezki@gmail.com>
6*7fef0decSYunsheng Lin#
7*7fef0decSYunsheng Lin# This is a test script for the kernel test driver to test the
8*7fef0decSYunsheng Lin# correctness and performance of page_frag's implementation.
9*7fef0decSYunsheng Lin# Therefore it is just a kernel module loader. You can specify
10*7fef0decSYunsheng Lin# and pass different parameters in order to:
11*7fef0decSYunsheng Lin#     a) analyse performance of page fragment allocations;
12*7fef0decSYunsheng Lin#     b) stressing and stability check of page_frag subsystem.
13*7fef0decSYunsheng Lin
14*7fef0decSYunsheng LinDRIVER="./page_frag/page_frag_test.ko"
15*7fef0decSYunsheng LinCPU_LIST=$(grep -m 2 processor /proc/cpuinfo | cut -d ' ' -f 2)
16*7fef0decSYunsheng LinTEST_CPU_0=$(echo $CPU_LIST | awk '{print $1}')
17*7fef0decSYunsheng Lin
18*7fef0decSYunsheng Linif [ $(echo $CPU_LIST | wc -w) -gt 1 ]; then
19*7fef0decSYunsheng Lin	TEST_CPU_1=$(echo $CPU_LIST | awk '{print $2}')
20*7fef0decSYunsheng Lin	NR_TEST=100000000
21*7fef0decSYunsheng Linelse
22*7fef0decSYunsheng Lin	TEST_CPU_1=$TEST_CPU_0
23*7fef0decSYunsheng Lin	NR_TEST=1000000
24*7fef0decSYunsheng Linfi
25*7fef0decSYunsheng Lin
26*7fef0decSYunsheng Lin# 1 if fails
27*7fef0decSYunsheng Linexitcode=1
28*7fef0decSYunsheng Lin
29*7fef0decSYunsheng Lin# Kselftest framework requirement - SKIP code is 4.
30*7fef0decSYunsheng Linksft_skip=4
31*7fef0decSYunsheng Lin
32*7fef0decSYunsheng Lincheck_test_failed_prefix() {
33*7fef0decSYunsheng Lin	if dmesg | grep -q 'page_frag_test failed:';then
34*7fef0decSYunsheng Lin		echo "page_frag_test failed, please check dmesg"
35*7fef0decSYunsheng Lin		exit $exitcode
36*7fef0decSYunsheng Lin	fi
37*7fef0decSYunsheng Lin}
38*7fef0decSYunsheng Lin
39*7fef0decSYunsheng Lin#
40*7fef0decSYunsheng Lin# Static templates for testing of page_frag APIs.
41*7fef0decSYunsheng Lin# Also it is possible to pass any supported parameters manually.
42*7fef0decSYunsheng Lin#
43*7fef0decSYunsheng LinSMOKE_PARAM="test_push_cpu=$TEST_CPU_0 test_pop_cpu=$TEST_CPU_1"
44*7fef0decSYunsheng LinNONALIGNED_PARAM="$SMOKE_PARAM test_alloc_len=75 nr_test=$NR_TEST"
45*7fef0decSYunsheng LinALIGNED_PARAM="$NONALIGNED_PARAM test_align=1"
46*7fef0decSYunsheng Lin
47*7fef0decSYunsheng Lincheck_test_requirements()
48*7fef0decSYunsheng Lin{
49*7fef0decSYunsheng Lin	uid=$(id -u)
50*7fef0decSYunsheng Lin	if [ $uid -ne 0 ]; then
51*7fef0decSYunsheng Lin		echo "$0: Must be run as root"
52*7fef0decSYunsheng Lin		exit $ksft_skip
53*7fef0decSYunsheng Lin	fi
54*7fef0decSYunsheng Lin
55*7fef0decSYunsheng Lin	if ! which insmod > /dev/null 2>&1; then
56*7fef0decSYunsheng Lin		echo "$0: You need insmod installed"
57*7fef0decSYunsheng Lin		exit $ksft_skip
58*7fef0decSYunsheng Lin	fi
59*7fef0decSYunsheng Lin
60*7fef0decSYunsheng Lin	if [ ! -f $DRIVER ]; then
61*7fef0decSYunsheng Lin		echo "$0: You need to compile page_frag_test module"
62*7fef0decSYunsheng Lin		exit $ksft_skip
63*7fef0decSYunsheng Lin	fi
64*7fef0decSYunsheng Lin}
65*7fef0decSYunsheng Lin
66*7fef0decSYunsheng Linrun_nonaligned_check()
67*7fef0decSYunsheng Lin{
68*7fef0decSYunsheng Lin	echo "Run performance tests to evaluate how fast nonaligned alloc API is."
69*7fef0decSYunsheng Lin
70*7fef0decSYunsheng Lin	insmod $DRIVER $NONALIGNED_PARAM > /dev/null 2>&1
71*7fef0decSYunsheng Lin}
72*7fef0decSYunsheng Lin
73*7fef0decSYunsheng Linrun_aligned_check()
74*7fef0decSYunsheng Lin{
75*7fef0decSYunsheng Lin	echo "Run performance tests to evaluate how fast aligned alloc API is."
76*7fef0decSYunsheng Lin
77*7fef0decSYunsheng Lin	insmod $DRIVER $ALIGNED_PARAM > /dev/null 2>&1
78*7fef0decSYunsheng Lin}
79*7fef0decSYunsheng Lin
80*7fef0decSYunsheng Linrun_smoke_check()
81*7fef0decSYunsheng Lin{
82*7fef0decSYunsheng Lin	echo "Run smoke test."
83*7fef0decSYunsheng Lin
84*7fef0decSYunsheng Lin	insmod $DRIVER $SMOKE_PARAM > /dev/null 2>&1
85*7fef0decSYunsheng Lin}
86*7fef0decSYunsheng Lin
87*7fef0decSYunsheng Linusage()
88*7fef0decSYunsheng Lin{
89*7fef0decSYunsheng Lin	echo -n "Usage: $0 [ aligned ] | [ nonaligned ] | | [ smoke ] | "
90*7fef0decSYunsheng Lin	echo "manual parameters"
91*7fef0decSYunsheng Lin	echo
92*7fef0decSYunsheng Lin	echo "Valid tests and parameters:"
93*7fef0decSYunsheng Lin	echo
94*7fef0decSYunsheng Lin	modinfo $DRIVER
95*7fef0decSYunsheng Lin	echo
96*7fef0decSYunsheng Lin	echo "Example usage:"
97*7fef0decSYunsheng Lin	echo
98*7fef0decSYunsheng Lin	echo "# Shows help message"
99*7fef0decSYunsheng Lin	echo "$0"
100*7fef0decSYunsheng Lin	echo
101*7fef0decSYunsheng Lin	echo "# Smoke testing"
102*7fef0decSYunsheng Lin	echo "$0 smoke"
103*7fef0decSYunsheng Lin	echo
104*7fef0decSYunsheng Lin	echo "# Performance testing for nonaligned alloc API"
105*7fef0decSYunsheng Lin	echo "$0 nonaligned"
106*7fef0decSYunsheng Lin	echo
107*7fef0decSYunsheng Lin	echo "# Performance testing for aligned alloc API"
108*7fef0decSYunsheng Lin	echo "$0 aligned"
109*7fef0decSYunsheng Lin	echo
110*7fef0decSYunsheng Lin	exit 0
111*7fef0decSYunsheng Lin}
112*7fef0decSYunsheng Lin
113*7fef0decSYunsheng Linfunction validate_passed_args()
114*7fef0decSYunsheng Lin{
115*7fef0decSYunsheng Lin	VALID_ARGS=`modinfo $DRIVER | awk '/parm:/ {print $2}' | sed 's/:.*//'`
116*7fef0decSYunsheng Lin
117*7fef0decSYunsheng Lin	#
118*7fef0decSYunsheng Lin	# Something has been passed, check it.
119*7fef0decSYunsheng Lin	#
120*7fef0decSYunsheng Lin	for passed_arg in $@; do
121*7fef0decSYunsheng Lin		key=${passed_arg//=*/}
122*7fef0decSYunsheng Lin		valid=0
123*7fef0decSYunsheng Lin
124*7fef0decSYunsheng Lin		for valid_arg in $VALID_ARGS; do
125*7fef0decSYunsheng Lin			if [[ $key = $valid_arg ]]; then
126*7fef0decSYunsheng Lin				valid=1
127*7fef0decSYunsheng Lin				break
128*7fef0decSYunsheng Lin			fi
129*7fef0decSYunsheng Lin		done
130*7fef0decSYunsheng Lin
131*7fef0decSYunsheng Lin		if [[ $valid -ne 1 ]]; then
132*7fef0decSYunsheng Lin			echo "Error: key is not correct: ${key}"
133*7fef0decSYunsheng Lin			exit $exitcode
134*7fef0decSYunsheng Lin		fi
135*7fef0decSYunsheng Lin	done
136*7fef0decSYunsheng Lin}
137*7fef0decSYunsheng Lin
138*7fef0decSYunsheng Linfunction run_manual_check()
139*7fef0decSYunsheng Lin{
140*7fef0decSYunsheng Lin	#
141*7fef0decSYunsheng Lin	# Validate passed parameters. If there is wrong one,
142*7fef0decSYunsheng Lin	# the script exists and does not execute further.
143*7fef0decSYunsheng Lin	#
144*7fef0decSYunsheng Lin	validate_passed_args $@
145*7fef0decSYunsheng Lin
146*7fef0decSYunsheng Lin	echo "Run the test with following parameters: $@"
147*7fef0decSYunsheng Lin	insmod $DRIVER $@ > /dev/null 2>&1
148*7fef0decSYunsheng Lin}
149*7fef0decSYunsheng Lin
150*7fef0decSYunsheng Linfunction run_test()
151*7fef0decSYunsheng Lin{
152*7fef0decSYunsheng Lin	if [ $# -eq 0 ]; then
153*7fef0decSYunsheng Lin		usage
154*7fef0decSYunsheng Lin	else
155*7fef0decSYunsheng Lin		if [[ "$1" = "smoke" ]]; then
156*7fef0decSYunsheng Lin			run_smoke_check
157*7fef0decSYunsheng Lin		elif [[ "$1" = "nonaligned" ]]; then
158*7fef0decSYunsheng Lin			run_nonaligned_check
159*7fef0decSYunsheng Lin		elif [[ "$1" = "aligned" ]]; then
160*7fef0decSYunsheng Lin			run_aligned_check
161*7fef0decSYunsheng Lin		else
162*7fef0decSYunsheng Lin			run_manual_check $@
163*7fef0decSYunsheng Lin		fi
164*7fef0decSYunsheng Lin	fi
165*7fef0decSYunsheng Lin
166*7fef0decSYunsheng Lin	check_test_failed_prefix
167*7fef0decSYunsheng Lin
168*7fef0decSYunsheng Lin	echo "Done."
169*7fef0decSYunsheng Lin	echo "Check the kernel ring buffer to see the summary."
170*7fef0decSYunsheng Lin}
171*7fef0decSYunsheng Lin
172*7fef0decSYunsheng Lincheck_test_requirements
173*7fef0decSYunsheng Linrun_test $@
174*7fef0decSYunsheng Lin
175*7fef0decSYunsheng Linexit 0
176