| #!/bin/sh |
| # SPDX-License-Identifier: GPL-2.0-or-later |
| # description: Test wwnr monitor with printk reactor |
| # requires: available_reactors wwnr:monitor printk:reactor stress-ng:program |
| |
| load() { # returns true if there was a reaction |
| local lines_before num load_pid ret |
| num=$((($(nproc) + 1) / 2)) |
| lines_before=$(dmesg | wc -l) |
| stress-ng --cpu-sched "$num" --timer "$num" -t 5 -q & |
| load_pid=$! |
| timeout 5 dmesg -w | tail -n +$((lines_before + 1)) | \ |
| grep -m 1 -q "rv: monitor wwnr does not allow event" |
| ret=$? |
| kill "$load_pid" || true |
| wait "$load_pid" || true |
| return $ret |
| } |
| |
| # loads may flood the ringbuffer, wait for all pending printks (timeout at 2 minutes) |
| wait_dmesg_flush() { |
| local last_before last_after |
| for _ in $(seq 400); do |
| last_before=$last_after |
| last_after=$(dmesg | grep "rv:" | tail -n 1 || true) |
| [ "$last_before" = "$last_after" ] && return 0 |
| sleep .3 |
| done |
| return 1 |
| } |
| |
| echo 1 > monitors/wwnr/enable |
| echo printk > monitors/wwnr/reactors |
| |
| load |
| |
| echo 0 > monitoring_on |
| wait_dmesg_flush |
| |
| ! load || false |
| echo 1 > monitoring_on |
| |
| load |
| |
| echo 0 > reacting_on |
| wait_dmesg_flush |
| |
| ! load || false |
| echo 1 > reacting_on |
| |
| echo nop > monitors/wwnr/reactors |
| echo 0 > monitors/wwnr/enable |