diff options
author | Peter Zijlstra <a.p.zijlstra@chello.nl> | 2009-11-20 16:19:45 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-11-21 08:11:35 -0500 |
commit | 81520183878a8813c71c9372de28bb70913ba549 (patch) | |
tree | 06604995dae8879091a310a3c9a9cb18d38cf62f /kernel/perf_event.c | |
parent | 0cff784ae41cc125368ae77f1c01328ae2fdc6b3 (diff) |
perf: Optimize perf_swevent_ctx_event()
Remove a rcu_read_{,un}lock() pair and a few conditionals.
We can remove the rcu_read_lock() by increasing the scope of one
in the calling function.
We can do away with the system_state check if the machine still
boots after this patch (seems to be the case).
We can do away with the list_empty() check because the bare
list_for_each_entry_rcu() reduces to that now that we've removed
everything else.
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Paul Mackerras <paulus@samba.org>
LKML-Reference: <20091120212508.378188589@chello.nl>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel/perf_event.c')
-rw-r--r-- | kernel/perf_event.c | 7 |
1 files changed, 1 insertions, 6 deletions
diff --git a/kernel/perf_event.c b/kernel/perf_event.c index 8e55b440e28a..cda17acfcaf8 100644 --- a/kernel/perf_event.c +++ b/kernel/perf_event.c | |||
@@ -3886,15 +3886,10 @@ static void perf_swevent_ctx_event(struct perf_event_context *ctx, | |||
3886 | { | 3886 | { |
3887 | struct perf_event *event; | 3887 | struct perf_event *event; |
3888 | 3888 | ||
3889 | if (system_state != SYSTEM_RUNNING || list_empty(&ctx->event_list)) | ||
3890 | return; | ||
3891 | |||
3892 | rcu_read_lock(); | ||
3893 | list_for_each_entry_rcu(event, &ctx->event_list, event_entry) { | 3889 | list_for_each_entry_rcu(event, &ctx->event_list, event_entry) { |
3894 | if (perf_swevent_match(event, type, event_id, data, regs)) | 3890 | if (perf_swevent_match(event, type, event_id, data, regs)) |
3895 | perf_swevent_add(event, nr, nmi, data, regs); | 3891 | perf_swevent_add(event, nr, nmi, data, regs); |
3896 | } | 3892 | } |
3897 | rcu_read_unlock(); | ||
3898 | } | 3893 | } |
3899 | 3894 | ||
3900 | static int *perf_swevent_recursion_context(struct perf_cpu_context *cpuctx) | 3895 | static int *perf_swevent_recursion_context(struct perf_cpu_context *cpuctx) |
@@ -3926,9 +3921,9 @@ static void do_perf_sw_event(enum perf_type_id type, u32 event_id, | |||
3926 | (*recursion)++; | 3921 | (*recursion)++; |
3927 | barrier(); | 3922 | barrier(); |
3928 | 3923 | ||
3924 | rcu_read_lock(); | ||
3929 | perf_swevent_ctx_event(&cpuctx->ctx, type, event_id, | 3925 | perf_swevent_ctx_event(&cpuctx->ctx, type, event_id, |
3930 | nr, nmi, data, regs); | 3926 | nr, nmi, data, regs); |
3931 | rcu_read_lock(); | ||
3932 | /* | 3927 | /* |
3933 | * doesn't really matter which of the child contexts the | 3928 | * doesn't really matter which of the child contexts the |
3934 | * events ends up in. | 3929 | * events ends up in. |