Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftests/powerpc/pmu: Add selftest for PERF_TYPE_HARDWARE events valid check

Testcase to ensure that using invalid event in generic event for
PERF_TYPE_HARDWARE will fail. Invalid generic events in power10 are:
- PERF_COUNT_HW_BUS_CYCLES
- PERF_COUNT_HW_STALLED_CYCLES_FRONTEND
- PERF_COUNT_HW_STALLED_CYCLES_BACKEND
- PERF_COUNT_HW_REF_CPU_CYCLES

Invalid generic events in power9 are:
- PERF_COUNT_HW_BUS_CYCLES
- PERF_COUNT_HW_REF_CPU_CYCLES

Testcase does event open for valid and invalid generic events to ensure
event open works for all valid events and fails for invalid events.

Signed-off-by: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20220610134113.62991-29-atrajeev@linux.vnet.ibm.com

authored by

Athira Rajeev and committed by
Michael Ellerman
8efeedf5 3f1a8742

+131 -1
+1 -1
tools/testing/selftests/powerpc/pmu/event_code_tests/Makefile
··· 4 4 TEST_GEN_PROGS := group_constraint_pmc56_test group_pmc56_exclude_constraints_test group_constraint_pmc_count_test \ 5 5 group_constraint_repeat_test group_constraint_radix_scope_qual_test reserved_bits_mmcra_sample_elig_mode_test \ 6 6 group_constraint_mmcra_sample_test invalid_event_code_test reserved_bits_mmcra_thresh_ctl_test \ 7 - blacklisted_events_test event_alternatives_tests_p9 event_alternatives_tests_p10 7 + blacklisted_events_test event_alternatives_tests_p9 event_alternatives_tests_p10 generic_events_valid_test 8 8 9 9 top_srcdir = ../../../../../.. 10 10 include ../../../lib.mk
+130
tools/testing/selftests/powerpc/pmu/event_code_tests/generic_events_valid_test.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-only 2 + /* 3 + * Copyright 2022, Athira Rajeev, IBM Corp. 4 + */ 5 + 6 + #include <stdio.h> 7 + #include <sys/prctl.h> 8 + #include <limits.h> 9 + #include "../event.h" 10 + #include "../sampling_tests/misc.h" 11 + 12 + /* 13 + * Testcase to ensure that using invalid event in generic 14 + * event for PERF_TYPE_HARDWARE should fail 15 + */ 16 + 17 + static int generic_events_valid_test(void) 18 + { 19 + struct event event; 20 + 21 + /* Check for platform support for the test */ 22 + SKIP_IF(platform_check_for_tests()); 23 + 24 + /* generic events is different in compat_mode */ 25 + SKIP_IF(check_for_generic_compat_pmu()); 26 + 27 + /* 28 + * Invalid generic events in power10: 29 + * - PERF_COUNT_HW_BUS_CYCLES 30 + * - PERF_COUNT_HW_STALLED_CYCLES_FRONTEND 31 + * - PERF_COUNT_HW_STALLED_CYCLES_BACKEND 32 + * - PERF_COUNT_HW_REF_CPU_CYCLES 33 + */ 34 + if (PVR_VER(mfspr(SPRN_PVR)) == POWER10) { 35 + event_init_opts(&event, PERF_COUNT_HW_CPU_CYCLES, PERF_TYPE_HARDWARE, "event"); 36 + FAIL_IF(event_open(&event)); 37 + event_close(&event); 38 + 39 + event_init_opts(&event, PERF_COUNT_HW_INSTRUCTIONS, 40 + PERF_TYPE_HARDWARE, "event"); 41 + FAIL_IF(event_open(&event)); 42 + event_close(&event); 43 + 44 + event_init_opts(&event, PERF_COUNT_HW_CACHE_REFERENCES, 45 + PERF_TYPE_HARDWARE, "event"); 46 + FAIL_IF(event_open(&event)); 47 + event_close(&event); 48 + 49 + event_init_opts(&event, PERF_COUNT_HW_CACHE_MISSES, PERF_TYPE_HARDWARE, "event"); 50 + FAIL_IF(event_open(&event)); 51 + event_close(&event); 52 + 53 + event_init_opts(&event, PERF_COUNT_HW_BRANCH_INSTRUCTIONS, 54 + PERF_TYPE_HARDWARE, "event"); 55 + FAIL_IF(event_open(&event)); 56 + event_close(&event); 57 + 58 + event_init_opts(&event, PERF_COUNT_HW_BRANCH_MISSES, PERF_TYPE_HARDWARE, "event"); 59 + FAIL_IF(event_open(&event)); 60 + event_close(&event); 61 + 62 + event_init_opts(&event, PERF_COUNT_HW_BUS_CYCLES, PERF_TYPE_HARDWARE, "event"); 63 + FAIL_IF(!event_open(&event)); 64 + 65 + event_init_opts(&event, PERF_COUNT_HW_STALLED_CYCLES_FRONTEND, 66 + PERF_TYPE_HARDWARE, "event"); 67 + FAIL_IF(!event_open(&event)); 68 + 69 + event_init_opts(&event, PERF_COUNT_HW_STALLED_CYCLES_BACKEND, 70 + PERF_TYPE_HARDWARE, "event"); 71 + FAIL_IF(!event_open(&event)); 72 + 73 + event_init_opts(&event, PERF_COUNT_HW_REF_CPU_CYCLES, PERF_TYPE_HARDWARE, "event"); 74 + FAIL_IF(!event_open(&event)); 75 + } else if (PVR_VER(mfspr(SPRN_PVR)) == POWER9) { 76 + /* 77 + * Invalid generic events in power9: 78 + * - PERF_COUNT_HW_BUS_CYCLES 79 + * - PERF_COUNT_HW_REF_CPU_CYCLES 80 + */ 81 + event_init_opts(&event, PERF_COUNT_HW_CPU_CYCLES, PERF_TYPE_HARDWARE, "event"); 82 + FAIL_IF(event_open(&event)); 83 + event_close(&event); 84 + 85 + event_init_opts(&event, PERF_COUNT_HW_INSTRUCTIONS, PERF_TYPE_HARDWARE, "event"); 86 + FAIL_IF(event_open(&event)); 87 + event_close(&event); 88 + 89 + event_init_opts(&event, PERF_COUNT_HW_CACHE_REFERENCES, 90 + PERF_TYPE_HARDWARE, "event"); 91 + FAIL_IF(event_open(&event)); 92 + event_close(&event); 93 + 94 + event_init_opts(&event, PERF_COUNT_HW_CACHE_MISSES, PERF_TYPE_HARDWARE, "event"); 95 + FAIL_IF(event_open(&event)); 96 + event_close(&event); 97 + 98 + event_init_opts(&event, PERF_COUNT_HW_BRANCH_INSTRUCTIONS, 99 + PERF_TYPE_HARDWARE, "event"); 100 + FAIL_IF(event_open(&event)); 101 + event_close(&event); 102 + 103 + event_init_opts(&event, PERF_COUNT_HW_BRANCH_MISSES, PERF_TYPE_HARDWARE, "event"); 104 + FAIL_IF(event_open(&event)); 105 + event_close(&event); 106 + 107 + event_init_opts(&event, PERF_COUNT_HW_BUS_CYCLES, PERF_TYPE_HARDWARE, "event"); 108 + FAIL_IF(!event_open(&event)); 109 + 110 + event_init_opts(&event, PERF_COUNT_HW_STALLED_CYCLES_FRONTEND, 111 + PERF_TYPE_HARDWARE, "event"); 112 + FAIL_IF(event_open(&event)); 113 + event_close(&event); 114 + 115 + event_init_opts(&event, PERF_COUNT_HW_STALLED_CYCLES_BACKEND, 116 + PERF_TYPE_HARDWARE, "event"); 117 + FAIL_IF(event_open(&event)); 118 + event_close(&event); 119 + 120 + event_init_opts(&event, PERF_COUNT_HW_REF_CPU_CYCLES, PERF_TYPE_HARDWARE, "event"); 121 + FAIL_IF(!event_open(&event)); 122 + } 123 + 124 + return 0; 125 + } 126 + 127 + int main(void) 128 + { 129 + return test_harness(generic_events_valid_test, "generic_events_valid_test"); 130 + }