Messages in this thread Patch in this message |  | | | From | Frederic Weisbecker <> | | Subject | [RFC PATCH 2/4] perf/core: Optimize a bit rotate_ctx() | | Date | Sun, 8 Nov 2009 21:13:24 +0100 |
| |
Don't use list_for_each_entry() just to swap the first and last entry in the list.
Instead, use a direct list->next derefencing. This saves up a useless prefetch.
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Paul Mackerras <paulus@samba.org> Cc: Thomas Gleixner <tglx@linutronix.de> --- kernel/perf_event.c | 16 +++++++++------- 1 files changed, 9 insertions(+), 7 deletions(-) diff --git a/kernel/perf_event.c b/kernel/perf_event.c index b3a31c8..0432c1c 100644 --- a/kernel/perf_event.c +++ b/kernel/perf_event.c @@ -1432,7 +1432,7 @@ static void perf_ctx_adjust_freq(struct perf_event_context *ctx) */ static void rotate_ctx(struct perf_event_context *ctx) { - struct perf_event *event; + struct list_head *list; if (!ctx->nr_events) return; @@ -1442,15 +1442,17 @@ static void rotate_ctx(struct perf_event_context *ctx) * Rotate the first entry last (works just fine for group events too): */ perf_disable(); - list_for_each_entry(event, &ctx->pinned_grp_list, group_entry) { - list_move_tail(&event->group_entry, &ctx->pinned_grp_list); - break; + + if (!list_empty(&ctx->pinned_grp_list)) { + list = ctx->pinned_grp_list.next; + list_move_tail(list, &ctx->pinned_grp_list); } - list_for_each_entry(event, &ctx->volatile_grp_list, group_entry) { - list_move_tail(&event->group_entry, &ctx->volatile_grp_list); - break; + if (!list_empty(&ctx->volatile_grp_list)) { + list = ctx->volatile_grp_list.next; + list_move_tail(list, &ctx->volatile_grp_list); } + perf_enable(); spin_unlock(&ctx->lock); -- 1.6.2.3
|  |