|  | #!/bin/sh | 
|  | # SPDX-License-Identifier: GPL-2.0+ | 
|  |  | 
|  | usage() { | 
|  | echo Extract any RCU CPU stall warnings present in specified file. | 
|  | echo Filter out clocksource lines.  Note that preceding-lines excludes the | 
|  | echo initial line of the stall warning but trailing-lines includes it. | 
|  | echo | 
|  | echo Usage: $(basename $0) dmesg-file [ preceding-lines [ trailing-lines ] ] | 
|  | echo | 
|  | echo Error: $1 | 
|  | } | 
|  |  | 
|  | # Terminate the script, if the argument is missing | 
|  |  | 
|  | if test -f "$1" && test -r "$1" | 
|  | then | 
|  | : | 
|  | else | 
|  | usage "Console log file \"$1\" missing or unreadable." | 
|  | exit 1 | 
|  | fi | 
|  |  | 
|  | echo $1 | 
|  | preceding_lines="${2-3}" | 
|  | trailing_lines="${3-10}" | 
|  |  | 
|  | awk -v preceding_lines="$preceding_lines" -v trailing_lines="$trailing_lines" ' | 
|  | suffix <= 0 { | 
|  | for (i = preceding_lines; i > 0; i--) | 
|  | last[i] = last[i - 1]; | 
|  | last[0] = $0; | 
|  | } | 
|  |  | 
|  | suffix > 0 { | 
|  | print $0; | 
|  | suffix--; | 
|  | if (suffix <= 0) | 
|  | print ""; | 
|  | } | 
|  |  | 
|  | suffix <= 0 && /detected stall/ { | 
|  | for (i = preceding_lines; i >= 0; i--) | 
|  | if (last[i] != "") | 
|  | print last[i]; | 
|  | suffix = trailing_lines; | 
|  | }' < "$1" | tr -d '\015' | grep -v clocksource | 
|  |  |