Skip to content

Commit 920ae74

Browse files
committed
kernel/baseport: harden IPA & RMNET tests (cfg gate, safe load/unload, node checks)
- Gate both tests on kernel configs (CONFIG_QCOM_IPA / CONFIG_RMNET); skip cleanly when unsupported. - Use existing helpers (check_kernel_config, find_kernel_module, load_kernel_module, unload_kernel_module, is_module_loaded) instead of ad-hoc insmod/rmmod logic. - Track whether modules were preloaded and only unload if the test loaded them. Fixes second-run failures caused by removing a module another test needs. - Add wait_for_path-style check for /dev/ipa and /dev/rmnet* (short timeout), but treat 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000 link/ether 00:50:56:8e:7e:c2 brd ff:ff:ff:ff:ff:ff altname enp3s0 3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default link/ether b6:8c:4f:19:b8:4c brd ff:ff:ff:ff:ff:ff rmnet visibility as informational (non-fatal). - Improve logging: explicit PASS/WARN/FAIL lines for node presence and module state; keep .res minimal (just TESTNAME + result). Signed-off-by: Srikanth Muppandam <[email protected]>
1 parent eb98001 commit 920ae74

File tree

3 files changed

+208
-91
lines changed

3 files changed

+208
-91
lines changed

Runner/suites/Kernel/Baseport/IPA/run.sh

Lines changed: 46 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
# Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
44
# SPDX-License-Identifier: BSD-3-Clause-Clear
5+
#
6+
# Test for IPA driver: skip if CONFIG_QCOM_IPA not enabled, then
7+
# builtin vs module, verify /dev/ipa, functional sysfs & dmesg checks.
58

69
# Robustly find and source init_env
710
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
@@ -30,40 +33,61 @@ fi
3033
TESTNAME="IPA"
3134
test_path=$(find_test_case_by_name "$TESTNAME")
3235
cd "$test_path" || exit 1
33-
res_file="./$TESTNAME.res"
36+
RES_FILE="./$TESTNAME.res"
3437

3538
log_info "-----------------------------------------------------------------------------------------"
3639
log_info "-------------------Starting $TESTNAME Testcase----------------------------"
3740
log_info "=== Test Initialization ==="
3841

39-
IPA_MODULE_PATH=$(find_kernel_module "ipa")
40-
41-
if [ -z "$IPA_MODULE_PATH" ]; then
42-
log_error "ipa.ko module not found in filesystem."
43-
echo "$TESTNAME FAIL" > "$res_file"
44-
exit 1
42+
# Kernel config gate
43+
if ! check_kernel_config "CONFIG_QCOM_IPA"; then
44+
log_skip "$TESTNAME SKIP - CONFIG_QCOM_IPA not enabled"
45+
echo "$TESTNAME SKIP" >"$RES_FILE"
46+
exit 0
4547
fi
4648

47-
log_info "Found ipa.ko at: $IPA_MODULE_PATH"
49+
MODNAME="ipa"
50+
PRE_LOADED=0
4851

49-
if ! load_kernel_module "$IPA_MODULE_PATH"; then
50-
echo "$TESTNAME FAIL" > "$res_file"
51-
exit 1
52+
# Ensure module is loaded
53+
if is_module_loaded "$MODNAME"; then
54+
PRE_LOADED=1
55+
log_info "Module $MODNAME already loaded"
56+
else
57+
MODPATH=$(find_kernel_module "$MODNAME")
58+
[ -n "$MODPATH" ] || log_fail "$MODNAME.ko not found in filesystem"
59+
load_kernel_module "$MODPATH" || log_fail "Failed to load $MODNAME"
60+
log_pass "$MODNAME module loaded"
5261
fi
5362

54-
if is_module_loaded "ipa"; then
55-
log_info "ipa module is loaded"
56-
log_pass "$TESTNAME : Test Passed"
57-
echo "$TESTNAME PASS" > "$res_file"
58-
exit 0
63+
# /dev node check (warn only, don't fail/skip)
64+
log_info "Verifying /dev/ipa node"
65+
if wait_for_path "/dev/ipa" 3; then
66+
log_pass "/dev/ipa node is present"
5967
else
60-
log_error "ipa module not listed in lsmod"
61-
log_fail "$TESTNAME : Test Failed"
62-
echo "$TESTNAME FAIL" > "$res_file"
63-
exit 1
68+
log_warn "No /dev/ipa node found (platform/use-case may not expose it)"
6469
fi
6570

66-
log_info "=== Cleanup ==="
67-
unload_kernel_module "ipa" true
71+
# dmesg scan: errors + success pattern
72+
# scan_dmesg_errors(label, out_dir, extra_err, ok_kw)
73+
scan_dmesg_errors "ipa" "." "handshake_complete.*error|stall|abort" "IPA Q6 handshake completed"
74+
rc=$?
75+
case "$rc" in
76+
0) log_warn "IPA-related errors found in dmesg (see ipa_dmesg_errors.log)" ;;
77+
1) log_info "No IPA-related errors in dmesg" ;;
78+
2) log_warn "Success pattern 'IPA Q6 handshake completed' not found in dmesg" ;;
79+
3) log_warn "scan_dmesg_errors misuse (label missing?)" ;;
80+
esac
81+
82+
#Cleanup: unload only if we loaded it
83+
if [ "$PRE_LOADED" -eq 0 ]; then
84+
log_info "Unloading $MODNAME (loaded by this test)"
85+
unload_kernel_module "$MODNAME" false || log_warn "Unload $MODNAME failed"
86+
else
87+
log_info "$MODNAME was pre-loaded; leaving it loaded"
88+
fi
6889

6990
log_info "-------------------Completed $TESTNAME Testcase----------------------------"
91+
log_pass "$TESTNAME PASS"
92+
echo "$TESTNAME PASS" >"$RES_FILE"
93+
exit 0

Runner/suites/Kernel/Baseport/RMNET/run.sh

Lines changed: 63 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
# Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
44
# SPDX-License-Identifier: BSD-3-Clause-Clear
5+
#
6+
# Test for RMNET driver: skip if CONFIG_RMNET not enabled, then
7+
# builtin vs module, verify /dev/rmnet, functional sysfs & dmesg checks.
58

69
# Robustly find and source init_env
710
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
@@ -30,40 +33,79 @@ fi
3033
TESTNAME="RMNET"
3134
test_path=$(find_test_case_by_name "$TESTNAME")
3235
cd "$test_path" || exit 1
33-
res_file="./$TESTNAME.res"
36+
RES_FILE="./$TESTNAME.res"
3437

3538
log_info "-----------------------------------------------------------------------------------------"
3639
log_info "-------------------Starting $TESTNAME Testcase----------------------------"
3740
log_info "=== Test Initialization ==="
3841

39-
RMNET_MODULE_PATH=$(find_kernel_module "rmnet")
4042

41-
if [ -z "$RMNET_MODULE_PATH" ]; then
42-
log_error "rmnet.ko module not found in filesystem."
43-
echo "$TESTNAME FAIL" > "$res_file"
44-
exit 1
43+
# Kernel config gate
44+
if ! check_kernel_config "CONFIG_RMNET"; then
45+
log_skip "$TESTNAME SKIP - CONFIG_RMNET not enabled"
46+
echo "$TESTNAME SKIP" >"$RES_FILE"
47+
exit 0
4548
fi
4649

47-
log_info "Found rmnet.ko at: $RMNET_MODULE_PATH"
50+
# Load module if needed
51+
MODNAME="rmnet"
52+
PRE_LOADED=0
53+
if is_module_loaded "$MODNAME"; then
54+
PRE_LOADED=1
55+
log_info "Module $MODNAME already loaded"
56+
else
57+
MODPATH=$(find_kernel_module "$MODNAME")
58+
[ -n "$MODPATH" ] || log_fail "$MODNAME.ko not found in filesystem"
59+
load_kernel_module "$MODPATH" || log_fail "Failed to load $MODNAME"
60+
log_pass "$MODNAME module loaded"
61+
fi
4862

49-
if ! load_kernel_module "$RMNET_MODULE_PATH"; then
50-
echo "$TESTNAME FAIL" > "$res_file"
51-
exit 1
63+
# /dev/rmnet* nodes (authoritative), but do NOT FAIL if absent (common until modem data call)
64+
log_info "Verifying /dev/rmnet* node(s)"
65+
first_node=""
66+
for n in /dev/rmnet*; do
67+
case "$n" in
68+
/dev/rmnet*) [ -e "$n" ] && { first_node="$n"; break; } ;;
69+
esac
70+
done
71+
72+
if [ -n "$first_node" ]; then
73+
if wait_for_path "$first_node" 3; then
74+
log_pass "rmnet node $first_node is present"
75+
else
76+
log_fail "rmnet node $first_node did not appear within timeout"
77+
fi
78+
else
79+
log_warn "No /dev/rmnet* nodes found"
5280
fi
5381

54-
if is_module_loaded "rmnet"; then
55-
log_info "rmnet module is loaded"
56-
log_pass "$TESTNAME : Test Passed"
57-
echo "$TESTNAME PASS" > "$res_file"
58-
exit 0
82+
# dmesg scan for rmnet errors (no positive 'OK' pattern required here)
83+
scan_dmesg_errors "rmnet" "." "panic|oops|fault|stall|abort" ""
84+
if [ -s "./rmnet_dmesg_errors.log" ]; then
85+
log_fail "rmnet-related errors found in dmesg"
5986
else
60-
log_error "rmnet module not listed in lsmod"
61-
log_fail "$TESTNAME : Test Failed"
62-
echo "$TESTNAME FAIL" > "$res_file"
63-
exit 1
87+
log_info "No rmnet-related errors in dmesg"
88+
fi
89+
90+
# Optional informational check: ip link (do not fail if absent)
91+
if command -v ip >/dev/null 2>&1; then
92+
if ip -o link show | grep -qi rmnet; then
93+
log_info "ip(8): rmnet interface(s) present"
94+
else
95+
log_info "ip(8): no rmnet interface yet (probably no data call)"
96+
fi
6497
fi
6598

66-
log_info "=== Cleanup ==="
67-
unload_kernel_module "rmnet" true
99+
# Cleanup if we loaded it
100+
if [ "$PRE_LOADED" -eq 0 ]; then
101+
log_info "Unloading $MODNAME (loaded by this test)"
102+
unload_kernel_module "$MODNAME" false || log_warn "Unload $MODNAME failed"
103+
else
104+
log_info "$MODNAME was pre-loaded; leaving it loaded"
105+
fi
68106

69107
log_info "-------------------Completed $TESTNAME Testcase----------------------------"
108+
log_pass "$TESTNAME PASS"
109+
echo "$TESTNAME PASS" >"$RES_FILE"
110+
exit 0
111+

Runner/utils/functestlib.sh

Lines changed: 99 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,13 @@ is_module_loaded() {
6161
/sbin/lsmod | awk '{print $1}' | grep -q "^${module_name}$"
6262
}
6363

64-
# Insert a kernel module with optional parameters
64+
# load_kernel_module <path-to-ko> [params...]
65+
# 1) If already loaded, no-op
66+
# 2) Try insmod <ko> [params]
67+
# 3) If that fails, try modprobe <modname> [params]
6568
load_kernel_module() {
66-
module_path="$1"
67-
shift
69+
module_path="$1"; shift
6870
params="$*"
69-
7071
module_name=$(basename "$module_path" .ko)
7172

7273
if is_module_loaded "$module_name"; then
@@ -76,15 +77,24 @@ load_kernel_module() {
7677

7778
if [ ! -f "$module_path" ]; then
7879
log_error "Module file not found: $module_path"
79-
return 1
80+
# still try modprobe if it exists in modules directory
81+
else
82+
log_info "Loading module via insmod: $module_path $params"
83+
if /sbin/insmod "$module_path" "$params" 2>insmod_err.log; then
84+
log_info "Module $module_name loaded successfully via insmod"
85+
return 0
86+
else
87+
log_warn "insmod failed: $(cat insmod_err.log)"
88+
fi
8089
fi
8190

82-
log_info "Loading module: $module_path $params"
83-
if /sbin/insmod "$module_path" "$params" 2>insmod_err.log; then
84-
log_info "Module $module_name loaded successfully"
91+
# fallback to modprobe
92+
log_info "Falling back to modprobe $module_name $params"
93+
if /sbin/modprobe "$module_name" "$params" 2>modprobe_err.log; then
94+
log_info "Module $module_name loaded successfully via modprobe"
8595
return 0
8696
else
87-
log_error "insmod failed: $(cat insmod_err.log)"
97+
log_error "modprobe failed: $(cat modprobe_err.log)"
8898
return 1
8999
fi
90100
}
@@ -171,14 +181,25 @@ find_test_case_script_by_name() {
171181
find "$base_dir" -type d -iname "$test_name" -print -quit 2>/dev/null
172182
}
173183

184+
# Check each given kernel config is set to y/m in /proc/config.gz, logs result, returns 0/1.
174185
check_kernel_config() {
175-
configs="$1"
176-
for config_key in $configs; do
177-
if zcat /proc/config.gz | grep -qE "^$config_key=(y|m)"; then
178-
log_pass "Kernel config $config_key is enabled"
186+
cfgs=$1
187+
for config_key in $cfgs; do
188+
if command -v zgrep >/dev/null 2>&1; then
189+
if zgrep -qE "^${config_key}=(y|m)" /proc/config.gz 2>/dev/null; then
190+
log_pass "Kernel config $config_key is enabled"
191+
else
192+
log_fail "Kernel config $config_key is missing or not enabled"
193+
return 1
194+
fi
179195
else
180-
log_fail "Kernel config $config_key is missing or not enabled"
181-
return 1
196+
# Fallback if zgrep is unavailable
197+
if gzip -dc /proc/config.gz 2>/dev/null | grep -qE "^${config_key}=(y|m)"; then
198+
log_pass "Kernel config $config_key is enabled"
199+
else
200+
log_fail "Kernel config $config_key is missing or not enabled"
201+
return 1
202+
fi
182203
fi
183204
done
184205
return 0
@@ -1653,41 +1674,71 @@ detect_ufs_partition_block() {
16531674
return 1
16541675
}
16551676

1656-
# Check for dmesg I/O errors and log summary
1677+
# scan_dmesg_check <label> [out_dir] [extra_err_kw] [ok_kw]
1678+
# Returns:
1679+
# 0 -> no errors; ok_kw matched (or not requested)
1680+
# 1 -> error lines found
1681+
# 2 -> no errors, but ok_kw (if given) NOT found
16571682
scan_dmesg_errors() {
1658-
label="$1" # Example: "ufs", "emmc", "wifi"
1659-
output_dir="$2" # Directory to store logs
1660-
extra_keywords="$3" # (Optional) Space-separated keywords for this label
1661-
1662-
[ -z "$label" ] && return 1
1663-
[ -z "$output_dir" ] && output_dir="."
1664-
1665-
snapshot_file="$output_dir/${label}_dmesg_snapshot.log"
1666-
error_file="$output_dir/${label}_dmesg_errors.log"
1667-
1668-
log_info "Scanning dmesg for recent $label-related I/O errors..."
1669-
1670-
dmesg | tail -n 300 > "$snapshot_file"
1671-
1672-
# Common error indicators
1673-
common_keywords="error fail timeout reset crc abort fault invalid fatal warn"
1674-
1675-
# Build keyword pattern (common + optional extra)
1676-
pattern="($common_keywords"
1677-
if [ -n "$extra_keywords" ]; then
1678-
pattern="$pattern|$extra_keywords"
1679-
fi
1680-
pattern="$pattern)"
1681-
1682-
# Filter: lines must match label and error pattern
1683-
grep -iE "$label" "$snapshot_file" | grep -iE "$pattern" > "$error_file"
1684-
1685-
if [ -s "$error_file" ]; then
1686-
log_warn "Detected potential $label-related errors in dmesg:"
1683+
label="$1"
1684+
out_dir="${2:-.}"
1685+
extra_err="${3:-}"
1686+
ok_kw="${4:-}"
1687+
1688+
[ -z "$label" ] && return 3 # misuse
1689+
1690+
lines="${DMESG_LINES:-300}"
1691+
snap="$out_dir/${label}_dmesg_snapshot.log"
1692+
errf="$out_dir/${label}_dmesg_errors.log"
1693+
okf="$out_dir/${label}_dmesg_ok.log"
1694+
1695+
log_info "Scanning dmesg for ${label}: errors & success patterns"
1696+
1697+
dmesg | tail -n "$lines" >"$snap"
1698+
1699+
# Error keywords
1700+
common_err='error|fail|timeout|reset|crc|abort|fault|invalid|fatal|warn|oops|panic'
1701+
err_pat="$common_err"
1702+
[ -n "$extra_err" ] && err_pat="${err_pat}|${extra_err}"
1703+
1704+
# Find error lines (must match label AND error pattern)
1705+
grep -iE "$label" "$snap" | grep -iE "($err_pat)" >"$errf" 2>/dev/null
1706+
1707+
if [ -s "$errf" ]; then
1708+
log_warn "Detected potential ${label}-related errors:"
16871709
while IFS= read -r line; do
16881710
log_warn " dmesg: $line"
1689-
done < "$error_file"
1690-
else
1691-
log_info "No $label-related errors found in recent dmesg logs."
1711+
done <"$errf"
1712+
return 0
1713+
fi
1714+
1715+
# Optionally look for OK messages
1716+
if [ -n "$ok_kw" ]; then
1717+
grep -iE "$ok_kw" "$snap" >"$okf" 2>/dev/null
1718+
if [ -s "$okf" ]; then
1719+
log_pass "Found success pattern for $label in dmesg"
1720+
while IFS= read -r line; do
1721+
log_info " ok: $line"
1722+
done <"$okf"
1723+
return 1
1724+
else
1725+
log_warn "No success pattern ('$ok_kw') found for $label"
1726+
return 2
1727+
fi
16921728
fi
1729+
1730+
log_info "No ${label}-related errors found (no OK pattern requested)"
1731+
return 1
1732+
}
1733+
1734+
# wait_for_path <path> [timeout_sec]
1735+
wait_for_path() {
1736+
_p="$1"; _t="${2:-3}"
1737+
i=0
1738+
while [ "$i" -lt "$_t" ]; do
1739+
[ -e "$_p" ] && return 0
1740+
sleep 1
1741+
i=$((i+1))
1742+
done
1743+
return 1
16931744
}

0 commit comments

Comments
 (0)