Как использовать PERF_SAMPLE_READ с mmap - PullRequest
1 голос
/ 25 февраля 2020

Этот вопрос относится к системному вызову perf_event_open, но для него нет тега.

В настоящее время я хочу использовать PERF_SAMPLE_READ член перечисления perf_event_sample_format для получения некоторых данных. из карты памяти, но по неизвестной причине системный вызов сам возвращает «неверный аргумент» (errno 22).


У меня есть следующая конфигурация:

this->eventConfiguration.sample_freq = 11;
this->eventConfiguration.freq = true;
this->eventConfiguration.inherit = true;
this->eventConfiguration.sample_type = PERF_SAMPLE_CPU | PERF_SAMPLE_TIME | PERF_SAMPLE_PERIOD /*| PERF_SAMPLE_READ*/;

Событие Я отслеживаю PERF_COUNT_HW_CPU_CYCLES.

Это мой системный вызов. Я наблюдаю за каждым ядром моего компьютера:

int fileDescriptor = syscall(__NR_perf_event_open, this->configuration.getEventConfiguration() , -1, i, -1, 0);

Обработка ошибки показана ниже, но я не думаю, что это полезно ...

if(fileDescriptor < 0) {
  switch(errno) {
    // here is some cases
  };
}

Спасибо заблаговременно ! : -)

1 Ответ

2 голосов
/ 25 февраля 2020

Я нашел ошибку!

Проблема в том, что ядро ​​не поддерживает использование PERF_SAMPLE_READ, когда установлен элемент inherit структуры perf_event_attr.

Следующий код взят из исходников ядра: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/kernel/events/core.c#n10788

/*
 * We currently do not support PERF_SAMPLE_READ on inherited events.
 * See perf_output_read().
 */
if (attr->inherit && (attr->sample_type & PERF_SAMPLE_READ))
    goto err_ns;
...