Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 188270
b: refs/heads/master
c: c530665
h: refs/heads/master
v: v3
  • Loading branch information
Frederic Weisbecker committed Mar 10, 2010
1 parent c7c7d05 commit 4dbbe64
Show file tree
Hide file tree
Showing 7 changed files with 20 additions and 15 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: 5331d7b84613b8325362dde53dc2bff2fb87d351
refs/heads/master: c530665c31c0140b74ca7689e7f836177796e5bd
7 changes: 5 additions & 2 deletions trunk/include/linux/ftrace_event.h
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,9 @@ do { \

#ifdef CONFIG_PERF_EVENTS
struct perf_event;

DECLARE_PER_CPU(struct pt_regs, perf_trace_regs);

extern int ftrace_profile_enable(int event_id);
extern void ftrace_profile_disable(int event_id);
extern int ftrace_profile_set_filter(struct perf_event *event, int event_id,
Expand All @@ -198,11 +201,11 @@ ftrace_perf_buf_prepare(int size, unsigned short type, int *rctxp,

static inline void
ftrace_perf_buf_submit(void *raw_data, int size, int rctx, u64 addr,
u64 count, unsigned long irq_flags)
u64 count, unsigned long irq_flags, struct pt_regs *regs)
{
struct trace_entry *entry = raw_data;

perf_tp_event(entry->type, addr, count, raw_data, size);
perf_tp_event(entry->type, addr, count, raw_data, size, regs);
perf_swevent_put_recursion_context(rctx);
local_irq_restore(irq_flags);
}
Expand Down
6 changes: 5 additions & 1 deletion trunk/include/trace/ftrace.h
Original file line number Diff line number Diff line change
Expand Up @@ -764,6 +764,7 @@ ftrace_profile_templ_##call(struct ftrace_event_call *event_call, \
struct ftrace_raw_##call *entry; \
u64 __addr = 0, __count = 1; \
unsigned long irq_flags; \
struct pt_regs *__regs; \
int __entry_size; \
int __data_size; \
int rctx; \
Expand All @@ -784,8 +785,11 @@ ftrace_profile_templ_##call(struct ftrace_event_call *event_call, \
\
{ assign; } \
\
__regs = &__get_cpu_var(perf_trace_regs); \
perf_fetch_caller_regs(__regs, 2); \
\
ftrace_perf_buf_submit(entry, __entry_size, rctx, __addr, \
__count, irq_flags); \
__count, irq_flags, __regs); \
}

#undef DEFINE_EVENT
Expand Down
8 changes: 2 additions & 6 deletions trunk/kernel/perf_event.c
Original file line number Diff line number Diff line change
Expand Up @@ -4318,9 +4318,8 @@ static const struct pmu perf_ops_task_clock = {
#ifdef CONFIG_EVENT_TRACING

void perf_tp_event(int event_id, u64 addr, u64 count, void *record,
int entry_size)
int entry_size, struct pt_regs *regs)
{
struct pt_regs *regs = get_irq_regs();
struct perf_sample_data data;
struct perf_raw_record raw = {
.size = entry_size,
Expand All @@ -4330,12 +4329,9 @@ void perf_tp_event(int event_id, u64 addr, u64 count, void *record,
perf_sample_data_init(&data, addr);
data.raw = &raw;

if (!regs)
regs = task_pt_regs(current);

/* Trace events already protected against recursion */
do_perf_sw_event(PERF_TYPE_TRACEPOINT, event_id, count, 1,
&data, regs);
&data, regs);
}
EXPORT_SYMBOL_GPL(perf_tp_event);

Expand Down
3 changes: 2 additions & 1 deletion trunk/kernel/trace/trace_event_profile.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,14 @@
* trace event based perf counter profiling
*
* Copyright (C) 2009 Red Hat Inc, Peter Zijlstra <pzijlstr@redhat.com>
*
* Copyright (C) 2009-2010 Frederic Weisbecker <fweisbec@gmail.com>
*/

#include <linux/module.h>
#include <linux/kprobes.h>
#include "trace.h"

DEFINE_PER_CPU(struct pt_regs, perf_trace_regs);

static char *perf_trace_buf;
static char *perf_trace_buf_nmi;
Expand Down
5 changes: 3 additions & 2 deletions trunk/kernel/trace/trace_kprobe.c
Original file line number Diff line number Diff line change
Expand Up @@ -1240,7 +1240,7 @@ static __kprobes void kprobe_profile_func(struct kprobe *kp,
for (i = 0; i < tp->nr_args; i++)
entry->args[i] = call_fetch(&tp->args[i].fetch, regs);

ftrace_perf_buf_submit(entry, size, rctx, entry->ip, 1, irq_flags);
ftrace_perf_buf_submit(entry, size, rctx, entry->ip, 1, irq_flags, regs);
}

/* Kretprobe profile handler */
Expand Down Expand Up @@ -1271,7 +1271,8 @@ static __kprobes void kretprobe_profile_func(struct kretprobe_instance *ri,
for (i = 0; i < tp->nr_args; i++)
entry->args[i] = call_fetch(&tp->args[i].fetch, regs);

ftrace_perf_buf_submit(entry, size, rctx, entry->ret_ip, 1, irq_flags);
ftrace_perf_buf_submit(entry, size, rctx, entry->ret_ip, 1,
irq_flags, regs);
}

static int probe_profile_enable(struct ftrace_event_call *call)
Expand Down
4 changes: 2 additions & 2 deletions trunk/kernel/trace/trace_syscalls.c
Original file line number Diff line number Diff line change
Expand Up @@ -467,7 +467,7 @@ static void prof_syscall_enter(struct pt_regs *regs, long id)
rec->nr = syscall_nr;
syscall_get_arguments(current, regs, 0, sys_data->nb_args,
(unsigned long *)&rec->args);
ftrace_perf_buf_submit(rec, size, rctx, 0, 1, flags);
ftrace_perf_buf_submit(rec, size, rctx, 0, 1, flags, regs);
}

int prof_sysenter_enable(struct ftrace_event_call *call)
Expand Down Expand Up @@ -542,7 +542,7 @@ static void prof_syscall_exit(struct pt_regs *regs, long ret)
rec->nr = syscall_nr;
rec->ret = syscall_get_return_value(current, regs);

ftrace_perf_buf_submit(rec, size, rctx, 0, 1, flags);
ftrace_perf_buf_submit(rec, size, rctx, 0, 1, flags, regs);
}

int prof_sysexit_enable(struct ftrace_event_call *call)
Expand Down

0 comments on commit 4dbbe64

Please sign in to comment.