Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 158287
b: refs/heads/master
c: 1ef2ed1
h: refs/heads/master
i:
  158285: d7f6766
  158283: 37f32a1
  158279: 6c3f5c0
  158271: da7a602
v: v3
  • Loading branch information
Frederic Weisbecker authored and Ingo Molnar committed Aug 28, 2009
1 parent 4e91e5c commit df0b031
Show file tree
Hide file tree
Showing 8 changed files with 121 additions and 28 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 1909629fb1ec9800cf2cb0091870d6a1c1ca665f
refs/heads/master: 1ef2ed1066ae9f8080cd96cba11c2d41118b8792
4 changes: 2 additions & 2 deletions trunk/tools/perf/builtin-record.c
Original file line number Diff line number Diff line change
Expand Up @@ -549,11 +549,11 @@ static int __cmd_record(int argc, const char **argv)


if (raw_samples) {
read_tracing_data();
read_tracing_data(attrs, nr_counters);
} else {
for (i = 0; i < nr_counters; i++) {
if (attrs[i].sample_type & PERF_SAMPLE_RAW) {
read_tracing_data();
read_tracing_data(attrs, nr_counters);
break;
}
}
Expand Down
47 changes: 39 additions & 8 deletions trunk/tools/perf/util/parse-events.c
Original file line number Diff line number Diff line change
Expand Up @@ -158,9 +158,9 @@ int valid_debugfs_mount(const char *debugfs)
return 0;
}

static const char *tracepoint_id_to_name(u64 config)
struct tracepoint_path *tracepoint_id_to_path(u64 config)
{
static char tracepoint_name[2 * MAX_EVENT_LENGTH];
struct tracepoint_path *path = NULL;
DIR *sys_dir, *evt_dir;
struct dirent *sys_next, *evt_next, sys_dirent, evt_dirent;
struct stat st;
Expand All @@ -170,7 +170,7 @@ static const char *tracepoint_id_to_name(u64 config)
char evt_path[MAXPATHLEN];

if (valid_debugfs_mount(debugfs_path))
return "unkown";
return NULL;

sys_dir = opendir(debugfs_path);
if (!sys_dir)
Expand All @@ -197,18 +197,49 @@ static const char *tracepoint_id_to_name(u64 config)
if (id == config) {
closedir(evt_dir);
closedir(sys_dir);
snprintf(tracepoint_name, 2 * MAX_EVENT_LENGTH,
"%s:%s", sys_dirent.d_name,
evt_dirent.d_name);
return tracepoint_name;
path = calloc(1, sizeof(path));
path->system = malloc(MAX_EVENT_LENGTH);
if (!path->system) {
free(path);
return NULL;
}
path->name = malloc(MAX_EVENT_LENGTH);
if (!path->name) {
free(path->system);
free(path);
return NULL;
}
strncpy(path->system, sys_dirent.d_name,
MAX_EVENT_LENGTH);
strncpy(path->name, evt_dirent.d_name,
MAX_EVENT_LENGTH);
return path;
}
}
closedir(evt_dir);
}

cleanup:
closedir(sys_dir);
return "unkown";
return NULL;
}

#define TP_PATH_LEN (MAX_EVENT_LENGTH * 2 + 1)
static const char *tracepoint_id_to_name(u64 config)
{
static char buf[TP_PATH_LEN];
struct tracepoint_path *path;

path = tracepoint_id_to_path(config);
if (path) {
snprintf(buf, TP_PATH_LEN, "%s:%s", path->system, path->name);
free(path->name);
free(path->system);
free(path);
} else
snprintf(buf, TP_PATH_LEN, "%s:%s", "unknown", "unknown");

return buf;
}

static int is_cache_op_valid(u8 cache_type, u8 cache_op)
Expand Down
13 changes: 12 additions & 1 deletion trunk/tools/perf/util/parse-events.h
Original file line number Diff line number Diff line change
@@ -1,10 +1,19 @@

#ifndef _PARSE_EVENTS_H
#define _PARSE_EVENTS_H
/*
* Parse symbolic events/counts passed in as options:
*/

struct option;

struct tracepoint_path {
char *system;
char *name;
struct tracepoint_path *next;
};

extern struct tracepoint_path *tracepoint_id_to_path(u64 config);

extern int nr_counters;

extern struct perf_counter_attr attrs[MAX_COUNTERS];
Expand All @@ -21,3 +30,5 @@ extern void print_events(void);
extern char debugfs_path[];
extern int valid_debugfs_mount(const char *debugfs);


#endif /* _PARSE_EVENTS_H */
72 changes: 60 additions & 12 deletions trunk/tools/perf/util/trace-event-info.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,9 @@
#include <unistd.h>
#include <ctype.h>
#include <errno.h>
#include <stdbool.h>

#include "../perf.h"
#include "trace-event.h"


Expand Down Expand Up @@ -289,7 +291,18 @@ static void read_header_files(void)
put_tracing_file(path);
}

static void copy_event_system(const char *sys)
static bool name_in_tp_list(char *sys, struct tracepoint_path *tps)
{
while (tps) {
if (!strcmp(sys, tps->name))
return true;
tps = tps->next;
}

return false;
}

static void copy_event_system(const char *sys, struct tracepoint_path *tps)
{
unsigned long long size, check_size;
struct dirent *dent;
Expand All @@ -305,7 +318,8 @@ static void copy_event_system(const char *sys)

while ((dent = readdir(dir))) {
if (strcmp(dent->d_name, ".") == 0 ||
strcmp(dent->d_name, "..") == 0)
strcmp(dent->d_name, "..") == 0 ||
!name_in_tp_list(dent->d_name, tps))
continue;
format = malloc_or_die(strlen(sys) + strlen(dent->d_name) + 10);
sprintf(format, "%s/%s/format", sys, dent->d_name);
Expand All @@ -321,7 +335,8 @@ static void copy_event_system(const char *sys)
rewinddir(dir);
while ((dent = readdir(dir))) {
if (strcmp(dent->d_name, ".") == 0 ||
strcmp(dent->d_name, "..") == 0)
strcmp(dent->d_name, "..") == 0 ||
!name_in_tp_list(dent->d_name, tps))
continue;
format = malloc_or_die(strlen(sys) + strlen(dent->d_name) + 10);
sprintf(format, "%s/%s/format", sys, dent->d_name);
Expand All @@ -340,18 +355,29 @@ static void copy_event_system(const char *sys)
}
}

static void read_ftrace_files(void)
static void read_ftrace_files(struct tracepoint_path *tps)
{
char *path;

path = get_tracing_file("events/ftrace");

copy_event_system(path);
copy_event_system(path, tps);

put_tracing_file(path);
}

static void read_event_files(void)
static bool system_in_tp_list(char *sys, struct tracepoint_path *tps)
{
while (tps) {
if (!strcmp(sys, tps->system))
return true;
tps = tps->next;
}

return false;
}

static void read_event_files(struct tracepoint_path *tps)
{
struct dirent *dent;
struct stat st;
Expand All @@ -370,7 +396,8 @@ static void read_event_files(void)
while ((dent = readdir(dir))) {
if (strcmp(dent->d_name, ".") == 0 ||
strcmp(dent->d_name, "..") == 0 ||
strcmp(dent->d_name, "ftrace") == 0)
strcmp(dent->d_name, "ftrace") == 0 ||
!system_in_tp_list(dent->d_name, tps))
continue;
sys = malloc_or_die(strlen(path) + strlen(dent->d_name) + 2);
sprintf(sys, "%s/%s", path, dent->d_name);
Expand All @@ -388,15 +415,16 @@ static void read_event_files(void)
while ((dent = readdir(dir))) {
if (strcmp(dent->d_name, ".") == 0 ||
strcmp(dent->d_name, "..") == 0 ||
strcmp(dent->d_name, "ftrace") == 0)
strcmp(dent->d_name, "ftrace") == 0 ||
!system_in_tp_list(dent->d_name, tps))
continue;
sys = malloc_or_die(strlen(path) + strlen(dent->d_name) + 2);
sprintf(sys, "%s/%s", path, dent->d_name);
ret = stat(sys, &st);
if (ret >= 0) {
if (S_ISDIR(st.st_mode)) {
write_or_die(dent->d_name, strlen(dent->d_name) + 1);
copy_event_system(sys);
copy_event_system(sys, tps);
}
}
free(sys);
Expand Down Expand Up @@ -450,9 +478,27 @@ static void read_ftrace_printk(void)

}

void read_tracing_data(void)
static struct tracepoint_path *
get_tracepoints_path(struct perf_counter_attr *pattrs, int nb_counters)
{
struct tracepoint_path path, *ppath = &path;
int i;

for (i = 0; i < nb_counters; i++) {
if (pattrs[i].type != PERF_TYPE_TRACEPOINT)
continue;
ppath->next = tracepoint_id_to_path(pattrs[i].config);
if (!ppath->next)
die("%s\n", "No memory to alloc tracepoints list");
ppath = ppath->next;
}

return path.next;
}
void read_tracing_data(struct perf_counter_attr *pattrs, int nb_counters)
{
char buf[BUFSIZ];
struct tracepoint_path *tps;

output_fd = open(output_file, O_WRONLY | O_CREAT | O_TRUNC | O_LARGEFILE, 0644);
if (output_fd < 0)
Expand Down Expand Up @@ -483,9 +529,11 @@ void read_tracing_data(void)
page_size = getpagesize();
write_or_die(&page_size, 4);

tps = get_tracepoints_path(pattrs, nb_counters);

read_header_files();
read_ftrace_files();
read_event_files();
read_ftrace_files(tps);
read_event_files(tps);
read_proc_kallsyms();
read_ftrace_printk();
}
1 change: 1 addition & 0 deletions trunk/tools/perf/util/trace-event-parse.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
#include <errno.h>

#undef _GNU_SOURCE
#include "../perf.h"
#include "util.h"
#include "trace-event.h"

Expand Down
1 change: 1 addition & 0 deletions trunk/tools/perf/util/trace-event-read.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
#include <ctype.h>
#include <errno.h>

#include "../perf.h"
#include "util.h"
#include "trace-event.h"

Expand Down
9 changes: 5 additions & 4 deletions trunk/tools/perf/util/trace-event.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#ifndef _PARSE_EVENTS_H
#define _PARSE_EVENTS_H
#ifndef _TRACE_EVENTS_H
#define _TRACE_EVENTS_H

#include "parse-events.h"

#define __unused __attribute__((unused))

Expand Down Expand Up @@ -233,6 +234,6 @@ extern int header_page_data_size;

int parse_header_page(char *buf, unsigned long size);

void read_tracing_data(void);
void read_tracing_data(struct perf_counter_attr *pattrs, int nb_counters);

#endif /* _PARSE_EVENTS_H */
#endif /* _TRACE_EVENTS_H */

0 comments on commit df0b031

Please sign in to comment.