perf tools: Add a per tracepoint counter attribute to get raw sample
Add a new flag field while opening a tracepoint perf counter: -e tracepoint_subsystem:tracepoint_name:flags This is intended to be generic although for now it only supports the r[e[c[o[r[d]]]]] flag: ./perf record -e workqueue:workqueue_insertion:record ./perf record -e workqueue:workqueue_insertion:r will have the same effect: enabling the raw samples record for the given tracepoint counter. In the future, we may want to support further flags, separated by commas. Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Mike Galbraith <efault@gmx.de> LKML-Reference: <1250152039-7284-1-git-send-email-fweisbec@gmail.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
28402971d8
commit
3a9f131fb0
|
@ -398,7 +398,7 @@ static void create_counter(int counter, int cpu, pid_t pid)
|
||||||
PERF_FORMAT_TOTAL_TIME_RUNNING |
|
PERF_FORMAT_TOTAL_TIME_RUNNING |
|
||||||
PERF_FORMAT_ID;
|
PERF_FORMAT_ID;
|
||||||
|
|
||||||
attr->sample_type = PERF_SAMPLE_IP | PERF_SAMPLE_TID;
|
attr->sample_type |= PERF_SAMPLE_IP | PERF_SAMPLE_TID;
|
||||||
|
|
||||||
if (freq) {
|
if (freq) {
|
||||||
attr->sample_type |= PERF_SAMPLE_PERIOD;
|
attr->sample_type |= PERF_SAMPLE_PERIOD;
|
||||||
|
|
|
@ -379,6 +379,7 @@ static int parse_tracepoint_event(const char **strp,
|
||||||
struct perf_counter_attr *attr)
|
struct perf_counter_attr *attr)
|
||||||
{
|
{
|
||||||
const char *evt_name;
|
const char *evt_name;
|
||||||
|
char *flags;
|
||||||
char sys_name[MAX_EVENT_LENGTH];
|
char sys_name[MAX_EVENT_LENGTH];
|
||||||
char id_buf[4];
|
char id_buf[4];
|
||||||
int fd;
|
int fd;
|
||||||
|
@ -400,6 +401,15 @@ static int parse_tracepoint_event(const char **strp,
|
||||||
strncpy(sys_name, *strp, sys_length);
|
strncpy(sys_name, *strp, sys_length);
|
||||||
sys_name[sys_length] = '\0';
|
sys_name[sys_length] = '\0';
|
||||||
evt_name = evt_name + 1;
|
evt_name = evt_name + 1;
|
||||||
|
|
||||||
|
flags = strchr(evt_name, ':');
|
||||||
|
if (flags) {
|
||||||
|
*flags = '\0';
|
||||||
|
flags++;
|
||||||
|
if (!strncmp(flags, "record", strlen(flags)))
|
||||||
|
attr->sample_type |= PERF_SAMPLE_RAW;
|
||||||
|
}
|
||||||
|
|
||||||
evt_length = strlen(evt_name);
|
evt_length = strlen(evt_name);
|
||||||
if (evt_length >= MAX_EVENT_LENGTH)
|
if (evt_length >= MAX_EVENT_LENGTH)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue