#!/bin/bash # BC-250 KIQ Fix - Post-Reboot Validation Script # Run this after rebooting with the patched amdgpu module # # Tests: # 1. Module loaded check # 2. dmesg for KIQ fence timeouts (should be ZERO) # 3. rocminfo # 4. hip_probe (with normal exit, no _exit hack) # 5. hip_vector_add # 6. Multiple sequential GPU runs (stress test) # 7. Process exit cleanup (the main fix target) set +e # Don't exit on error - we want to see all results RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' pass() { echo -e "${GREEN}[PASS]${NC} $1"; } fail() { echo -e "${RED}[FAIL]${NC} $1"; } warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } info() { echo -e " $1"; } echo "==========================================" echo "BC-250 KIQ Fix - Post-Reboot Validation" echo "==========================================" echo "Date: $(date)" echo "Kernel: $(uname -r)" echo "" # Test 1: Module loaded echo "--- Test 1: Module Status ---" if lsmod | grep -q amdgpu; then pass "amdgpu module is loaded" MODULE_SIZE=$(lsmod | grep "^amdgpu " | awk '{print $2}') info "Module size: ${MODULE_SIZE}K" else fail "amdgpu module not loaded!" exit 1 fi # Test 2: Check for KIQ fence timeouts at boot echo "" echo "--- Test 2: KIQ Fence Timeouts (boot) ---" KIQ_ERRORS=$(dmesg | grep -ci "kiq.*fence\|fence.*kiq\|KIQ.*timeout" 2>/dev/null || echo "0") if [ "$KIQ_ERRORS" = "0" ]; then pass "No KIQ fence timeout errors in dmesg" else warn "Found $KIQ_ERRORS KIQ-related messages (checking if they're errors...)" dmesg | grep -i "kiq.*fence\|fence.*kiq\|KIQ.*timeout" | head -5 fi # Test 3: SDMA check (known issue, cosmetic) echo "" echo "--- Test 3: SDMA Status ---" SDMA_ERRORS=$(dmesg | grep -ci "sdma.*fence\|sdma.*timeout" 2>/dev/null || echo "0") if [ "$SDMA_ERRORS" = "0" ]; then pass "No SDMA fence errors" else warn "SDMA errors present (cosmetic, mitigated by HSA_ENABLE_SDMA=0)" fi # Test 4: rocminfo echo "" echo "--- Test 4: rocminfo ---" if timeout 30 rocminfo 2>/dev/null | grep -q "gfx10"; then pass "rocminfo detects GPU" rocminfo 2>/dev/null | grep "Name:\|Marketing Name:\|Compute Unit:" | head -5 else fail "rocminfo failed or timed out" fi # Test 5: hip_probe echo "" echo "--- Test 5: hip_probe ---" HIP_PROBE="/home/dars/VibeROCm/hip_probe" if [ -x "$HIP_PROBE" ]; then if timeout 30 "$HIP_PROBE" 2>&1; then pass "hip_probe completed successfully" else fail "hip_probe failed (exit code: $?)" fi # CRITICAL: Check for KIQ errors AFTER process exit sleep 3 POST_KIQ=$(dmesg | tail -20 | grep -ci "kiq.*fence\|fence.*kiq\|KIQ.*timeout" 2>/dev/null || echo "0") if [ "$POST_KIQ" = "0" ]; then pass "No KIQ errors after hip_probe exit!" else fail "KIQ errors appeared after hip_probe exit" dmesg | tail -10 fi else warn "hip_probe not found at $HIP_PROBE" fi # Test 6: hip_vector_add echo "" echo "--- Test 6: hip_vector_add ---" HIP_VECTOR="/home/dars/VibeROCm/hip_vector_add" if [ -x "$HIP_VECTOR" ]; then if timeout 30 "$HIP_VECTOR" 2>&1; then pass "hip_vector_add completed successfully" else fail "hip_vector_add failed (exit code: $?)" fi sleep 3 POST_KIQ=$(dmesg | tail -20 | grep -ci "kiq.*fence\|fence.*kiq\|KIQ.*timeout" 2>/dev/null || echo "0") if [ "$POST_KIQ" = "0" ]; then pass "No KIQ errors after hip_vector_add exit!" else fail "KIQ errors appeared after hip_vector_add exit" fi else warn "hip_vector_add not found at $HIP_VECTOR" fi # Test 7: Multiple sequential runs (stress test for process lifecycle) echo "" echo "--- Test 7: Sequential GPU Stress (5 rounds) ---" if [ -x "$HIP_VECTOR" ]; then STRESS_PASS=0 for i in 1 2 3 4 5; do if timeout 30 "$HIP_VECTOR" >/dev/null 2>&1; then STRESS_PASS=$((STRESS_PASS + 1)) else fail "Round $i failed" break fi sleep 1 done if [ "$STRESS_PASS" -eq 5 ]; then pass "All 5 sequential GPU runs completed successfully!" else fail "Only $STRESS_PASS/5 rounds passed" fi # Final KIQ check sleep 5 FINAL_KIQ=$(dmesg | tail -50 | grep -ci "kiq.*fence\|fence.*kiq\|KIQ.*timeout" 2>/dev/null || echo "0") if [ "$FINAL_KIQ" = "0" ]; then pass "No KIQ errors after stress test!" else fail "KIQ errors after stress test: $FINAL_KIQ" dmesg | tail -20 | grep -i "kiq\|fence" fi else warn "Skipping stress test" fi # Test 8: rocminfo AFTER all GPU tests (this is the killer - previously hung) echo "" echo "--- Test 8: rocminfo After GPU Tests ---" if timeout 30 rocminfo 2>/dev/null | grep -q "gfx10"; then pass "rocminfo still works after GPU tests! (Previously this HUNG)" else fail "rocminfo hung or failed after GPU tests" fi echo "" echo "==========================================" echo "Validation complete." echo "=========================================="