perf: Optimize sw events
Acked-by: Frederic Weisbecker <fweisbec@gmail.com> Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> LKML-Reference: <new-submission> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
committed by
Ingo Molnar
parent
82cd6def98
commit
7e54a5a0b6
@@ -1012,18 +1012,20 @@ static inline void perf_fetch_caller_regs(struct pt_regs *regs)
|
|||||||
perf_arch_fetch_caller_regs(regs, CALLER_ADDR0);
|
perf_arch_fetch_caller_regs(regs, CALLER_ADDR0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static __always_inline void
|
||||||
perf_sw_event(u32 event_id, u64 nr, int nmi, struct pt_regs *regs, u64 addr)
|
perf_sw_event(u32 event_id, u64 nr, int nmi, struct pt_regs *regs, u64 addr)
|
||||||
{
|
{
|
||||||
if (atomic_read(&perf_swevent_enabled[event_id])) {
|
struct pt_regs hot_regs;
|
||||||
struct pt_regs hot_regs;
|
|
||||||
|
|
||||||
if (!regs) {
|
JUMP_LABEL(&perf_swevent_enabled[event_id], have_event);
|
||||||
perf_fetch_caller_regs(&hot_regs);
|
return;
|
||||||
regs = &hot_regs;
|
|
||||||
}
|
have_event:
|
||||||
__perf_sw_event(event_id, nr, nmi, regs, addr);
|
if (!regs) {
|
||||||
|
perf_fetch_caller_regs(&hot_regs);
|
||||||
|
regs = &hot_regs;
|
||||||
}
|
}
|
||||||
|
__perf_sw_event(event_id, nr, nmi, regs, addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern void perf_event_mmap(struct vm_area_struct *vma);
|
extern void perf_event_mmap(struct vm_area_struct *vma);
|
||||||
|
@@ -4669,7 +4669,7 @@ static void sw_perf_event_destroy(struct perf_event *event)
|
|||||||
|
|
||||||
WARN_ON(event->parent);
|
WARN_ON(event->parent);
|
||||||
|
|
||||||
atomic_dec(&perf_swevent_enabled[event_id]);
|
jump_label_dec(&perf_swevent_enabled[event_id]);
|
||||||
swevent_hlist_put(event);
|
swevent_hlist_put(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4699,7 +4699,7 @@ static int perf_swevent_init(struct perf_event *event)
|
|||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
atomic_inc(&perf_swevent_enabled[event_id]);
|
jump_label_inc(&perf_swevent_enabled[event_id]);
|
||||||
event->destroy = sw_perf_event_destroy;
|
event->destroy = sw_perf_event_destroy;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user