Browse Source

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>
Peter Zijlstra 14 years ago
parent
commit
7e54a5a0b6
2 changed files with 13 additions and 11 deletions
  1. 11 9
      include/linux/perf_event.h
  2. 2 2
      kernel/perf_event.c

+ 11 - 9
include/linux/perf_event.h

@@ -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;
-
-		if (!regs) {
-			perf_fetch_caller_regs(&hot_regs);
-			regs = &hot_regs;
-		}
-		__perf_sw_event(event_id, nr, nmi, regs, addr);
+	struct pt_regs hot_regs;
+
+	JUMP_LABEL(&perf_swevent_enabled[event_id], have_event);
+	return;
+
+have_event:
+	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);

+ 2 - 2
kernel/perf_event.c

@@ -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;
 	}
 	}