162306a36Sopenharmony_ci#!/bin/bash
262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0
362306a36Sopenharmony_ci#
462306a36Sopenharmony_ci# Copyright (C) 2018 Uladzislau Rezki (Sony) <urezki@gmail.com>
562306a36Sopenharmony_ci#
662306a36Sopenharmony_ci# This is a test script for the kernel test driver to analyse vmalloc
762306a36Sopenharmony_ci# allocator. Therefore it is just a kernel module loader. You can specify
862306a36Sopenharmony_ci# and pass different parameters in order to:
962306a36Sopenharmony_ci#     a) analyse performance of vmalloc allocations;
1062306a36Sopenharmony_ci#     b) stressing and stability check of vmalloc subsystem.
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ciTEST_NAME="test_hmm"
1362306a36Sopenharmony_ciDRIVER="test_hmm"
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci# 1 if fails
1662306a36Sopenharmony_ciexitcode=1
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci# Kselftest framework requirement - SKIP code is 4.
1962306a36Sopenharmony_ciksft_skip=4
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_cicheck_test_requirements()
2262306a36Sopenharmony_ci{
2362306a36Sopenharmony_ci	uid=$(id -u)
2462306a36Sopenharmony_ci	if [ $uid -ne 0 ]; then
2562306a36Sopenharmony_ci		echo "$0: Must be run as root"
2662306a36Sopenharmony_ci		exit $ksft_skip
2762306a36Sopenharmony_ci	fi
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci	if ! which modprobe > /dev/null 2>&1; then
3062306a36Sopenharmony_ci		echo "$0: You need modprobe installed"
3162306a36Sopenharmony_ci		exit $ksft_skip
3262306a36Sopenharmony_ci	fi
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci	if ! modinfo $DRIVER > /dev/null 2>&1; then
3562306a36Sopenharmony_ci		echo "$0: You must have the following enabled in your kernel:"
3662306a36Sopenharmony_ci		echo "CONFIG_TEST_HMM=m"
3762306a36Sopenharmony_ci		exit $ksft_skip
3862306a36Sopenharmony_ci	fi
3962306a36Sopenharmony_ci}
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ciload_driver()
4262306a36Sopenharmony_ci{
4362306a36Sopenharmony_ci	if [ $# -eq 0 ]; then
4462306a36Sopenharmony_ci		modprobe $DRIVER > /dev/null 2>&1
4562306a36Sopenharmony_ci	else
4662306a36Sopenharmony_ci		if [ $# -eq 2 ]; then
4762306a36Sopenharmony_ci			modprobe $DRIVER spm_addr_dev0=$1 spm_addr_dev1=$2
4862306a36Sopenharmony_ci				> /dev/null 2>&1
4962306a36Sopenharmony_ci		else
5062306a36Sopenharmony_ci			echo "Missing module parameters. Make sure pass"\
5162306a36Sopenharmony_ci			"spm_addr_dev0 and spm_addr_dev1"
5262306a36Sopenharmony_ci			usage
5362306a36Sopenharmony_ci		fi
5462306a36Sopenharmony_ci	fi
5562306a36Sopenharmony_ci}
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ciunload_driver()
5862306a36Sopenharmony_ci{
5962306a36Sopenharmony_ci	modprobe -r $DRIVER > /dev/null 2>&1
6062306a36Sopenharmony_ci}
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_cirun_smoke()
6362306a36Sopenharmony_ci{
6462306a36Sopenharmony_ci	echo "Running smoke test. Note, this test provides basic coverage."
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci	load_driver $1 $2
6762306a36Sopenharmony_ci	$(dirname "${BASH_SOURCE[0]}")/hmm-tests
6862306a36Sopenharmony_ci	unload_driver
6962306a36Sopenharmony_ci}
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ciusage()
7262306a36Sopenharmony_ci{
7362306a36Sopenharmony_ci	echo -n "Usage: $0"
7462306a36Sopenharmony_ci	echo
7562306a36Sopenharmony_ci	echo "Example usage:"
7662306a36Sopenharmony_ci	echo
7762306a36Sopenharmony_ci	echo "# Shows help message"
7862306a36Sopenharmony_ci	echo "./${TEST_NAME}.sh"
7962306a36Sopenharmony_ci	echo
8062306a36Sopenharmony_ci	echo "# Smoke testing"
8162306a36Sopenharmony_ci	echo "./${TEST_NAME}.sh smoke"
8262306a36Sopenharmony_ci	echo
8362306a36Sopenharmony_ci	echo "# Smoke testing with SPM enabled"
8462306a36Sopenharmony_ci	echo "./${TEST_NAME}.sh smoke <spm_addr_dev0> <spm_addr_dev1>"
8562306a36Sopenharmony_ci	echo
8662306a36Sopenharmony_ci	exit 0
8762306a36Sopenharmony_ci}
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_cifunction run_test()
9062306a36Sopenharmony_ci{
9162306a36Sopenharmony_ci	if [ $# -eq 0 ]; then
9262306a36Sopenharmony_ci		usage
9362306a36Sopenharmony_ci	else
9462306a36Sopenharmony_ci		if [ "$1" = "smoke" ]; then
9562306a36Sopenharmony_ci			run_smoke $2 $3
9662306a36Sopenharmony_ci		else
9762306a36Sopenharmony_ci			usage
9862306a36Sopenharmony_ci		fi
9962306a36Sopenharmony_ci	fi
10062306a36Sopenharmony_ci}
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_cicheck_test_requirements
10362306a36Sopenharmony_cirun_test $@
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ciexit 0
106