| #!/bin/bash | |
| # perf annotate weight regression test | |
| # SPDX-License-Identifier: GPL-2.0 | |
| set -e | |
| shelldir=$(dirname "$0") | |
| # shellcheck source=tools/perf/tests/shell/lib/perf_has_symbol.sh | |
| . "${shelldir}"/lib/perf_has_symbol.sh | |
| testsym="test_loop" | |
| skip_test_missing_symbol "${testsym}" | |
| perfdata=$(mktemp /tmp/__perf_test.annotate_weight.XXXXX) | |
| record_log=$(mktemp /tmp/__perf_test.annotate_weight.XXXXX.log) | |
| report_out=$(mktemp /tmp/__perf_test.annotate_weight.XXXXX.report) | |
| annotate_out=$(mktemp /tmp/__perf_test.annotate_weight.XXXXX.annotate) | |
| cleanup() { | |
| rm -f "${perfdata}" "${record_log}" "${report_out}" "${annotate_out}" | |
| trap - EXIT TERM INT | |
| } | |
| trap 'cleanup; exit 1' TERM INT | |
| trap cleanup EXIT | |
| # mem-loads:pu requests a precise user PEBS event whose sample weight should | |
| # be populated by -W. Unsupported PEBS/weight PMUs are skipped below. | |
| if ! perf record -W -e mem-loads:pu -o "${perfdata}" -- perf test -w thloop \ | |
| > /dev/null 2> "${record_log}"; then | |
| echo "[SKIP] precise PEBS weight sampling is unavailable" | |
| exit 2 | |
| fi | |
| # Confirm the PMU actually produced nonzero weights. A successful record alone | |
| # is insufficient: some PMUs accept the event but provide no weight payload. | |
| if ! perf report --stdio -i "${perfdata}" --fields=weight1,weight2,weight3,symbol --percent-limit 0 \ | |
| > "${report_out}" 2> "${record_log}"; then | |
| echo "[SKIP] weighted samples cannot be decoded" | |
| exit 2 | |
| fi | |
| if ! awk '$1 ~ /^[0-9]/ && ($1 + 0) > 0 { found = 1 } END { exit !found }' \ | |
| "${report_out}"; then | |
| echo "[SKIP] PEBS weight sampling produced no nonzero weights" | |
| exit 2 | |
| fi | |
| perf annotate --stdio -i "${perfdata}" --symbol "${testsym}" \ | |
| > "${annotate_out}" 2> "${record_log}" | |
| grep -q 'Percent Weight' "${annotate_out}" | |
| # The second numeric column is the rendered average weight. This assertion | |
| # fails on the original regression because calc_percent() left it at zero. | |
| if ! awk '$1 ~ /^[0-9]/ && $2 ~ /^[0-9]/ && ($2 + 0) > 0 { found = 1 } END { exit !found }' \ | |
| "${annotate_out}"; then | |
| echo "Annotation output contained no nonzero weight" | |
| cat "${annotate_out}" | |
| exit 1 | |
| fi | |
| echo "PEBS annotation weights: PASS" |