1 // SPDX-License-Identifier: GPL-2.0 2 #include "parse-events.h" 3 #include "evsel.h" 4 #include "evlist.h" 5 #include <api/fs/fs.h> 6 #include "tests.h" 7 #include "debug.h" 8 #include "pmu.h" 9 #include <dirent.h> 10 #include <errno.h> 11 #include <sys/types.h> 12 #include <sys/stat.h> 13 #include <unistd.h> 14 #include <linux/kernel.h> 15 #include <linux/hw_breakpoint.h> 16 #include <api/fs/tracing_path.h> 17 18 #define PERF_TP_SAMPLE_TYPE (PERF_SAMPLE_RAW | PERF_SAMPLE_TIME | \ 19 PERF_SAMPLE_CPU | PERF_SAMPLE_PERIOD) 20 21 #if defined(__s390x__) 22 /* Return true if kvm module is available and loaded. Test this 23 * and retun success when trace point kvm_s390_create_vm 24 * exists. Otherwise this test always fails. 25 */ 26 static bool kvm_s390_create_vm_valid(void) 27 { 28 char *eventfile; 29 bool rc = false; 30 31 eventfile = get_events_file("kvm-s390"); 32 33 if (eventfile) { 34 DIR *mydir = opendir(eventfile); 35 36 if (mydir) { 37 rc = true; 38 closedir(mydir); 39 } 40 put_events_file(eventfile); 41 } 42 43 return rc; 44 } 45 #endif 46 47 static int test__checkevent_tracepoint(struct evlist *evlist) 48 { 49 struct evsel *evsel = evlist__first(evlist); 50 51 TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries); 52 TEST_ASSERT_VAL("wrong number of groups", 0 == evlist->nr_groups); 53 TEST_ASSERT_VAL("wrong type", PERF_TYPE_TRACEPOINT == evsel->core.attr.type); 54 TEST_ASSERT_VAL("wrong sample_type", 55 PERF_TP_SAMPLE_TYPE == evsel->core.attr.sample_type); 56 TEST_ASSERT_VAL("wrong sample_period", 1 == evsel->core.attr.sample_period); 57 return 0; 58 } 59 60 static int test__checkevent_tracepoint_multi(struct evlist *evlist) 61 { 62 struct evsel *evsel; 63 64 TEST_ASSERT_VAL("wrong number of entries", evlist->core.nr_entries > 1); 65 TEST_ASSERT_VAL("wrong number of groups", 0 == evlist->nr_groups); 66 67 evlist__for_each_entry(evlist, evsel) { 68 TEST_ASSERT_VAL("wrong type", 69 PERF_TYPE_TRACEPOINT == evsel->core.attr.type); 70 TEST_ASSERT_VAL("wrong sample_type", 71 PERF_TP_SAMPLE_TYPE == evsel->core.attr.sample_type); 72 TEST_ASSERT_VAL("wrong sample_period", 73 1 == evsel->core.attr.sample_period); 74 } 75 return 0; 76 } 77 78 static int test__checkevent_raw(struct evlist *evlist) 79 { 80 struct evsel *evsel = evlist__first(evlist); 81 82 TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries); 83 TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type); 84 TEST_ASSERT_VAL("wrong config", 0x1a == evsel->core.attr.config); 85 return 0; 86 } 87 88 static int test__checkevent_numeric(struct evlist *evlist) 89 { 90 struct evsel *evsel = evlist__first(evlist); 91 92 TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries); 93 TEST_ASSERT_VAL("wrong type", 1 == evsel->core.attr.type); 94 TEST_ASSERT_VAL("wrong config", 1 == evsel->core.attr.config); 95 return 0; 96 } 97 98 static int test__checkevent_symbolic_name(struct evlist *evlist) 99 { 100 struct evsel *evsel = evlist__first(evlist); 101 102 TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries); 103 TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type); 104 TEST_ASSERT_VAL("wrong config", 105 PERF_COUNT_HW_INSTRUCTIONS == evsel->core.attr.config); 106 return 0; 107 } 108 109 static int test__checkevent_symbolic_name_config(struct evlist *evlist) 110 { 111 struct evsel *evsel = evlist__first(evlist); 112 113 TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries); 114 TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type); 115 TEST_ASSERT_VAL("wrong config", 116 PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config); 117 /* 118 * The period value gets configured within perf_evlist__config, 119 * while this test executes only parse events method. 120 */ 121 TEST_ASSERT_VAL("wrong period", 122 0 == evsel->core.attr.sample_period); 123 TEST_ASSERT_VAL("wrong config1", 124 0 == evsel->core.attr.config1); 125 TEST_ASSERT_VAL("wrong config2", 126 1 == evsel->core.attr.config2); 127 return 0; 128 } 129 130 static int test__checkevent_symbolic_alias(struct evlist *evlist) 131 { 132 struct evsel *evsel = evlist__first(evlist); 133 134 TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries); 135 TEST_ASSERT_VAL("wrong type", PERF_TYPE_SOFTWARE == evsel->core.attr.type); 136 TEST_ASSERT_VAL("wrong config", 137 PERF_COUNT_SW_PAGE_FAULTS == evsel->core.attr.config); 138 return 0; 139 } 140 141 static int test__checkevent_genhw(struct evlist *evlist) 142 { 143 struct evsel *evsel = evlist__first(evlist); 144 145 TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries); 146 TEST_ASSERT_VAL("wrong type", PERF_TYPE_HW_CACHE == evsel->core.attr.type); 147 TEST_ASSERT_VAL("wrong config", (1 << 16) == evsel->core.attr.config); 148 return 0; 149 } 150 151 static int test__checkevent_breakpoint(struct evlist *evlist) 152 { 153 struct evsel *evsel = evlist__first(evlist); 154 155 TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries); 156 TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT == evsel->core.attr.type); 157 TEST_ASSERT_VAL("wrong config", 0 == evsel->core.attr.config); 158 TEST_ASSERT_VAL("wrong bp_type", (HW_BREAKPOINT_R | HW_BREAKPOINT_W) == 159 evsel->core.attr.bp_type); 160 TEST_ASSERT_VAL("wrong bp_len", HW_BREAKPOINT_LEN_4 == 161 evsel->core.attr.bp_len); 162 return 0; 163 } 164 165 static int test__checkevent_breakpoint_x(struct evlist *evlist) 166 { 167 struct evsel *evsel = evlist__first(evlist); 168 169 TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries); 170 TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT == evsel->core.attr.type); 171 TEST_ASSERT_VAL("wrong config", 0 == evsel->core.attr.config); 172 TEST_ASSERT_VAL("wrong bp_type", 173 HW_BREAKPOINT_X == evsel->core.attr.bp_type); 174 TEST_ASSERT_VAL("wrong bp_len", sizeof(long) == evsel->core.attr.bp_len); 175 return 0; 176 } 177 178 static int test__checkevent_breakpoint_r(struct evlist *evlist) 179 { 180 struct evsel *evsel = evlist__first(evlist); 181 182 TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries); 183 TEST_ASSERT_VAL("wrong type", 184 PERF_TYPE_BREAKPOINT == evsel->core.attr.type); 185 TEST_ASSERT_VAL("wrong config", 0 == evsel->core.attr.config); 186 TEST_ASSERT_VAL("wrong bp_type", 187 HW_BREAKPOINT_R == evsel->core.attr.bp_type); 188 TEST_ASSERT_VAL("wrong bp_len", 189 HW_BREAKPOINT_LEN_4 == evsel->core.attr.bp_len); 190 return 0; 191 } 192 193 static int test__checkevent_breakpoint_w(struct evlist *evlist) 194 { 195 struct evsel *evsel = evlist__first(evlist); 196 197 TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries); 198 TEST_ASSERT_VAL("wrong type", 199 PERF_TYPE_BREAKPOINT == evsel->core.attr.type); 200 TEST_ASSERT_VAL("wrong config", 0 == evsel->core.attr.config); 201 TEST_ASSERT_VAL("wrong bp_type", 202 HW_BREAKPOINT_W == evsel->core.attr.bp_type); 203 TEST_ASSERT_VAL("wrong bp_len", 204 HW_BREAKPOINT_LEN_4 == evsel->core.attr.bp_len); 205 return 0; 206 } 207 208 static int test__checkevent_breakpoint_rw(struct evlist *evlist) 209 { 210 struct evsel *evsel = evlist__first(evlist); 211 212 TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries); 213 TEST_ASSERT_VAL("wrong type", 214 PERF_TYPE_BREAKPOINT == evsel->core.attr.type); 215 TEST_ASSERT_VAL("wrong config", 0 == evsel->core.attr.config); 216 TEST_ASSERT_VAL("wrong bp_type", 217 (HW_BREAKPOINT_R|HW_BREAKPOINT_W) == evsel->core.attr.bp_type); 218 TEST_ASSERT_VAL("wrong bp_len", 219 HW_BREAKPOINT_LEN_4 == evsel->core.attr.bp_len); 220 return 0; 221 } 222 223 static int test__checkevent_tracepoint_modifier(struct evlist *evlist) 224 { 225 struct evsel *evsel = evlist__first(evlist); 226 227 TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user); 228 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel); 229 TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv); 230 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 231 232 return test__checkevent_tracepoint(evlist); 233 } 234 235 static int 236 test__checkevent_tracepoint_multi_modifier(struct evlist *evlist) 237 { 238 struct evsel *evsel; 239 240 TEST_ASSERT_VAL("wrong number of entries", evlist->core.nr_entries > 1); 241 242 evlist__for_each_entry(evlist, evsel) { 243 TEST_ASSERT_VAL("wrong exclude_user", 244 !evsel->core.attr.exclude_user); 245 TEST_ASSERT_VAL("wrong exclude_kernel", 246 evsel->core.attr.exclude_kernel); 247 TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv); 248 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 249 } 250 251 return test__checkevent_tracepoint_multi(evlist); 252 } 253 254 static int test__checkevent_raw_modifier(struct evlist *evlist) 255 { 256 struct evsel *evsel = evlist__first(evlist); 257 258 TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user); 259 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel); 260 TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv); 261 TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip); 262 263 return test__checkevent_raw(evlist); 264 } 265 266 static int test__checkevent_numeric_modifier(struct evlist *evlist) 267 { 268 struct evsel *evsel = evlist__first(evlist); 269 270 TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user); 271 TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel); 272 TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv); 273 TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip); 274 275 return test__checkevent_numeric(evlist); 276 } 277 278 static int test__checkevent_symbolic_name_modifier(struct evlist *evlist) 279 { 280 struct evsel *evsel = evlist__first(evlist); 281 282 TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user); 283 TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel); 284 TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv); 285 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 286 287 return test__checkevent_symbolic_name(evlist); 288 } 289 290 static int test__checkevent_exclude_host_modifier(struct evlist *evlist) 291 { 292 struct evsel *evsel = evlist__first(evlist); 293 294 TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest); 295 TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host); 296 297 return test__checkevent_symbolic_name(evlist); 298 } 299 300 static int test__checkevent_exclude_guest_modifier(struct evlist *evlist) 301 { 302 struct evsel *evsel = evlist__first(evlist); 303 304 TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest); 305 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host); 306 307 return test__checkevent_symbolic_name(evlist); 308 } 309 310 static int test__checkevent_symbolic_alias_modifier(struct evlist *evlist) 311 { 312 struct evsel *evsel = evlist__first(evlist); 313 314 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user); 315 TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel); 316 TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv); 317 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 318 319 return test__checkevent_symbolic_alias(evlist); 320 } 321 322 static int test__checkevent_genhw_modifier(struct evlist *evlist) 323 { 324 struct evsel *evsel = evlist__first(evlist); 325 326 TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user); 327 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel); 328 TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv); 329 TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip); 330 331 return test__checkevent_genhw(evlist); 332 } 333 334 static int test__checkevent_exclude_idle_modifier(struct evlist *evlist) 335 { 336 struct evsel *evsel = evlist__first(evlist); 337 338 TEST_ASSERT_VAL("wrong exclude idle", evsel->core.attr.exclude_idle); 339 TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest); 340 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host); 341 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user); 342 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel); 343 TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv); 344 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 345 346 return test__checkevent_symbolic_name(evlist); 347 } 348 349 static int test__checkevent_exclude_idle_modifier_1(struct evlist *evlist) 350 { 351 struct evsel *evsel = evlist__first(evlist); 352 353 TEST_ASSERT_VAL("wrong exclude idle", evsel->core.attr.exclude_idle); 354 TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest); 355 TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host); 356 TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user); 357 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel); 358 TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv); 359 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 360 361 return test__checkevent_symbolic_name(evlist); 362 } 363 364 static int test__checkevent_breakpoint_modifier(struct evlist *evlist) 365 { 366 struct evsel *evsel = evlist__first(evlist); 367 368 369 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user); 370 TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel); 371 TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv); 372 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 373 TEST_ASSERT_VAL("wrong name", 374 !strcmp(evsel__name(evsel), "mem:0:u")); 375 376 return test__checkevent_breakpoint(evlist); 377 } 378 379 static int test__checkevent_breakpoint_x_modifier(struct evlist *evlist) 380 { 381 struct evsel *evsel = evlist__first(evlist); 382 383 TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user); 384 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel); 385 TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv); 386 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 387 TEST_ASSERT_VAL("wrong name", 388 !strcmp(evsel__name(evsel), "mem:0:x:k")); 389 390 return test__checkevent_breakpoint_x(evlist); 391 } 392 393 static int test__checkevent_breakpoint_r_modifier(struct evlist *evlist) 394 { 395 struct evsel *evsel = evlist__first(evlist); 396 397 TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user); 398 TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel); 399 TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv); 400 TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip); 401 TEST_ASSERT_VAL("wrong name", 402 !strcmp(evsel__name(evsel), "mem:0:r:hp")); 403 404 return test__checkevent_breakpoint_r(evlist); 405 } 406 407 static int test__checkevent_breakpoint_w_modifier(struct evlist *evlist) 408 { 409 struct evsel *evsel = evlist__first(evlist); 410 411 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user); 412 TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel); 413 TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv); 414 TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip); 415 TEST_ASSERT_VAL("wrong name", 416 !strcmp(evsel__name(evsel), "mem:0:w:up")); 417 418 return test__checkevent_breakpoint_w(evlist); 419 } 420 421 static int test__checkevent_breakpoint_rw_modifier(struct evlist *evlist) 422 { 423 struct evsel *evsel = evlist__first(evlist); 424 425 TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user); 426 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel); 427 TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv); 428 TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip); 429 TEST_ASSERT_VAL("wrong name", 430 !strcmp(evsel__name(evsel), "mem:0:rw:kp")); 431 432 return test__checkevent_breakpoint_rw(evlist); 433 } 434 435 static int test__checkevent_pmu(struct evlist *evlist) 436 { 437 438 struct evsel *evsel = evlist__first(evlist); 439 440 TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries); 441 TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type); 442 TEST_ASSERT_VAL("wrong config", 10 == evsel->core.attr.config); 443 TEST_ASSERT_VAL("wrong config1", 1 == evsel->core.attr.config1); 444 TEST_ASSERT_VAL("wrong config2", 3 == evsel->core.attr.config2); 445 /* 446 * The period value gets configured within perf_evlist__config, 447 * while this test executes only parse events method. 448 */ 449 TEST_ASSERT_VAL("wrong period", 0 == evsel->core.attr.sample_period); 450 451 return 0; 452 } 453 454 static int test__checkevent_list(struct evlist *evlist) 455 { 456 struct evsel *evsel = evlist__first(evlist); 457 458 TEST_ASSERT_VAL("wrong number of entries", 3 == evlist->core.nr_entries); 459 460 /* r1 */ 461 TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type); 462 TEST_ASSERT_VAL("wrong config", 1 == evsel->core.attr.config); 463 TEST_ASSERT_VAL("wrong config1", 0 == evsel->core.attr.config1); 464 TEST_ASSERT_VAL("wrong config2", 0 == evsel->core.attr.config2); 465 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user); 466 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel); 467 TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv); 468 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 469 470 /* syscalls:sys_enter_openat:k */ 471 evsel = evsel__next(evsel); 472 TEST_ASSERT_VAL("wrong type", PERF_TYPE_TRACEPOINT == evsel->core.attr.type); 473 TEST_ASSERT_VAL("wrong sample_type", 474 PERF_TP_SAMPLE_TYPE == evsel->core.attr.sample_type); 475 TEST_ASSERT_VAL("wrong sample_period", 1 == evsel->core.attr.sample_period); 476 TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user); 477 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel); 478 TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv); 479 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 480 481 /* 1:1:hp */ 482 evsel = evsel__next(evsel); 483 TEST_ASSERT_VAL("wrong type", 1 == evsel->core.attr.type); 484 TEST_ASSERT_VAL("wrong config", 1 == evsel->core.attr.config); 485 TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user); 486 TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel); 487 TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv); 488 TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip); 489 490 return 0; 491 } 492 493 static int test__checkevent_pmu_name(struct evlist *evlist) 494 { 495 struct evsel *evsel = evlist__first(evlist); 496 497 /* cpu/config=1,name=krava/u */ 498 TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries); 499 TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type); 500 TEST_ASSERT_VAL("wrong config", 1 == evsel->core.attr.config); 501 TEST_ASSERT_VAL("wrong name", !strcmp(evsel__name(evsel), "krava")); 502 503 /* cpu/config=2/u" */ 504 evsel = evsel__next(evsel); 505 TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries); 506 TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type); 507 TEST_ASSERT_VAL("wrong config", 2 == evsel->core.attr.config); 508 TEST_ASSERT_VAL("wrong name", 509 !strcmp(evsel__name(evsel), "cpu/config=2/u")); 510 511 return 0; 512 } 513 514 static int test__checkevent_pmu_partial_time_callgraph(struct evlist *evlist) 515 { 516 struct evsel *evsel = evlist__first(evlist); 517 518 /* cpu/config=1,call-graph=fp,time,period=100000/ */ 519 TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries); 520 TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type); 521 TEST_ASSERT_VAL("wrong config", 1 == evsel->core.attr.config); 522 /* 523 * The period, time and callgraph value gets configured 524 * within perf_evlist__config, 525 * while this test executes only parse events method. 526 */ 527 TEST_ASSERT_VAL("wrong period", 0 == evsel->core.attr.sample_period); 528 TEST_ASSERT_VAL("wrong callgraph", !evsel__has_callchain(evsel)); 529 TEST_ASSERT_VAL("wrong time", !(PERF_SAMPLE_TIME & evsel->core.attr.sample_type)); 530 531 /* cpu/config=2,call-graph=no,time=0,period=2000/ */ 532 evsel = evsel__next(evsel); 533 TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type); 534 TEST_ASSERT_VAL("wrong config", 2 == evsel->core.attr.config); 535 /* 536 * The period, time and callgraph value gets configured 537 * within perf_evlist__config, 538 * while this test executes only parse events method. 539 */ 540 TEST_ASSERT_VAL("wrong period", 0 == evsel->core.attr.sample_period); 541 TEST_ASSERT_VAL("wrong callgraph", !evsel__has_callchain(evsel)); 542 TEST_ASSERT_VAL("wrong time", !(PERF_SAMPLE_TIME & evsel->core.attr.sample_type)); 543 544 return 0; 545 } 546 547 static int test__checkevent_pmu_events(struct evlist *evlist) 548 { 549 struct evsel *evsel = evlist__first(evlist); 550 551 TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries); 552 TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type); 553 TEST_ASSERT_VAL("wrong exclude_user", 554 !evsel->core.attr.exclude_user); 555 TEST_ASSERT_VAL("wrong exclude_kernel", 556 evsel->core.attr.exclude_kernel); 557 TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv); 558 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 559 TEST_ASSERT_VAL("wrong pinned", !evsel->core.attr.pinned); 560 TEST_ASSERT_VAL("wrong exclusive", !evsel->core.attr.exclusive); 561 562 return 0; 563 } 564 565 566 static int test__checkevent_pmu_events_mix(struct evlist *evlist) 567 { 568 struct evsel *evsel = evlist__first(evlist); 569 570 /* pmu-event:u */ 571 TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries); 572 TEST_ASSERT_VAL("wrong exclude_user", 573 !evsel->core.attr.exclude_user); 574 TEST_ASSERT_VAL("wrong exclude_kernel", 575 evsel->core.attr.exclude_kernel); 576 TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv); 577 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 578 TEST_ASSERT_VAL("wrong pinned", !evsel->core.attr.pinned); 579 TEST_ASSERT_VAL("wrong exclusive", !evsel->core.attr.exclusive); 580 581 /* cpu/pmu-event/u*/ 582 evsel = evsel__next(evsel); 583 TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries); 584 TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type); 585 TEST_ASSERT_VAL("wrong exclude_user", 586 !evsel->core.attr.exclude_user); 587 TEST_ASSERT_VAL("wrong exclude_kernel", 588 evsel->core.attr.exclude_kernel); 589 TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv); 590 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 591 TEST_ASSERT_VAL("wrong pinned", !evsel->core.attr.pinned); 592 TEST_ASSERT_VAL("wrong exclusive", !evsel->core.attr.pinned); 593 594 return 0; 595 } 596 597 static int test__checkterms_simple(struct list_head *terms) 598 { 599 struct parse_events_term *term; 600 601 /* config=10 */ 602 term = list_entry(terms->next, struct parse_events_term, list); 603 TEST_ASSERT_VAL("wrong type term", 604 term->type_term == PARSE_EVENTS__TERM_TYPE_CONFIG); 605 TEST_ASSERT_VAL("wrong type val", 606 term->type_val == PARSE_EVENTS__TERM_TYPE_NUM); 607 TEST_ASSERT_VAL("wrong val", term->val.num == 10); 608 TEST_ASSERT_VAL("wrong config", !term->config); 609 610 /* config1 */ 611 term = list_entry(term->list.next, struct parse_events_term, list); 612 TEST_ASSERT_VAL("wrong type term", 613 term->type_term == PARSE_EVENTS__TERM_TYPE_CONFIG1); 614 TEST_ASSERT_VAL("wrong type val", 615 term->type_val == PARSE_EVENTS__TERM_TYPE_NUM); 616 TEST_ASSERT_VAL("wrong val", term->val.num == 1); 617 TEST_ASSERT_VAL("wrong config", !term->config); 618 619 /* config2=3 */ 620 term = list_entry(term->list.next, struct parse_events_term, list); 621 TEST_ASSERT_VAL("wrong type term", 622 term->type_term == PARSE_EVENTS__TERM_TYPE_CONFIG2); 623 TEST_ASSERT_VAL("wrong type val", 624 term->type_val == PARSE_EVENTS__TERM_TYPE_NUM); 625 TEST_ASSERT_VAL("wrong val", term->val.num == 3); 626 TEST_ASSERT_VAL("wrong config", !term->config); 627 628 /* umask=1*/ 629 term = list_entry(term->list.next, struct parse_events_term, list); 630 TEST_ASSERT_VAL("wrong type term", 631 term->type_term == PARSE_EVENTS__TERM_TYPE_USER); 632 TEST_ASSERT_VAL("wrong type val", 633 term->type_val == PARSE_EVENTS__TERM_TYPE_NUM); 634 TEST_ASSERT_VAL("wrong val", term->val.num == 1); 635 TEST_ASSERT_VAL("wrong config", !strcmp(term->config, "umask")); 636 637 /* 638 * read 639 * 640 * The perf_pmu__test_parse_init injects 'read' term into 641 * perf_pmu_events_list, so 'read' is evaluated as read term 642 * and not as raw event with 'ead' hex value. 643 */ 644 term = list_entry(term->list.next, struct parse_events_term, list); 645 TEST_ASSERT_VAL("wrong type term", 646 term->type_term == PARSE_EVENTS__TERM_TYPE_USER); 647 TEST_ASSERT_VAL("wrong type val", 648 term->type_val == PARSE_EVENTS__TERM_TYPE_NUM); 649 TEST_ASSERT_VAL("wrong val", term->val.num == 1); 650 TEST_ASSERT_VAL("wrong config", !strcmp(term->config, "read")); 651 652 /* 653 * r0xead 654 * 655 * To be still able to pass 'ead' value with 'r' syntax, 656 * we added support to parse 'r0xHEX' event. 657 */ 658 term = list_entry(term->list.next, struct parse_events_term, list); 659 TEST_ASSERT_VAL("wrong type term", 660 term->type_term == PARSE_EVENTS__TERM_TYPE_CONFIG); 661 TEST_ASSERT_VAL("wrong type val", 662 term->type_val == PARSE_EVENTS__TERM_TYPE_NUM); 663 TEST_ASSERT_VAL("wrong val", term->val.num == 0xead); 664 TEST_ASSERT_VAL("wrong config", !term->config); 665 return 0; 666 } 667 668 static int test__group1(struct evlist *evlist) 669 { 670 struct evsel *evsel, *leader; 671 672 TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries); 673 TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups); 674 675 /* instructions:k */ 676 evsel = leader = evlist__first(evlist); 677 TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type); 678 TEST_ASSERT_VAL("wrong config", 679 PERF_COUNT_HW_INSTRUCTIONS == evsel->core.attr.config); 680 TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user); 681 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel); 682 TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv); 683 TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest); 684 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host); 685 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 686 TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel)); 687 TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2); 688 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0); 689 TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read); 690 691 /* cycles:upp */ 692 evsel = evsel__next(evsel); 693 TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type); 694 TEST_ASSERT_VAL("wrong config", 695 PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config); 696 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user); 697 TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel); 698 TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv); 699 /* use of precise requires exclude_guest */ 700 TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest); 701 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host); 702 TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip == 2); 703 TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); 704 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1); 705 TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read); 706 707 return 0; 708 } 709 710 static int test__group2(struct evlist *evlist) 711 { 712 struct evsel *evsel, *leader; 713 714 TEST_ASSERT_VAL("wrong number of entries", 3 == evlist->core.nr_entries); 715 TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups); 716 717 /* faults + :ku modifier */ 718 evsel = leader = evlist__first(evlist); 719 TEST_ASSERT_VAL("wrong type", PERF_TYPE_SOFTWARE == evsel->core.attr.type); 720 TEST_ASSERT_VAL("wrong config", 721 PERF_COUNT_SW_PAGE_FAULTS == evsel->core.attr.config); 722 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user); 723 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel); 724 TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv); 725 TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest); 726 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host); 727 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 728 TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel)); 729 TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2); 730 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0); 731 TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read); 732 733 /* cache-references + :u modifier */ 734 evsel = evsel__next(evsel); 735 TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type); 736 TEST_ASSERT_VAL("wrong config", 737 PERF_COUNT_HW_CACHE_REFERENCES == evsel->core.attr.config); 738 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user); 739 TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel); 740 TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv); 741 TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest); 742 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host); 743 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 744 TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); 745 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1); 746 TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read); 747 748 /* cycles:k */ 749 evsel = evsel__next(evsel); 750 TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type); 751 TEST_ASSERT_VAL("wrong config", 752 PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config); 753 TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user); 754 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel); 755 TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv); 756 TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest); 757 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host); 758 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 759 TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel)); 760 TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read); 761 762 return 0; 763 } 764 765 static int test__group3(struct evlist *evlist __maybe_unused) 766 { 767 struct evsel *evsel, *leader; 768 769 TEST_ASSERT_VAL("wrong number of entries", 5 == evlist->core.nr_entries); 770 TEST_ASSERT_VAL("wrong number of groups", 2 == evlist->nr_groups); 771 772 /* group1 syscalls:sys_enter_openat:H */ 773 evsel = leader = evlist__first(evlist); 774 TEST_ASSERT_VAL("wrong type", PERF_TYPE_TRACEPOINT == evsel->core.attr.type); 775 TEST_ASSERT_VAL("wrong sample_type", 776 PERF_TP_SAMPLE_TYPE == evsel->core.attr.sample_type); 777 TEST_ASSERT_VAL("wrong sample_period", 1 == evsel->core.attr.sample_period); 778 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user); 779 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel); 780 TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv); 781 TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest); 782 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host); 783 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 784 TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel)); 785 TEST_ASSERT_VAL("wrong group name", 786 !strcmp(leader->group_name, "group1")); 787 TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2); 788 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0); 789 TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read); 790 791 /* group1 cycles:kppp */ 792 evsel = evsel__next(evsel); 793 TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type); 794 TEST_ASSERT_VAL("wrong config", 795 PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config); 796 TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user); 797 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel); 798 TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv); 799 /* use of precise requires exclude_guest */ 800 TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest); 801 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host); 802 TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip == 3); 803 TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); 804 TEST_ASSERT_VAL("wrong group name", !evsel->group_name); 805 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1); 806 TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read); 807 808 /* group2 cycles + G modifier */ 809 evsel = leader = evsel__next(evsel); 810 TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type); 811 TEST_ASSERT_VAL("wrong config", 812 PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config); 813 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user); 814 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel); 815 TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv); 816 TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest); 817 TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host); 818 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 819 TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel)); 820 TEST_ASSERT_VAL("wrong group name", 821 !strcmp(leader->group_name, "group2")); 822 TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2); 823 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0); 824 TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read); 825 826 /* group2 1:3 + G modifier */ 827 evsel = evsel__next(evsel); 828 TEST_ASSERT_VAL("wrong type", 1 == evsel->core.attr.type); 829 TEST_ASSERT_VAL("wrong config", 3 == evsel->core.attr.config); 830 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user); 831 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel); 832 TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv); 833 TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest); 834 TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host); 835 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 836 TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); 837 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1); 838 TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read); 839 840 /* instructions:u */ 841 evsel = evsel__next(evsel); 842 TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type); 843 TEST_ASSERT_VAL("wrong config", 844 PERF_COUNT_HW_INSTRUCTIONS == evsel->core.attr.config); 845 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user); 846 TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel); 847 TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv); 848 TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest); 849 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host); 850 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 851 TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel)); 852 TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read); 853 854 return 0; 855 } 856 857 static int test__group4(struct evlist *evlist __maybe_unused) 858 { 859 struct evsel *evsel, *leader; 860 861 TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries); 862 TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups); 863 864 /* cycles:u + p */ 865 evsel = leader = evlist__first(evlist); 866 TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type); 867 TEST_ASSERT_VAL("wrong config", 868 PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config); 869 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user); 870 TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel); 871 TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv); 872 /* use of precise requires exclude_guest */ 873 TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest); 874 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host); 875 TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip == 1); 876 TEST_ASSERT_VAL("wrong group name", !evsel->group_name); 877 TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel)); 878 TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2); 879 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0); 880 TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read); 881 882 /* instructions:kp + p */ 883 evsel = evsel__next(evsel); 884 TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type); 885 TEST_ASSERT_VAL("wrong config", 886 PERF_COUNT_HW_INSTRUCTIONS == evsel->core.attr.config); 887 TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user); 888 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel); 889 TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv); 890 /* use of precise requires exclude_guest */ 891 TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest); 892 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host); 893 TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip == 2); 894 TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); 895 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1); 896 TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read); 897 898 return 0; 899 } 900 901 static int test__group5(struct evlist *evlist __maybe_unused) 902 { 903 struct evsel *evsel, *leader; 904 905 TEST_ASSERT_VAL("wrong number of entries", 5 == evlist->core.nr_entries); 906 TEST_ASSERT_VAL("wrong number of groups", 2 == evlist->nr_groups); 907 908 /* cycles + G */ 909 evsel = leader = evlist__first(evlist); 910 TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type); 911 TEST_ASSERT_VAL("wrong config", 912 PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config); 913 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user); 914 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel); 915 TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv); 916 TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest); 917 TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host); 918 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 919 TEST_ASSERT_VAL("wrong group name", !evsel->group_name); 920 TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel)); 921 TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2); 922 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0); 923 TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read); 924 925 /* instructions + G */ 926 evsel = evsel__next(evsel); 927 TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type); 928 TEST_ASSERT_VAL("wrong config", 929 PERF_COUNT_HW_INSTRUCTIONS == evsel->core.attr.config); 930 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user); 931 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel); 932 TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv); 933 TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest); 934 TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host); 935 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 936 TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); 937 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1); 938 TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read); 939 940 /* cycles:G */ 941 evsel = leader = evsel__next(evsel); 942 TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type); 943 TEST_ASSERT_VAL("wrong config", 944 PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config); 945 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user); 946 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel); 947 TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv); 948 TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest); 949 TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host); 950 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 951 TEST_ASSERT_VAL("wrong group name", !evsel->group_name); 952 TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel)); 953 TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2); 954 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0); 955 TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read); 956 957 /* instructions:G */ 958 evsel = evsel__next(evsel); 959 TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type); 960 TEST_ASSERT_VAL("wrong config", 961 PERF_COUNT_HW_INSTRUCTIONS == evsel->core.attr.config); 962 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user); 963 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel); 964 TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv); 965 TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest); 966 TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host); 967 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 968 TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); 969 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1); 970 971 /* cycles */ 972 evsel = evsel__next(evsel); 973 TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type); 974 TEST_ASSERT_VAL("wrong config", 975 PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config); 976 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user); 977 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel); 978 TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv); 979 TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest); 980 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host); 981 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 982 TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel)); 983 984 return 0; 985 } 986 987 static int test__group_gh1(struct evlist *evlist) 988 { 989 struct evsel *evsel, *leader; 990 991 TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries); 992 TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups); 993 994 /* cycles + :H group modifier */ 995 evsel = leader = evlist__first(evlist); 996 TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type); 997 TEST_ASSERT_VAL("wrong config", 998 PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config); 999 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user); 1000 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel); 1001 TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv); 1002 TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest); 1003 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host); 1004 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 1005 TEST_ASSERT_VAL("wrong group name", !evsel->group_name); 1006 TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel)); 1007 TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2); 1008 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0); 1009 1010 /* cache-misses:G + :H group modifier */ 1011 evsel = evsel__next(evsel); 1012 TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type); 1013 TEST_ASSERT_VAL("wrong config", 1014 PERF_COUNT_HW_CACHE_MISSES == evsel->core.attr.config); 1015 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user); 1016 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel); 1017 TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv); 1018 TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest); 1019 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host); 1020 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 1021 TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); 1022 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1); 1023 1024 return 0; 1025 } 1026 1027 static int test__group_gh2(struct evlist *evlist) 1028 { 1029 struct evsel *evsel, *leader; 1030 1031 TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries); 1032 TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups); 1033 1034 /* cycles + :G group modifier */ 1035 evsel = leader = evlist__first(evlist); 1036 TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type); 1037 TEST_ASSERT_VAL("wrong config", 1038 PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config); 1039 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user); 1040 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel); 1041 TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv); 1042 TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest); 1043 TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host); 1044 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 1045 TEST_ASSERT_VAL("wrong group name", !evsel->group_name); 1046 TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel)); 1047 TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2); 1048 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0); 1049 1050 /* cache-misses:H + :G group modifier */ 1051 evsel = evsel__next(evsel); 1052 TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type); 1053 TEST_ASSERT_VAL("wrong config", 1054 PERF_COUNT_HW_CACHE_MISSES == evsel->core.attr.config); 1055 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user); 1056 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel); 1057 TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv); 1058 TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest); 1059 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host); 1060 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 1061 TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); 1062 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1); 1063 1064 return 0; 1065 } 1066 1067 static int test__group_gh3(struct evlist *evlist) 1068 { 1069 struct evsel *evsel, *leader; 1070 1071 TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries); 1072 TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups); 1073 1074 /* cycles:G + :u group modifier */ 1075 evsel = leader = evlist__first(evlist); 1076 TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type); 1077 TEST_ASSERT_VAL("wrong config", 1078 PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config); 1079 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user); 1080 TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel); 1081 TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv); 1082 TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest); 1083 TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host); 1084 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 1085 TEST_ASSERT_VAL("wrong group name", !evsel->group_name); 1086 TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel)); 1087 TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2); 1088 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0); 1089 1090 /* cache-misses:H + :u group modifier */ 1091 evsel = evsel__next(evsel); 1092 TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type); 1093 TEST_ASSERT_VAL("wrong config", 1094 PERF_COUNT_HW_CACHE_MISSES == evsel->core.attr.config); 1095 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user); 1096 TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel); 1097 TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv); 1098 TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest); 1099 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host); 1100 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 1101 TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); 1102 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1); 1103 1104 return 0; 1105 } 1106 1107 static int test__group_gh4(struct evlist *evlist) 1108 { 1109 struct evsel *evsel, *leader; 1110 1111 TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries); 1112 TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups); 1113 1114 /* cycles:G + :uG group modifier */ 1115 evsel = leader = evlist__first(evlist); 1116 TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type); 1117 TEST_ASSERT_VAL("wrong config", 1118 PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config); 1119 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user); 1120 TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel); 1121 TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv); 1122 TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest); 1123 TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host); 1124 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 1125 TEST_ASSERT_VAL("wrong group name", !evsel->group_name); 1126 TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel)); 1127 TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2); 1128 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0); 1129 1130 /* cache-misses:H + :uG group modifier */ 1131 evsel = evsel__next(evsel); 1132 TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type); 1133 TEST_ASSERT_VAL("wrong config", 1134 PERF_COUNT_HW_CACHE_MISSES == evsel->core.attr.config); 1135 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user); 1136 TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel); 1137 TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv); 1138 TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest); 1139 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host); 1140 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 1141 TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); 1142 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1); 1143 1144 return 0; 1145 } 1146 1147 static int test__leader_sample1(struct evlist *evlist) 1148 { 1149 struct evsel *evsel, *leader; 1150 1151 TEST_ASSERT_VAL("wrong number of entries", 3 == evlist->core.nr_entries); 1152 1153 /* cycles - sampling group leader */ 1154 evsel = leader = evlist__first(evlist); 1155 TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type); 1156 TEST_ASSERT_VAL("wrong config", 1157 PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config); 1158 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user); 1159 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel); 1160 TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv); 1161 TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest); 1162 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host); 1163 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 1164 TEST_ASSERT_VAL("wrong group name", !evsel->group_name); 1165 TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); 1166 TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read); 1167 1168 /* cache-misses - not sampling */ 1169 evsel = evsel__next(evsel); 1170 TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type); 1171 TEST_ASSERT_VAL("wrong config", 1172 PERF_COUNT_HW_CACHE_MISSES == evsel->core.attr.config); 1173 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user); 1174 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel); 1175 TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv); 1176 TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest); 1177 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host); 1178 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 1179 TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); 1180 TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read); 1181 1182 /* branch-misses - not sampling */ 1183 evsel = evsel__next(evsel); 1184 TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type); 1185 TEST_ASSERT_VAL("wrong config", 1186 PERF_COUNT_HW_BRANCH_MISSES == evsel->core.attr.config); 1187 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user); 1188 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel); 1189 TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv); 1190 TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest); 1191 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host); 1192 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 1193 TEST_ASSERT_VAL("wrong group name", !evsel->group_name); 1194 TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); 1195 TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read); 1196 1197 return 0; 1198 } 1199 1200 static int test__leader_sample2(struct evlist *evlist __maybe_unused) 1201 { 1202 struct evsel *evsel, *leader; 1203 1204 TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries); 1205 1206 /* instructions - sampling group leader */ 1207 evsel = leader = evlist__first(evlist); 1208 TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type); 1209 TEST_ASSERT_VAL("wrong config", 1210 PERF_COUNT_HW_INSTRUCTIONS == evsel->core.attr.config); 1211 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user); 1212 TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel); 1213 TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv); 1214 TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest); 1215 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host); 1216 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 1217 TEST_ASSERT_VAL("wrong group name", !evsel->group_name); 1218 TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); 1219 TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read); 1220 1221 /* branch-misses - not sampling */ 1222 evsel = evsel__next(evsel); 1223 TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type); 1224 TEST_ASSERT_VAL("wrong config", 1225 PERF_COUNT_HW_BRANCH_MISSES == evsel->core.attr.config); 1226 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user); 1227 TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel); 1228 TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv); 1229 TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest); 1230 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host); 1231 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 1232 TEST_ASSERT_VAL("wrong group name", !evsel->group_name); 1233 TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); 1234 TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read); 1235 1236 return 0; 1237 } 1238 1239 static int test__checkevent_pinned_modifier(struct evlist *evlist) 1240 { 1241 struct evsel *evsel = evlist__first(evlist); 1242 1243 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user); 1244 TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel); 1245 TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv); 1246 TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip); 1247 TEST_ASSERT_VAL("wrong pinned", evsel->core.attr.pinned); 1248 1249 return test__checkevent_symbolic_name(evlist); 1250 } 1251 1252 static int test__pinned_group(struct evlist *evlist) 1253 { 1254 struct evsel *evsel, *leader; 1255 1256 TEST_ASSERT_VAL("wrong number of entries", 3 == evlist->core.nr_entries); 1257 1258 /* cycles - group leader */ 1259 evsel = leader = evlist__first(evlist); 1260 TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type); 1261 TEST_ASSERT_VAL("wrong config", 1262 PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config); 1263 TEST_ASSERT_VAL("wrong group name", !evsel->group_name); 1264 TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); 1265 TEST_ASSERT_VAL("wrong pinned", evsel->core.attr.pinned); 1266 1267 /* cache-misses - can not be pinned, but will go on with the leader */ 1268 evsel = evsel__next(evsel); 1269 TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type); 1270 TEST_ASSERT_VAL("wrong config", 1271 PERF_COUNT_HW_CACHE_MISSES == evsel->core.attr.config); 1272 TEST_ASSERT_VAL("wrong pinned", !evsel->core.attr.pinned); 1273 1274 /* branch-misses - ditto */ 1275 evsel = evsel__next(evsel); 1276 TEST_ASSERT_VAL("wrong config", 1277 PERF_COUNT_HW_BRANCH_MISSES == evsel->core.attr.config); 1278 TEST_ASSERT_VAL("wrong pinned", !evsel->core.attr.pinned); 1279 1280 return 0; 1281 } 1282 1283 static int test__checkevent_exclusive_modifier(struct evlist *evlist) 1284 { 1285 struct evsel *evsel = evlist__first(evlist); 1286 1287 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user); 1288 TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel); 1289 TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv); 1290 TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip); 1291 TEST_ASSERT_VAL("wrong exclusive", evsel->core.attr.exclusive); 1292 1293 return test__checkevent_symbolic_name(evlist); 1294 } 1295 1296 static int test__exclusive_group(struct evlist *evlist) 1297 { 1298 struct evsel *evsel, *leader; 1299 1300 TEST_ASSERT_VAL("wrong number of entries", 3 == evlist->core.nr_entries); 1301 1302 /* cycles - group leader */ 1303 evsel = leader = evlist__first(evlist); 1304 TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type); 1305 TEST_ASSERT_VAL("wrong config", 1306 PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config); 1307 TEST_ASSERT_VAL("wrong group name", !evsel->group_name); 1308 TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); 1309 TEST_ASSERT_VAL("wrong exclusive", evsel->core.attr.exclusive); 1310 1311 /* cache-misses - can not be pinned, but will go on with the leader */ 1312 evsel = evsel__next(evsel); 1313 TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type); 1314 TEST_ASSERT_VAL("wrong config", 1315 PERF_COUNT_HW_CACHE_MISSES == evsel->core.attr.config); 1316 TEST_ASSERT_VAL("wrong exclusive", !evsel->core.attr.exclusive); 1317 1318 /* branch-misses - ditto */ 1319 evsel = evsel__next(evsel); 1320 TEST_ASSERT_VAL("wrong config", 1321 PERF_COUNT_HW_BRANCH_MISSES == evsel->core.attr.config); 1322 TEST_ASSERT_VAL("wrong exclusive", !evsel->core.attr.exclusive); 1323 1324 return 0; 1325 } 1326 static int test__checkevent_breakpoint_len(struct evlist *evlist) 1327 { 1328 struct evsel *evsel = evlist__first(evlist); 1329 1330 TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries); 1331 TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT == evsel->core.attr.type); 1332 TEST_ASSERT_VAL("wrong config", 0 == evsel->core.attr.config); 1333 TEST_ASSERT_VAL("wrong bp_type", (HW_BREAKPOINT_R | HW_BREAKPOINT_W) == 1334 evsel->core.attr.bp_type); 1335 TEST_ASSERT_VAL("wrong bp_len", HW_BREAKPOINT_LEN_1 == 1336 evsel->core.attr.bp_len); 1337 1338 return 0; 1339 } 1340 1341 static int test__checkevent_breakpoint_len_w(struct evlist *evlist) 1342 { 1343 struct evsel *evsel = evlist__first(evlist); 1344 1345 TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries); 1346 TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT == evsel->core.attr.type); 1347 TEST_ASSERT_VAL("wrong config", 0 == evsel->core.attr.config); 1348 TEST_ASSERT_VAL("wrong bp_type", HW_BREAKPOINT_W == 1349 evsel->core.attr.bp_type); 1350 TEST_ASSERT_VAL("wrong bp_len", HW_BREAKPOINT_LEN_2 == 1351 evsel->core.attr.bp_len); 1352 1353 return 0; 1354 } 1355 1356 static int 1357 test__checkevent_breakpoint_len_rw_modifier(struct evlist *evlist) 1358 { 1359 struct evsel *evsel = evlist__first(evlist); 1360 1361 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user); 1362 TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel); 1363 TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv); 1364 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 1365 1366 return test__checkevent_breakpoint_rw(evlist); 1367 } 1368 1369 static int test__checkevent_precise_max_modifier(struct evlist *evlist) 1370 { 1371 struct evsel *evsel = evlist__first(evlist); 1372 1373 TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries); 1374 TEST_ASSERT_VAL("wrong type", PERF_TYPE_SOFTWARE == evsel->core.attr.type); 1375 TEST_ASSERT_VAL("wrong config", 1376 PERF_COUNT_SW_TASK_CLOCK == evsel->core.attr.config); 1377 return 0; 1378 } 1379 1380 static int test__checkevent_config_symbol(struct evlist *evlist) 1381 { 1382 struct evsel *evsel = evlist__first(evlist); 1383 1384 TEST_ASSERT_VAL("wrong name setting", strcmp(evsel->name, "insn") == 0); 1385 return 0; 1386 } 1387 1388 static int test__checkevent_config_raw(struct evlist *evlist) 1389 { 1390 struct evsel *evsel = evlist__first(evlist); 1391 1392 TEST_ASSERT_VAL("wrong name setting", strcmp(evsel->name, "rawpmu") == 0); 1393 return 0; 1394 } 1395 1396 static int test__checkevent_config_num(struct evlist *evlist) 1397 { 1398 struct evsel *evsel = evlist__first(evlist); 1399 1400 TEST_ASSERT_VAL("wrong name setting", strcmp(evsel->name, "numpmu") == 0); 1401 return 0; 1402 } 1403 1404 static int test__checkevent_config_cache(struct evlist *evlist) 1405 { 1406 struct evsel *evsel = evlist__first(evlist); 1407 1408 TEST_ASSERT_VAL("wrong name setting", strcmp(evsel->name, "cachepmu") == 0); 1409 return 0; 1410 } 1411 1412 static bool test__intel_pt_valid(void) 1413 { 1414 return !!perf_pmu__find("intel_pt"); 1415 } 1416 1417 static int test__intel_pt(struct evlist *evlist) 1418 { 1419 struct evsel *evsel = evlist__first(evlist); 1420 1421 TEST_ASSERT_VAL("wrong name setting", strcmp(evsel->name, "intel_pt//u") == 0); 1422 return 0; 1423 } 1424 1425 static int test__checkevent_complex_name(struct evlist *evlist) 1426 { 1427 struct evsel *evsel = evlist__first(evlist); 1428 1429 TEST_ASSERT_VAL("wrong complex name parsing", strcmp(evsel->name, "COMPLEX_CYCLES_NAME:orig=cycles,desc=chip-clock-ticks") == 0); 1430 return 0; 1431 } 1432 1433 static int test__checkevent_raw_pmu(struct evlist *evlist) 1434 { 1435 struct evsel *evsel = evlist__first(evlist); 1436 1437 TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries); 1438 TEST_ASSERT_VAL("wrong type", PERF_TYPE_SOFTWARE == evsel->core.attr.type); 1439 TEST_ASSERT_VAL("wrong config", 0x1a == evsel->core.attr.config); 1440 return 0; 1441 } 1442 1443 static int test__sym_event_slash(struct evlist *evlist) 1444 { 1445 struct evsel *evsel = evlist__first(evlist); 1446 1447 TEST_ASSERT_VAL("wrong type", evsel->core.attr.type == PERF_TYPE_HARDWARE); 1448 TEST_ASSERT_VAL("wrong config", evsel->core.attr.config == PERF_COUNT_HW_CPU_CYCLES); 1449 TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel); 1450 return 0; 1451 } 1452 1453 static int test__sym_event_dc(struct evlist *evlist) 1454 { 1455 struct evsel *evsel = evlist__first(evlist); 1456 1457 TEST_ASSERT_VAL("wrong type", evsel->core.attr.type == PERF_TYPE_HARDWARE); 1458 TEST_ASSERT_VAL("wrong config", evsel->core.attr.config == PERF_COUNT_HW_CPU_CYCLES); 1459 TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user); 1460 return 0; 1461 } 1462 1463 static int count_tracepoints(void) 1464 { 1465 struct dirent *events_ent; 1466 DIR *events_dir; 1467 int cnt = 0; 1468 1469 events_dir = tracing_events__opendir(); 1470 1471 TEST_ASSERT_VAL("Can't open events dir", events_dir); 1472 1473 while ((events_ent = readdir(events_dir))) { 1474 char *sys_path; 1475 struct dirent *sys_ent; 1476 DIR *sys_dir; 1477 1478 if (!strcmp(events_ent->d_name, ".") 1479 || !strcmp(events_ent->d_name, "..") 1480 || !strcmp(events_ent->d_name, "enable") 1481 || !strcmp(events_ent->d_name, "header_event") 1482 || !strcmp(events_ent->d_name, "header_page")) 1483 continue; 1484 1485 sys_path = get_events_file(events_ent->d_name); 1486 TEST_ASSERT_VAL("Can't get sys path", sys_path); 1487 1488 sys_dir = opendir(sys_path); 1489 TEST_ASSERT_VAL("Can't open sys dir", sys_dir); 1490 1491 while ((sys_ent = readdir(sys_dir))) { 1492 if (!strcmp(sys_ent->d_name, ".") 1493 || !strcmp(sys_ent->d_name, "..") 1494 || !strcmp(sys_ent->d_name, "enable") 1495 || !strcmp(sys_ent->d_name, "filter")) 1496 continue; 1497 1498 cnt++; 1499 } 1500 1501 closedir(sys_dir); 1502 put_events_file(sys_path); 1503 } 1504 1505 closedir(events_dir); 1506 return cnt; 1507 } 1508 1509 static int test__all_tracepoints(struct evlist *evlist) 1510 { 1511 TEST_ASSERT_VAL("wrong events count", 1512 count_tracepoints() == evlist->core.nr_entries); 1513 1514 return test__checkevent_tracepoint_multi(evlist); 1515 } 1516 1517 struct evlist_test { 1518 const char *name; 1519 __u32 type; 1520 const int id; 1521 bool (*valid)(void); 1522 int (*check)(struct evlist *evlist); 1523 }; 1524 1525 static struct evlist_test test__events[] = { 1526 { 1527 .name = "syscalls:sys_enter_openat", 1528 .check = test__checkevent_tracepoint, 1529 .id = 0, 1530 }, 1531 { 1532 .name = "syscalls:*", 1533 .check = test__checkevent_tracepoint_multi, 1534 .id = 1, 1535 }, 1536 { 1537 .name = "r1a", 1538 .check = test__checkevent_raw, 1539 .id = 2, 1540 }, 1541 { 1542 .name = "1:1", 1543 .check = test__checkevent_numeric, 1544 .id = 3, 1545 }, 1546 { 1547 .name = "instructions", 1548 .check = test__checkevent_symbolic_name, 1549 .id = 4, 1550 }, 1551 { 1552 .name = "cycles/period=100000,config2/", 1553 .check = test__checkevent_symbolic_name_config, 1554 .id = 5, 1555 }, 1556 { 1557 .name = "faults", 1558 .check = test__checkevent_symbolic_alias, 1559 .id = 6, 1560 }, 1561 { 1562 .name = "L1-dcache-load-miss", 1563 .check = test__checkevent_genhw, 1564 .id = 7, 1565 }, 1566 { 1567 .name = "mem:0", 1568 .check = test__checkevent_breakpoint, 1569 .id = 8, 1570 }, 1571 { 1572 .name = "mem:0:x", 1573 .check = test__checkevent_breakpoint_x, 1574 .id = 9, 1575 }, 1576 { 1577 .name = "mem:0:r", 1578 .check = test__checkevent_breakpoint_r, 1579 .id = 10, 1580 }, 1581 { 1582 .name = "mem:0:w", 1583 .check = test__checkevent_breakpoint_w, 1584 .id = 11, 1585 }, 1586 { 1587 .name = "syscalls:sys_enter_openat:k", 1588 .check = test__checkevent_tracepoint_modifier, 1589 .id = 12, 1590 }, 1591 { 1592 .name = "syscalls:*:u", 1593 .check = test__checkevent_tracepoint_multi_modifier, 1594 .id = 13, 1595 }, 1596 { 1597 .name = "r1a:kp", 1598 .check = test__checkevent_raw_modifier, 1599 .id = 14, 1600 }, 1601 { 1602 .name = "1:1:hp", 1603 .check = test__checkevent_numeric_modifier, 1604 .id = 15, 1605 }, 1606 { 1607 .name = "instructions:h", 1608 .check = test__checkevent_symbolic_name_modifier, 1609 .id = 16, 1610 }, 1611 { 1612 .name = "faults:u", 1613 .check = test__checkevent_symbolic_alias_modifier, 1614 .id = 17, 1615 }, 1616 { 1617 .name = "L1-dcache-load-miss:kp", 1618 .check = test__checkevent_genhw_modifier, 1619 .id = 18, 1620 }, 1621 { 1622 .name = "mem:0:u", 1623 .check = test__checkevent_breakpoint_modifier, 1624 .id = 19, 1625 }, 1626 { 1627 .name = "mem:0:x:k", 1628 .check = test__checkevent_breakpoint_x_modifier, 1629 .id = 20, 1630 }, 1631 { 1632 .name = "mem:0:r:hp", 1633 .check = test__checkevent_breakpoint_r_modifier, 1634 .id = 21, 1635 }, 1636 { 1637 .name = "mem:0:w:up", 1638 .check = test__checkevent_breakpoint_w_modifier, 1639 .id = 22, 1640 }, 1641 { 1642 .name = "r1,syscalls:sys_enter_openat:k,1:1:hp", 1643 .check = test__checkevent_list, 1644 .id = 23, 1645 }, 1646 { 1647 .name = "instructions:G", 1648 .check = test__checkevent_exclude_host_modifier, 1649 .id = 24, 1650 }, 1651 { 1652 .name = "instructions:H", 1653 .check = test__checkevent_exclude_guest_modifier, 1654 .id = 25, 1655 }, 1656 { 1657 .name = "mem:0:rw", 1658 .check = test__checkevent_breakpoint_rw, 1659 .id = 26, 1660 }, 1661 { 1662 .name = "mem:0:rw:kp", 1663 .check = test__checkevent_breakpoint_rw_modifier, 1664 .id = 27, 1665 }, 1666 { 1667 .name = "{instructions:k,cycles:upp}", 1668 .check = test__group1, 1669 .id = 28, 1670 }, 1671 { 1672 .name = "{faults:k,cache-references}:u,cycles:k", 1673 .check = test__group2, 1674 .id = 29, 1675 }, 1676 { 1677 .name = "group1{syscalls:sys_enter_openat:H,cycles:kppp},group2{cycles,1:3}:G,instructions:u", 1678 .check = test__group3, 1679 .id = 30, 1680 }, 1681 { 1682 .name = "{cycles:u,instructions:kp}:p", 1683 .check = test__group4, 1684 .id = 31, 1685 }, 1686 { 1687 .name = "{cycles,instructions}:G,{cycles:G,instructions:G},cycles", 1688 .check = test__group5, 1689 .id = 32, 1690 }, 1691 { 1692 .name = "*:*", 1693 .check = test__all_tracepoints, 1694 .id = 33, 1695 }, 1696 { 1697 .name = "{cycles,cache-misses:G}:H", 1698 .check = test__group_gh1, 1699 .id = 34, 1700 }, 1701 { 1702 .name = "{cycles,cache-misses:H}:G", 1703 .check = test__group_gh2, 1704 .id = 35, 1705 }, 1706 { 1707 .name = "{cycles:G,cache-misses:H}:u", 1708 .check = test__group_gh3, 1709 .id = 36, 1710 }, 1711 { 1712 .name = "{cycles:G,cache-misses:H}:uG", 1713 .check = test__group_gh4, 1714 .id = 37, 1715 }, 1716 { 1717 .name = "{cycles,cache-misses,branch-misses}:S", 1718 .check = test__leader_sample1, 1719 .id = 38, 1720 }, 1721 { 1722 .name = "{instructions,branch-misses}:Su", 1723 .check = test__leader_sample2, 1724 .id = 39, 1725 }, 1726 { 1727 .name = "instructions:uDp", 1728 .check = test__checkevent_pinned_modifier, 1729 .id = 40, 1730 }, 1731 { 1732 .name = "{cycles,cache-misses,branch-misses}:D", 1733 .check = test__pinned_group, 1734 .id = 41, 1735 }, 1736 { 1737 .name = "mem:0/1", 1738 .check = test__checkevent_breakpoint_len, 1739 .id = 42, 1740 }, 1741 { 1742 .name = "mem:0/2:w", 1743 .check = test__checkevent_breakpoint_len_w, 1744 .id = 43, 1745 }, 1746 { 1747 .name = "mem:0/4:rw:u", 1748 .check = test__checkevent_breakpoint_len_rw_modifier, 1749 .id = 44 1750 }, 1751 #if defined(__s390x__) 1752 { 1753 .name = "kvm-s390:kvm_s390_create_vm", 1754 .check = test__checkevent_tracepoint, 1755 .valid = kvm_s390_create_vm_valid, 1756 .id = 100, 1757 }, 1758 #endif 1759 { 1760 .name = "instructions:I", 1761 .check = test__checkevent_exclude_idle_modifier, 1762 .id = 45, 1763 }, 1764 { 1765 .name = "instructions:kIG", 1766 .check = test__checkevent_exclude_idle_modifier_1, 1767 .id = 46, 1768 }, 1769 { 1770 .name = "task-clock:P,cycles", 1771 .check = test__checkevent_precise_max_modifier, 1772 .id = 47, 1773 }, 1774 { 1775 .name = "instructions/name=insn/", 1776 .check = test__checkevent_config_symbol, 1777 .id = 48, 1778 }, 1779 { 1780 .name = "r1234/name=rawpmu/", 1781 .check = test__checkevent_config_raw, 1782 .id = 49, 1783 }, 1784 { 1785 .name = "4:0x6530160/name=numpmu/", 1786 .check = test__checkevent_config_num, 1787 .id = 50, 1788 }, 1789 { 1790 .name = "L1-dcache-misses/name=cachepmu/", 1791 .check = test__checkevent_config_cache, 1792 .id = 51, 1793 }, 1794 { 1795 .name = "intel_pt//u", 1796 .valid = test__intel_pt_valid, 1797 .check = test__intel_pt, 1798 .id = 52, 1799 }, 1800 { 1801 .name = "cycles/name='COMPLEX_CYCLES_NAME:orig=cycles,desc=chip-clock-ticks'/Duk", 1802 .check = test__checkevent_complex_name, 1803 .id = 53 1804 }, 1805 { 1806 .name = "cycles//u", 1807 .check = test__sym_event_slash, 1808 .id = 54, 1809 }, 1810 { 1811 .name = "cycles:k", 1812 .check = test__sym_event_dc, 1813 .id = 55, 1814 }, 1815 { 1816 .name = "instructions:uep", 1817 .check = test__checkevent_exclusive_modifier, 1818 .id = 56, 1819 }, 1820 { 1821 .name = "{cycles,cache-misses,branch-misses}:e", 1822 .check = test__exclusive_group, 1823 .id = 57, 1824 }, 1825 }; 1826 1827 static struct evlist_test test__events_pmu[] = { 1828 { 1829 .name = "cpu/config=10,config1,config2=3,period=1000/u", 1830 .check = test__checkevent_pmu, 1831 .id = 0, 1832 }, 1833 { 1834 .name = "cpu/config=1,name=krava/u,cpu/config=2/u", 1835 .check = test__checkevent_pmu_name, 1836 .id = 1, 1837 }, 1838 { 1839 .name = "cpu/config=1,call-graph=fp,time,period=100000/,cpu/config=2,call-graph=no,time=0,period=2000/", 1840 .check = test__checkevent_pmu_partial_time_callgraph, 1841 .id = 2, 1842 }, 1843 { 1844 .name = "cpu/name='COMPLEX_CYCLES_NAME:orig=cycles,desc=chip-clock-ticks',period=0x1,event=0x2/ukp", 1845 .check = test__checkevent_complex_name, 1846 .id = 3, 1847 }, 1848 { 1849 .name = "software/r1a/", 1850 .check = test__checkevent_raw_pmu, 1851 .id = 4, 1852 }, 1853 { 1854 .name = "software/r0x1a/", 1855 .check = test__checkevent_raw_pmu, 1856 .id = 4, 1857 }, 1858 }; 1859 1860 struct terms_test { 1861 const char *str; 1862 __u32 type; 1863 int (*check)(struct list_head *terms); 1864 }; 1865 1866 static struct terms_test test__terms[] = { 1867 [0] = { 1868 .str = "config=10,config1,config2=3,umask=1,read,r0xead", 1869 .check = test__checkterms_simple, 1870 }, 1871 }; 1872 1873 static int test_event(struct evlist_test *e) 1874 { 1875 struct parse_events_error err; 1876 struct evlist *evlist; 1877 int ret; 1878 1879 bzero(&err, sizeof(err)); 1880 if (e->valid && !e->valid()) { 1881 pr_debug("... SKIP"); 1882 return 0; 1883 } 1884 1885 evlist = evlist__new(); 1886 if (evlist == NULL) 1887 return -ENOMEM; 1888 1889 ret = parse_events(evlist, e->name, &err); 1890 if (ret) { 1891 pr_debug("failed to parse event '%s', err %d, str '%s'\n", 1892 e->name, ret, err.str); 1893 parse_events_print_error(&err, e->name); 1894 } else { 1895 ret = e->check(evlist); 1896 } 1897 1898 evlist__delete(evlist); 1899 1900 return ret; 1901 } 1902 1903 static int test_events(struct evlist_test *events, unsigned cnt) 1904 { 1905 int ret1, ret2 = 0; 1906 unsigned i; 1907 1908 for (i = 0; i < cnt; i++) { 1909 struct evlist_test *e = &events[i]; 1910 1911 pr_debug("running test %d '%s'", e->id, e->name); 1912 ret1 = test_event(e); 1913 if (ret1) 1914 ret2 = ret1; 1915 pr_debug("\n"); 1916 } 1917 1918 return ret2; 1919 } 1920 1921 static int test_term(struct terms_test *t) 1922 { 1923 struct list_head terms; 1924 int ret; 1925 1926 INIT_LIST_HEAD(&terms); 1927 1928 /* 1929 * The perf_pmu__test_parse_init prepares perf_pmu_events_list 1930 * which gets freed in parse_events_terms. 1931 */ 1932 if (perf_pmu__test_parse_init()) 1933 return -1; 1934 1935 ret = parse_events_terms(&terms, t->str); 1936 if (ret) { 1937 pr_debug("failed to parse terms '%s', err %d\n", 1938 t->str , ret); 1939 return ret; 1940 } 1941 1942 ret = t->check(&terms); 1943 parse_events_terms__purge(&terms); 1944 1945 return ret; 1946 } 1947 1948 static int test_terms(struct terms_test *terms, unsigned cnt) 1949 { 1950 int ret = 0; 1951 unsigned i; 1952 1953 for (i = 0; i < cnt; i++) { 1954 struct terms_test *t = &terms[i]; 1955 1956 pr_debug("running test %d '%s'\n", i, t->str); 1957 ret = test_term(t); 1958 if (ret) 1959 break; 1960 } 1961 1962 return ret; 1963 } 1964 1965 static int test_pmu(void) 1966 { 1967 struct stat st; 1968 char path[PATH_MAX]; 1969 int ret; 1970 1971 snprintf(path, PATH_MAX, "%s/bus/event_source/devices/cpu/format/", 1972 sysfs__mountpoint()); 1973 1974 ret = stat(path, &st); 1975 if (ret) 1976 pr_debug("omitting PMU cpu tests\n"); 1977 return !ret; 1978 } 1979 1980 static int test_pmu_events(void) 1981 { 1982 struct stat st; 1983 char path[PATH_MAX]; 1984 struct dirent *ent; 1985 DIR *dir; 1986 int ret; 1987 1988 snprintf(path, PATH_MAX, "%s/bus/event_source/devices/cpu/events/", 1989 sysfs__mountpoint()); 1990 1991 ret = stat(path, &st); 1992 if (ret) { 1993 pr_debug("omitting PMU cpu events tests\n"); 1994 return 0; 1995 } 1996 1997 dir = opendir(path); 1998 if (!dir) { 1999 pr_debug("can't open pmu event dir"); 2000 return -1; 2001 } 2002 2003 while (!ret && (ent = readdir(dir))) { 2004 struct evlist_test e = { .id = 0, }; 2005 char name[2 * NAME_MAX + 1 + 12 + 3]; 2006 2007 /* Names containing . are special and cannot be used directly */ 2008 if (strchr(ent->d_name, '.')) 2009 continue; 2010 2011 snprintf(name, sizeof(name), "cpu/event=%s/u", ent->d_name); 2012 2013 e.name = name; 2014 e.check = test__checkevent_pmu_events; 2015 2016 ret = test_event(&e); 2017 if (ret) 2018 break; 2019 snprintf(name, sizeof(name), "%s:u,cpu/event=%s/u", ent->d_name, ent->d_name); 2020 e.name = name; 2021 e.check = test__checkevent_pmu_events_mix; 2022 ret = test_event(&e); 2023 } 2024 2025 closedir(dir); 2026 return ret; 2027 } 2028 2029 int test__parse_events(struct test *test __maybe_unused, int subtest __maybe_unused) 2030 { 2031 int ret1, ret2 = 0; 2032 2033 #define TEST_EVENTS(tests) \ 2034 do { \ 2035 ret1 = test_events(tests, ARRAY_SIZE(tests)); \ 2036 if (!ret2) \ 2037 ret2 = ret1; \ 2038 } while (0) 2039 2040 TEST_EVENTS(test__events); 2041 2042 if (test_pmu()) 2043 TEST_EVENTS(test__events_pmu); 2044 2045 if (test_pmu()) { 2046 int ret = test_pmu_events(); 2047 if (ret) 2048 return ret; 2049 } 2050 2051 ret1 = test_terms(test__terms, ARRAY_SIZE(test__terms)); 2052 if (!ret2) 2053 ret2 = ret1; 2054 2055 return ret2; 2056 } 2057