| 353 | } |
| 354 | |
| 355 | bool PerfEventsCounters::processThreadLocalChanges(const std::string & needed_events_list) |
| 356 | { |
| 357 | const auto valid_event_indices = eventIndicesFromString(needed_events_list); |
| 358 | |
| 359 | // find state changes (if there are any) |
| 360 | bool old_state[NUMBER_OF_RAW_EVENTS]; |
| 361 | for (size_t i = 0; i < NUMBER_OF_RAW_EVENTS; ++i) |
| 362 | old_state[i] = thread_events_descriptors_holder.descriptors[i] != -1; |
| 363 | |
| 364 | bool new_state[NUMBER_OF_RAW_EVENTS]; |
| 365 | std::fill_n(new_state, NUMBER_OF_RAW_EVENTS, false); |
| 366 | for (size_t opened_index : valid_event_indices) |
| 367 | new_state[opened_index] = true; |
| 368 | |
| 369 | std::vector<size_t> events_to_open; |
| 370 | std::vector<size_t> events_to_release; |
| 371 | for (size_t i = 0; i < NUMBER_OF_RAW_EVENTS; ++i) |
| 372 | { |
| 373 | bool old_one = old_state[i]; |
| 374 | bool new_one = new_state[i]; |
| 375 | |
| 376 | if (old_one == new_one) |
| 377 | { |
| 378 | if (old_one |
| 379 | && !validatePerfEventDescriptor( |
| 380 | thread_events_descriptors_holder.descriptors[i])) |
| 381 | { |
| 382 | events_to_open.push_back(i); |
| 383 | } |
| 384 | continue; |
| 385 | } |
| 386 | |
| 387 | if (new_one) |
| 388 | events_to_open.push_back(i); |
| 389 | else |
| 390 | events_to_release.push_back(i); |
| 391 | } |
| 392 | |
| 393 | // release unused descriptors |
| 394 | for (size_t i : events_to_release) |
| 395 | { |
| 396 | int & fd = thread_events_descriptors_holder.descriptors[i]; |
| 397 | disablePerfEvent(fd); |
| 398 | releasePerfEvent(fd); |
| 399 | fd = -1; |
| 400 | } |
| 401 | |
| 402 | if (events_to_open.empty()) |
| 403 | { |
| 404 | return true; |
| 405 | } |
| 406 | |
| 407 | // check permissions |
| 408 | // cat /proc/sys/kernel/perf_event_paranoid |
| 409 | // -1: Allow use of (almost) all events by all users |
| 410 | // >=0: Disallow raw tracepoint access by users without CAP_IOC_LOCK |
| 411 | // >=1: Disallow CPU event access by users without CAP_SYS_ADMIN |
| 412 | // >=2: Disallow kernel profiling by users without CAP_SYS_ADMIN |
nothing calls this directly
no test coverage detected