test_bpf_metadata.sh 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #!/bin/bash
  2. # BPF metadata collection test
  3. #
  4. # SPDX-License-Identifier: GPL-2.0
  5. set -e
  6. err=0
  7. perfdata=$(mktemp /tmp/__perf_test.perf.data.XXXXX)
  8. cleanup() {
  9. rm -f "${perfdata}"
  10. rm -f "${perfdata}".old
  11. trap - EXIT TERM INT
  12. }
  13. trap_cleanup() {
  14. cleanup
  15. exit 1
  16. }
  17. trap trap_cleanup EXIT TERM INT
  18. test_bpf_metadata() {
  19. echo "Checking BPF metadata collection"
  20. if ! perf check -q feature libbpf-strings ; then
  21. echo "Basic BPF metadata test [skipping - not supported]"
  22. err=0
  23. return
  24. fi
  25. # This is a basic invocation of perf record
  26. # that invokes the perf_sample_filter BPF program.
  27. if ! perf record -e task-clock --filter 'ip > 0' \
  28. -o "${perfdata}" sleep 1 2> /dev/null
  29. then
  30. echo "Basic BPF metadata test [Failed record]"
  31. err=1
  32. return
  33. fi
  34. # The BPF programs that ship with "perf" all have the following
  35. # variable defined at compile time:
  36. #
  37. # const char bpf_metadata_perf_version[] SEC(".rodata") = <...>;
  38. #
  39. # This invocation looks for a PERF_RECORD_BPF_METADATA event,
  40. # and checks that its content contains the string given by
  41. # "perf version".
  42. VERS=$(perf version | awk '{print $NF}')
  43. if ! perf script --show-bpf-events -i "${perfdata}" | awk '
  44. /PERF_RECORD_BPF_METADATA.*perf_sample_filter/ {
  45. header = 1;
  46. }
  47. /^ *entry/ {
  48. if (header) { header = 0; entry = 1; }
  49. }
  50. $0 !~ /^ *entry/ {
  51. entry = 0;
  52. }
  53. /perf_version/ {
  54. if (entry) print $NF;
  55. }
  56. ' | grep -qF "$VERS"
  57. then
  58. echo "Basic BPF metadata test [Failed invalid output]"
  59. err=1
  60. return
  61. fi
  62. echo "Basic BPF metadata test [Success]"
  63. }
  64. test_bpf_metadata
  65. cleanup
  66. exit $err