From 3d4d5f0db0135ecf997426012e55c315ab59517a Mon Sep 17 00:00:00 2001 From: Srikanth Muppandam Date: Sun, 31 May 2026 22:12:20 +0530 Subject: [PATCH] shmbridge: avoid false failures from qcom_scm kernel cmdline The shmbridge test scans current-boot kernel logs for qcom_scm-related errors. The existing match is too broad and can treat benign boot arguments such as qcom_scm.download_mode=1 as failures when other kernel command line parameters contain error-like words such as panic. Update the log scan to: - collect qcom_scm/shmbridge-related lines - ignore Kernel command line entries - ignore qcom_scm.download_mode - ignore CONFIG_QCOM_SCM references - fail only when the remaining lines contain real error keywords This avoids false LAVA failures while preserving detection of genuine qcom_scm or shmbridge errors. Signed-off-by: Srikanth Muppandam --- .../suites/Kernel/Baseport/shmbridge/run.sh | 130 ++++++++++++++++-- 1 file changed, 115 insertions(+), 15 deletions(-) diff --git a/Runner/suites/Kernel/Baseport/shmbridge/run.sh b/Runner/suites/Kernel/Baseport/shmbridge/run.sh index ee00c1f1..fd2cc8b4 100755 --- a/Runner/suites/Kernel/Baseport/shmbridge/run.sh +++ b/Runner/suites/Kernel/Baseport/shmbridge/run.sh @@ -2,10 +2,12 @@ # Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. # SPDX-License-Identifier: BSD-3-Clause + # Locate and source init_env SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" INIT_ENV="" SEARCH="$SCRIPT_DIR" + while [ "$SEARCH" != "/" ]; do if [ -f "$SEARCH/init_env" ]; then INIT_ENV="$SEARCH/init_env" @@ -36,8 +38,8 @@ log_info "==== Test Initialization ====" log_info "Checking if required tools are available" -if ! check_dependencies grep; then - log_skip "$TESTNAME SKIP - missing required grep utility" +if ! check_dependencies grep cat sed; then + log_skip "$TESTNAME SKIP - missing required utilities" echo "$TESTNAME SKIP" >"$res_file" exit 0 fi @@ -51,33 +53,131 @@ fi log_info "Checking qcom_scm presence using sysfs/current-boot kernel log" +qcom_scm_present=0 + if [ -d /sys/module/qcom_scm ]; then + qcom_scm_present=1 log_pass "qcom_scm driver is present in sysfs." + log_info "qcom_scm sysfs node: /sys/module/qcom_scm" + + if command -v print_path_meta >/dev/null 2>&1; then + print_path_meta /sys/module/qcom_scm 2>/dev/null | + while IFS= read -r line || [ -n "$line" ]; do + [ -n "$line" ] || continue + log_info "[qcom_scm-sysfs] $line" + done + fi + + if [ -r /sys/module/qcom_scm/initstate ]; then + qcom_scm_initstate="$(cat /sys/module/qcom_scm/initstate 2>/dev/null || true)" + [ -n "$qcom_scm_initstate" ] || qcom_scm_initstate="unknown" + log_info "qcom_scm initstate: $qcom_scm_initstate" + else + log_info "qcom_scm initstate: " + fi + + if [ -r /sys/module/qcom_scm/refcnt ]; then + qcom_scm_refcnt="$(cat /sys/module/qcom_scm/refcnt 2>/dev/null || true)" + [ -n "$qcom_scm_refcnt" ] || qcom_scm_refcnt="unknown" + log_info "qcom_scm refcnt: $qcom_scm_refcnt" + else + log_info "qcom_scm refcnt: " + fi + + if [ -d /sys/module/qcom_scm/parameters ]; then + log_info "qcom_scm parameters:" + qcom_scm_param_found=0 + + for param in /sys/module/qcom_scm/parameters/*; do + [ -e "$param" ] || continue + qcom_scm_param_found=1 + param_name="${param##*/}" + + if [ -r "$param" ]; then + param_value="$(cat "$param" 2>/dev/null || true)" + [ -n "$param_value" ] || param_value="" + log_info "[qcom_scm-param] $param_name=$param_value" + else + log_info "[qcom_scm-param] $param_name=" + fi + done + + if [ "$qcom_scm_param_found" -eq 0 ]; then + log_info "[qcom_scm-param] " + fi + else + log_info "qcom_scm parameters: " + fi + + if [ -d /sys/module/qcom_scm/drivers ]; then + log_info "qcom_scm driver links:" + qcom_scm_driver_found=0 + + for driver_link in /sys/module/qcom_scm/drivers/*; do + [ -e "$driver_link" ] || continue + qcom_scm_driver_found=1 + log_info "[qcom_scm-driver] ${driver_link##*/}" + done + + if [ "$qcom_scm_driver_found" -eq 0 ]; then + log_info "[qcom_scm-driver] " + fi + else + log_info "qcom_scm driver links: " + fi elif get_kernel_log 2>/dev/null | grep -qi '\bqcom_scm\b'; then + qcom_scm_present=1 log_pass "qcom_scm present in current-boot kernel log." -else + log_info "qcom_scm sysfs node: ; using current-boot kernel log evidence" + + get_kernel_log 2>/dev/null | + grep -i '\bqcom_scm\b' | + grep -viE 'Kernel command line|Command line|qcom_scm\.download_mode' | + sed -n '1,10p' | + while IFS= read -r line || [ -n "$line" ]; do + [ -n "$line" ] || continue + log_info "[qcom_scm-kernel-evidence] $line" + done +fi + +if [ "$qcom_scm_present" -ne 1 ]; then log_fail "FAIL: qcom_scm not found in sysfs or current-boot kernel log." echo "$TESTNAME FAIL" > "$res_file" exit 0 fi -scm_log="./qcom_scm_kernel.log" -scm_err="./qcom_scm_errors.log" -err_patterns='probe failed|fail(ed)?|error|timed out|not found|invalid|corrupt|abort|panic|oops|unhandled' +log_info "Scanning current-boot kernel log for qcom_scm/shmbridge-related errors" -log_info "Scanning current-boot kernel log for qcom_scm-related errors" -get_kernel_log > "$scm_log" 2>/dev/null || true -grep -iE "qcom_scm.*($err_patterns)" "$scm_log" > "$scm_err" || true +# Avoid stale scanner results from previous manual/local runs. +# These files are generated by scan_dmesg_errors for the current test. +: > ./dmesg_errors.log 2>/dev/null || true +: > ./dmesg_snapshot.log 2>/dev/null || true -if [ -s "$scm_err" ]; then - while IFS= read -r line; do +# Use the repo-standard dmesg scanner, but do not use its return code as the +# test result. The generated dmesg_errors.log is the source of truth here. +# +# This keeps kernel-log triage consistent with other tests while avoiding the +# earlier false failure caused by benign command-line entries such as: +# qcom_scm.download_mode=1 ... panic=-1 +scan_dmesg_errors \ + "$test_path" \ + "qcom_scm|shmbridge|shm_bridge" \ + "Kernel command line|Command line|qcom_scm.download_mode|CONFIG_QCOM_SCM" || true + +if [ -s ./dmesg_errors.log ]; then + log_fail "FAIL: qcom_scm/shmbridge-related errors detected in current-boot kernel log." + log_info "Filtered qcom_scm/shmbridge kernel errors follow:" + log_info "Source: ./dmesg_errors.log" + + while IFS= read -r line || [ -n "$line" ]; do [ -n "$line" ] || continue - log_info "[kernel] $line" - done < "$scm_err" - log_fail "FAIL: qcom_scm-related errors detected in current-boot kernel log." + log_info "[qcom-scm-dmesg] $line" + done < ./dmesg_errors.log + echo "$TESTNAME FAIL" > "$res_file" else - log_pass "$TESTNAME : Test Passed (qcom_scm present and no qcom_scm-related kernel errors)" + log_info "Filtered qcom_scm/shmbridge kernel error log: ./dmesg_errors.log is empty" + log_pass "$TESTNAME : Test Passed (qcom_scm present and no qcom_scm/shmbridge-related kernel errors)" echo "$TESTNAME PASS" > "$res_file" fi