Skip to content

Commit

Permalink
perf: Add kernel side syscall events support for breakpoints
Browse files Browse the repository at this point in the history
Add the remaining necessary bits to support breakpoints created
through perf syscall.

We don't use the software counter interface as:

- We don't need to check against recursion, this is already done
  in hardware breakpoints arch level.

- We already know the perf event we are dealing with when the
  event is to be committed.

Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Prasad <prasad@linux.vnet.ibm.com>
LKML-Reference: <1258987355-8751-3-git-send-email-fweisbec@gmail.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
  • Loading branch information
Frederic Weisbecker authored and Ingo Molnar committed Nov 23, 2009
1 parent fdf6bc9 commit f5ffe02
Showing 1 changed file with 25 additions and 9 deletions.
34 changes: 25 additions & 9 deletions kernel/perf_event.c
Original file line number Diff line number Diff line change
Expand Up @@ -3831,6 +3831,20 @@ static int perf_swevent_is_counting(struct perf_event *event)
static int perf_tp_event_match(struct perf_event *event,
struct perf_sample_data *data);

static int perf_exclude_event(struct perf_event *event,
struct pt_regs *regs)
{
if (regs) {
if (event->attr.exclude_user && user_mode(regs))
return 1;

if (event->attr.exclude_kernel && !user_mode(regs))
return 1;
}

return 0;
}

static int perf_swevent_match(struct perf_event *event,
enum perf_type_id type,
u32 event_id,
Expand All @@ -3842,16 +3856,12 @@ static int perf_swevent_match(struct perf_event *event,

if (event->attr.type != type)
return 0;

if (event->attr.config != event_id)
return 0;

if (regs) {
if (event->attr.exclude_user && user_mode(regs))
return 0;

if (event->attr.exclude_kernel && !user_mode(regs))
return 0;
}
if (perf_exclude_event(event, regs))
return 0;

if (event->attr.type == PERF_TYPE_TRACEPOINT &&
!perf_tp_event_match(event, data))
Expand Down Expand Up @@ -4282,9 +4292,15 @@ static const struct pmu *bp_perf_event_init(struct perf_event *bp)
return &perf_ops_bp;
}

void perf_bp_event(struct perf_event *bp, void *regs)
void perf_bp_event(struct perf_event *bp, void *data)
{
/* TODO */
struct perf_sample_data sample;
struct pt_regs *regs = data;

sample.addr = bp->attr.bp_addr;

if (!perf_exclude_event(bp, regs))
perf_swevent_add(bp, 1, 1, &sample, regs);
}
#else
static void bp_perf_event_destroy(struct perf_event *event)
Expand Down

0 comments on commit f5ffe02

Please sign in to comment.