blob: 1587338012e836c945fa633439296e1c0fd42d74 [file] [log] [blame]
Anders Roxelle3f51b82024-07-04 12:30:01 +02001#!/bin/sh
2# SPDX-License-Identifier: GPL-2.0-only
3# Copyright (C) 2024 Linaro Ltd.
4
5# shellcheck disable=SC1091
6. ../../lib/sh-test-lib
7OUTPUT="$(pwd)/output"
8RESULT_FILE="${OUTPUT}/result.txt"
9export RESULT_FILE
10
11MODULES_LIST=""
12MODULES_SUBDIRS=""
13MODULE_MODPROBE_NUMBER="1"
Anders Roxell8aa8dbf2024-07-11 14:42:19 +020014SKIPLIST=""
Anders Roxelle3f51b82024-07-04 12:30:01 +020015SHARD_NUMBER=1
16SHARD_INDEX=1
17
18usage() {
19 echo "Usage: $0 [-d <subdir of the modules directory> ]
20 [-l <space separated module list> ]
21 [-c <Number of load/unload of a module> ]
22 [-i <sharding bucket to run> ]
23 [-n <number of shard buckets to create> ]
Anders Roxell8aa8dbf2024-07-11 14:42:19 +020024 [-s <skiplist modules to skip> ]
Anders Roxelle3f51b82024-07-04 12:30:01 +020025 [-h ]" 1>&2
26 exit 0
27}
28
Anders Roxell8aa8dbf2024-07-11 14:42:19 +020029while getopts "c:d:i:l:n:s:h" o; do
Anders Roxelle3f51b82024-07-04 12:30:01 +020030 case "$o" in
31 d) MODULES_SUBDIRS="${OPTARG}" ;;
32 l) MODULES_LIST="${OPTARG}" ;;
33 c) MODULE_MODPROBE_NUMBER="${OPTARG}" ;;
34 i) SHARD_INDEX="${OPTARG}" ;;
35 n) SHARD_NUMBER="${OPTARG}" ;;
Anders Roxell8aa8dbf2024-07-11 14:42:19 +020036 s) SKIPLIST="${OPTARG}" ;;
Anders Roxelle3f51b82024-07-04 12:30:01 +020037 h|*) usage ;;
38 esac
39done
40
41get_modules_list() {
42 if [ -z "${MODULES_LIST}" ]; then
Anders Roxell25fd9512025-04-28 13:50:31 +020043 if [ -n "${MODULES_SUBDIRS}" ]; then
44 subdir=$(echo "${MODULES_SUBDIRS}" | tr ' ' '|')
45 grep -E "kernel/(${subdir})" /lib/modules/"$(uname -r)"/modules.order > /tmp/find_modules.txt
46 else
47 # No subdir given, default to all modules
48 cat /lib/modules/"$(uname -r)"/modules.order > /tmp/find_modules.txt
49 fi
50
51 if [ -n "${SKIPLIST}" ]; then
52 skiplist=$(echo "${SKIPLIST}" | tr ' ' '|')
53 grep -E -v "(${skiplist})" /tmp/find_modules.txt > /tmp/modules_to_run.txt
54 else
55 cp /tmp/find_modules.txt /tmp/modules_to_run.txt
56 fi
57
Anders Roxell8aa8dbf2024-07-11 14:42:19 +020058 split --verbose --numeric-suffixes=1 -n l/"${SHARD_INDEX}"/"${SHARD_NUMBER}" /tmp/modules_to_run.txt > /tmp/shardfile
Anders Roxellbde4f2e2024-07-09 19:29:06 +020059 echo "============== Tests to run ==============="
60 cat /tmp/shardfile
61 echo "===========End Tests to run ==============="
62 if [ -s /tmp/shardfile ]; then
63 report_pass "shardfile"
64 else
65 report_fail "shardfile"
66 fi
Anders Roxelle3f51b82024-07-04 12:30:01 +020067 while IFS= read -r line
68 do
69 module_basename=$(basename "${line}")
70 module_name=${module_basename%.*}
71 MODULES_LIST="${MODULES_LIST} ${module_name}"
72 done < /tmp/shardfile
73 fi
74}
75
76report() {
77 local _modprop_flag="${1}"
78 local _module="${2}"
79 local _text="${3}"
80 local _num="${4}"
81 echo
82 echo "${_text} module: ${_module}"
83 if ! modprobe "${_module}" "${_modprop_flag}"; then
84 report_fail "${_text}_module_${_num}_${_module}"
85 else
86 report_pass "${_text}_module_${_num}_${_module}"
87 fi
88}
89
Anders Roxella7b173b2025-04-28 12:24:19 +020090scan_dmesg_for_errors() {
91 echo "=== Scanning dmesg for errors ==="
92 dmesg -l 0,1,2,3,4,5 | grep -Ei "BUG:|WARNING:|Oops:|Call Trace:" && report_fail "dmesg_error_scan" || report_pass "dmesg_error_scan"
93}
94
Anders Roxelle6199bd2025-04-28 12:25:03 +020095check_module_unloaded() {
96 local _module="$1"
97 if lsmod | grep "^${_module} " > /dev/null; then
98 echo "Module ${_module} still loaded after removal!"
99 report_fail "module_stuck_${_module}"
100 else
101 report_pass "module_unloaded_${_module}"
102 fi
103}
104
Anders Roxellad114aa2025-04-28 12:25:26 +0200105kmemleak_scan() {
106 if [ -e /sys/kernel/debug/kmemleak ]; then
107 echo "Triggering kmemleak scan..."
108 echo scan > /sys/kernel/debug/kmemleak
109 sleep 5
110 if grep -q . /sys/kernel/debug/kmemleak; then
111 echo "Potential memory leaks detected:"
112 cat /sys/kernel/debug/kmemleak
113 report_fail "kmemleak_detected"
114 else
115 report_pass "kmemleak_no_leaks"
116 fi
117 else
118 echo "kmemleak not available, skipping scan."
119 fi
120}
121
Anders Roxelle3f51b82024-07-04 12:30:01 +0200122run () {
123 for module in ${MODULES_LIST}; do
124 # don't insert/remove modules that is already inserted.
125 if ! lsmod | grep "^${module}"; then
126 for num in $(seq "${MODULE_MODPROBE_NUMBER}"); do
127 dmesg -C
128 report "" "${module}" "insert" "${num}"
129 echo
130 echo "modinfo ${module}"
131 modinfo "${module}"
Anders Roxella7b173b2025-04-28 12:24:19 +0200132 scan_dmesg_for_errors
133
Anders Roxelle3f51b82024-07-04 12:30:01 +0200134 report "--remove" "${module}" "remove" "${num}"
Anders Roxella7b173b2025-04-28 12:24:19 +0200135 scan_dmesg_for_errors
Anders Roxelle6199bd2025-04-28 12:25:03 +0200136
137 check_module_unloaded "${module}"
Anders Roxelle3f51b82024-07-04 12:30:01 +0200138 done
139 fi
140 done
141}
142
143# Test run.
144! check_root && error_msg "This script must be run as root"
145create_out_dir "${OUTPUT}"
146info_msg "Output directory: ${OUTPUT}"
147info_msg "About to run load/unload kernel modules ..."
148get_modules_list
149run
Anders Roxellad114aa2025-04-28 12:25:26 +0200150kmemleak_scan