| ##/bin/bash |
| # SPDX-License-Identifier: GPL-2.0-or-later |
| # Copyright (c) 2022 Oracle. All Rights Reserved. |
| # |
| # Routines for dealing with ftrace (or any other tracing). |
| |
| _require_ftrace() { |
| if [ -d /sys/kernel/tracing/instances/ ];then |
| FTRACE_ROOT="/sys/kernel/tracing" |
| FTRACE_INSTANCES_DIR="/sys/kernel/tracing/instances" |
| elif [ -d /sys/kernel/debug/tracing/instances/ ];then |
| FTRACE_ROOT="/sys/kernel/debug/tracing" |
| FTRACE_INSTANCES_DIR="/sys/kernel/debug/tracing/instances" |
| else |
| _notrun "The ftrace is not supported, or tracefs is not mounted" |
| fi |
| } |
| |
| _ftrace_cleanup() { |
| if [ -d "$FTRACE_DIR" ]; then |
| _ftrace_ignore_events |
| # Removing an ftrace buffer requires rmdir, even though the |
| # virtual directory contains children. |
| rmdir "$FTRACE_DIR" |
| fi |
| } |
| |
| _ftrace_setup() { |
| test -n "$FTRACE_DIR" && _fail "_ftrace_setup already run?" |
| |
| # Give this fstest its own ftrace buffer so that we don't mess up |
| # any other tracers that might be running. |
| FTRACE_DIR="$FTRACE_INSTANCES_DIR/fstests.$seq" |
| |
| test -d "$FTRACE_DIR" && rmdir "$FTRACE_DIR" |
| mkdir "$FTRACE_DIR" |
| } |
| |
| # Intercept the given events. Arguments may be regular expressions. |
| _ftrace_record_events() { |
| test -d "$FTRACE_DIR" || _fail "_ftrace_setup not run?" |
| |
| for arg in "$@"; do |
| # Replace slashes with semicolons per ftrace convention |
| find "$FTRACE_DIR/events/" -type d -name "$arg" -printf '%P\n' | \ |
| tr '/' ':' >> "$FTRACE_DIR/set_event" |
| done |
| } |
| |
| # Stop intercepting the given events. If no arguments, stops all events. |
| _ftrace_ignore_events() { |
| test -d "$FTRACE_DIR" || _fail "_ftrace_setup not run?" |
| |
| if [ "$#" -eq 0 ]; then |
| echo > "$FTRACE_DIR/set_event" |
| else |
| for arg in "$@"; do |
| # Replace slashes with semicolons per ftrace convention |
| find "$FTRACE_DIR/events/" -type d -name "$arg" -printf '!%P\n' | \ |
| tr '/' ':' >> "$FTRACE_DIR/set_event" |
| done |
| fi |
| } |
| |
| # Dump whatever was written to the ftrace buffer since the last time this |
| # helper was called. |
| _ftrace_dump() { |
| test -d "$FTRACE_DIR" || _fail "_ftrace_setup not run?" |
| |
| cat "$FTRACE_DIR/trace" |
| } |