Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 312286
b: refs/heads/master
c: da37896
h: refs/heads/master
v: v3
  • Loading branch information
Arnaldo Carvalho de Melo committed Jun 27, 2012
1 parent 27ed9b5 commit d5e0c45
Show file tree
Hide file tree
Showing 16 changed files with 315 additions and 183 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: 7a25b2d32b9cb0b813d56ee6109acf90f3c9f1e5
refs/heads/master: da3789628f88684d3f0fb4e6a6bc086c395ac3cb
37 changes: 25 additions & 12 deletions trunk/tools/perf/builtin-kmem.c
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,11 @@ static unsigned long nr_allocs, nr_cross_allocs;

#define PATH_SYS_NODE "/sys/devices/system/node"

struct perf_kmem {
struct perf_tool tool;
struct perf_session *session;
};

static void init_cpunode_map(void)
{
FILE *fp;
Expand Down Expand Up @@ -278,14 +283,16 @@ static void process_free_event(void *data,
s_alloc->alloc_cpu = -1;
}

static void process_raw_event(union perf_event *raw_event __used, void *data,
static void process_raw_event(struct perf_tool *tool,
union perf_event *raw_event __used, void *data,
int cpu, u64 timestamp, struct thread *thread)
{
struct perf_kmem *kmem = container_of(tool, struct perf_kmem, tool);
struct event_format *event;
int type;

type = trace_parse_common_type(data);
event = trace_find_event(type);
type = trace_parse_common_type(kmem->session->pevent, data);
event = pevent_find_event(kmem->session->pevent, type);

if (!strcmp(event->name, "kmalloc") ||
!strcmp(event->name, "kmem_cache_alloc")) {
Expand All @@ -306,7 +313,7 @@ static void process_raw_event(union perf_event *raw_event __used, void *data,
}
}

static int process_sample_event(struct perf_tool *tool __used,
static int process_sample_event(struct perf_tool *tool,
union perf_event *event,
struct perf_sample *sample,
struct perf_evsel *evsel __used,
Expand All @@ -322,16 +329,18 @@ static int process_sample_event(struct perf_tool *tool __used,

dump_printf(" ... thread: %s:%d\n", thread->comm, thread->pid);

process_raw_event(event, sample->raw_data, sample->cpu,
process_raw_event(tool, event, sample->raw_data, sample->cpu,
sample->time, thread);

return 0;
}

static struct perf_tool perf_kmem = {
.sample = process_sample_event,
.comm = perf_event__process_comm,
.ordered_samples = true,
static struct perf_kmem perf_kmem = {
.tool = {
.sample = process_sample_event,
.comm = perf_event__process_comm,
.ordered_samples = true,
},
};

static double fragmentation(unsigned long n_req, unsigned long n_alloc)
Expand Down Expand Up @@ -486,19 +495,23 @@ static void sort_result(void)
static int __cmd_kmem(void)
{
int err = -EINVAL;
struct perf_session *session = perf_session__new(input_name, O_RDONLY,
0, false, &perf_kmem);
struct perf_session *session;

session = perf_session__new(input_name, O_RDONLY, 0, false,
&perf_kmem.tool);
if (session == NULL)
return -ENOMEM;

perf_kmem.session = session;

if (perf_session__create_kernel_maps(session) < 0)
goto out_delete;

if (!perf_session__has_traces(session, "kmem record"))
goto out_delete;

setup_pager();
err = perf_session__process_events(session, &perf_kmem);
err = perf_session__process_events(session, &perf_kmem.tool);
if (err != 0)
goto out_delete;
sort_result();
Expand Down
4 changes: 2 additions & 2 deletions trunk/tools/perf/builtin-lock.c
Original file line number Diff line number Diff line change
Expand Up @@ -724,8 +724,8 @@ process_raw_event(void *data, int cpu, u64 timestamp, struct thread *thread)
struct event_format *event;
int type;

type = trace_parse_common_type(data);
event = trace_find_event(type);
type = trace_parse_common_type(session->pevent, data);
event = pevent_find_event(session->pevent, type);

if (!strcmp(event->name, "lock_acquire"))
process_lock_acquire_event(data, event, cpu, timestamp, thread);
Expand Down
36 changes: 25 additions & 11 deletions trunk/tools/perf/builtin-sched.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,11 @@ static u64 sleep_measurement_overhead;

static unsigned long nr_tasks;

struct perf_sched {
struct perf_tool tool;
struct perf_session *session;
};

struct sched_atom;

struct task_desc {
Expand Down Expand Up @@ -1597,6 +1602,8 @@ static int perf_sched__process_tracepoint_sample(struct perf_tool *tool,
struct perf_evsel *evsel,
struct machine *machine)
{
struct perf_sched *sched = container_of(tool, struct perf_sched, tool);
struct pevent *pevent = sched->session->pevent;
struct thread *thread = machine__findnew_thread(machine, sample->pid);

if (thread == NULL) {
Expand All @@ -1612,20 +1619,23 @@ static int perf_sched__process_tracepoint_sample(struct perf_tool *tool,
tracepoint_handler f = evsel->handler.func;

if (evsel->handler.data == NULL)
evsel->handler.data = trace_find_event(evsel->attr.config);
evsel->handler.data = pevent_find_event(pevent,
evsel->attr.config);

f(tool, evsel->handler.data, sample, machine, thread);
}

return 0;
}

static struct perf_tool perf_sched = {
.sample = perf_sched__process_tracepoint_sample,
.comm = perf_event__process_comm,
.lost = perf_event__process_lost,
.fork = perf_event__process_task,
.ordered_samples = true,
static struct perf_sched perf_sched = {
.tool = {
.sample = perf_sched__process_tracepoint_sample,
.comm = perf_event__process_comm,
.lost = perf_event__process_lost,
.fork = perf_event__process_task,
.ordered_samples = true,
},
};

static void read_events(bool destroy, struct perf_session **psession)
Expand All @@ -1640,16 +1650,20 @@ static void read_events(bool destroy, struct perf_session **psession)
{ "sched:sched_process_exit", process_sched_exit_event, },
{ "sched:sched_migrate_task", process_sched_migrate_task_event, },
};
struct perf_session *session = perf_session__new(input_name, O_RDONLY,
0, false, &perf_sched);
struct perf_session *session;

session = perf_session__new(input_name, O_RDONLY, 0, false,
&perf_sched.tool);
if (session == NULL)
die("No Memory");

err = perf_evlist__set_tracepoints_handlers_array(session->evlist, handlers);
perf_sched.session = session;

err = perf_session__set_tracepoints_handlers(session, handlers);
assert(err == 0);

if (perf_session__has_traces(session, "record -R")) {
err = perf_session__process_events(session, &perf_sched);
err = perf_session__process_events(session, &perf_sched.tool);
if (err)
die("Failed to process events, error %d", err);

Expand Down
66 changes: 44 additions & 22 deletions trunk/tools/perf/builtin-script.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,11 @@ static bool system_wide;
static const char *cpu_list;
static DECLARE_BITMAP(cpu_bitmap, MAX_NR_CPUS);

struct perf_script {
struct perf_tool tool;
struct perf_session *session;
};

enum perf_output_field {
PERF_OUTPUT_COMM = 1U << 0,
PERF_OUTPUT_TID = 1U << 1,
Expand Down Expand Up @@ -257,7 +262,8 @@ static int perf_session__check_output_opt(struct perf_session *session)
return 0;
}

static void print_sample_start(struct perf_sample *sample,
static void print_sample_start(struct pevent *pevent,
struct perf_sample *sample,
struct thread *thread,
struct perf_evsel *evsel)
{
Expand Down Expand Up @@ -302,8 +308,14 @@ static void print_sample_start(struct perf_sample *sample,

if (PRINT_FIELD(EVNAME)) {
if (attr->type == PERF_TYPE_TRACEPOINT) {
type = trace_parse_common_type(sample->raw_data);
event = trace_find_event(type);
/*
* XXX Do we really need this here?
* perf_evlist__set_tracepoint_names should have done
* this already
*/
type = trace_parse_common_type(pevent,
sample->raw_data);
event = pevent_find_event(pevent, type);
if (event)
evname = event->name;
} else
Expand Down Expand Up @@ -404,6 +416,7 @@ static void print_sample_bts(union perf_event *event,
}

static void process_event(union perf_event *event __unused,
struct pevent *pevent,
struct perf_sample *sample,
struct perf_evsel *evsel,
struct machine *machine,
Expand All @@ -414,15 +427,15 @@ static void process_event(union perf_event *event __unused,
if (output[attr->type].fields == 0)
return;

print_sample_start(sample, thread, evsel);
print_sample_start(pevent, sample, thread, evsel);

if (is_bts_event(attr)) {
print_sample_bts(event, sample, evsel, machine, thread);
return;
}

if (PRINT_FIELD(TRACE))
print_trace_event(sample->cpu, sample->raw_data,
print_trace_event(pevent, sample->cpu, sample->raw_data,
sample->raw_size);

if (PRINT_FIELD(ADDR))
Expand Down Expand Up @@ -453,7 +466,8 @@ static int default_stop_script(void)
return 0;
}

static int default_generate_script(const char *outfile __unused)
static int default_generate_script(struct pevent *pevent __unused,
const char *outfile __unused)
{
return 0;
}
Expand Down Expand Up @@ -491,6 +505,7 @@ static int process_sample_event(struct perf_tool *tool __used,
struct machine *machine)
{
struct addr_location al;
struct perf_script *scr = container_of(tool, struct perf_script, tool);
struct thread *thread = machine__findnew_thread(machine, event->ip.tid);

if (thread == NULL) {
Expand Down Expand Up @@ -522,24 +537,27 @@ static int process_sample_event(struct perf_tool *tool __used,
if (cpu_list && !test_bit(sample->cpu, cpu_bitmap))
return 0;

scripting_ops->process_event(event, sample, evsel, machine, thread);
scripting_ops->process_event(event, scr->session->pevent,
sample, evsel, machine, thread);

evsel->hists.stats.total_period += sample->period;
return 0;
}

static struct perf_tool perf_script = {
.sample = process_sample_event,
.mmap = perf_event__process_mmap,
.comm = perf_event__process_comm,
.exit = perf_event__process_task,
.fork = perf_event__process_task,
.attr = perf_event__process_attr,
.event_type = perf_event__process_event_type,
.tracing_data = perf_event__process_tracing_data,
.build_id = perf_event__process_build_id,
.ordered_samples = true,
.ordering_requires_timestamps = true,
static struct perf_script perf_script = {
.tool = {
.sample = process_sample_event,
.mmap = perf_event__process_mmap,
.comm = perf_event__process_comm,
.exit = perf_event__process_task,
.fork = perf_event__process_task,
.attr = perf_event__process_attr,
.event_type = perf_event__process_event_type,
.tracing_data = perf_event__process_tracing_data,
.build_id = perf_event__process_build_id,
.ordered_samples = true,
.ordering_requires_timestamps = true,
},
};

extern volatile int session_done;
Expand All @@ -555,7 +573,7 @@ static int __cmd_script(struct perf_session *session)

signal(SIGINT, sig_handler);

ret = perf_session__process_events(session, &perf_script);
ret = perf_session__process_events(session, &perf_script.tool);

if (debug_mode)
pr_err("Misordered timestamps: %" PRIu64 "\n", nr_unordered);
Expand Down Expand Up @@ -1337,10 +1355,13 @@ int cmd_script(int argc, const char **argv, const char *prefix __used)
if (!script_name)
setup_pager();

session = perf_session__new(input_name, O_RDONLY, 0, false, &perf_script);
session = perf_session__new(input_name, O_RDONLY, 0, false,
&perf_script.tool);
if (session == NULL)
return -ENOMEM;

perf_script.session = session;

if (cpu_list) {
if (perf_session__cpu_bitmap(session, cpu_list, cpu_bitmap))
return -1;
Expand Down Expand Up @@ -1386,7 +1407,8 @@ int cmd_script(int argc, const char **argv, const char *prefix __used)
return -1;
}

err = scripting_ops->generate_script("perf-script");
err = scripting_ops->generate_script(session->pevent,
"perf-script");
goto out;
}

Expand Down
4 changes: 2 additions & 2 deletions trunk/tools/perf/util/evlist.c
Original file line number Diff line number Diff line change
Expand Up @@ -224,8 +224,8 @@ int perf_evlist__add_tracepoints(struct perf_evlist *evlist,
return err;
}

static struct perf_evsel *
perf_evlist__find_tracepoint_by_id(struct perf_evlist *evlist, int id)
struct perf_evsel *
perf_evlist__find_tracepoint_by_id(struct perf_evlist *evlist, int id)
{
struct perf_evsel *evsel;

Expand Down
3 changes: 3 additions & 0 deletions trunk/tools/perf/util/evlist.h
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,9 @@ int perf_evlist__set_tracepoints_handlers(struct perf_evlist *evlist,
#define perf_evlist__set_tracepoints_handlers_array(evlist, array) \
perf_evlist__set_tracepoints_handlers(evlist, array, ARRAY_SIZE(array))

struct perf_evsel *
perf_evlist__find_tracepoint_by_id(struct perf_evlist *evlist, int id);

void perf_evlist__id_add(struct perf_evlist *evlist, struct perf_evsel *evsel,
int cpu, int thread, u64 id);

Expand Down
Loading

0 comments on commit d5e0c45

Please sign in to comment.