[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <1375898048.6848.18.camel@gandalf.local.home>
Date: Wed, 07 Aug 2013 13:54:08 -0400
From: Steven Rostedt <rostedt@...dmis.org>
To: linux-kernel@...r.kernel.org
Cc: "H. Peter Anvin" <hpa@...or.com>,
Linus Torvalds <torvalds@...ux-foundation.org>,
Ingo Molnar <mingo@...nel.org>,
Andrew Morton <akpm@...ux-foundation.org>,
Thomas Gleixner <tglx@...utronix.de>,
Peter Zijlstra <peterz@...radead.org>,
Jason Baron <jbaron@...mai.com>
Subject: [RFC][PATCH 3/2] x86/jump labels: Count and display the short jumps
used
On Wed, 2013-08-07 at 13:36 -0400, Steven Rostedt wrote:
> As I said, I would post the patches that let the jmps used by jump labels
> be turn to 2 bytes where possible. These are a bit controversial due
> to the complexity of the update_jump_label code.
>
> These patches are based off of tip's x86/jumplabel code.
>
> But if someone cares to play with it, feel free. I'll push this up
> to my repo under: tip/perf/jump-label-7 (internally this is my 7th version).
>
> I'll post a patch that does the counting as well as a reply to this
> post.
Here's the patch that forces the update and counts the number of short
jumps vs long jumps. It also outputs the locations of the short jumps.
On another box, using a distro config, I had even better results:
[ 2.352448] short jumps: 193
[ 2.355407] long jumps: 219
Signed-off-by: Steven Rostedt <rostedt@...dmis.org>
Index: linux-trace.git/arch/x86/kernel/jump_label.c
===================================================================
--- linux-trace.git.orig/arch/x86/kernel/jump_label.c
+++ linux-trace.git/arch/x86/kernel/jump_label.c
@@ -44,6 +44,9 @@ static void bug_at(unsigned char *ip, in
BUG();
}
+static int short_nops;
+static int long_nops;
+
static void __jump_label_transform(struct jump_entry *entry,
enum jump_label_type type,
void *(*poker)(void *, const void *, size_t),
@@ -82,9 +85,14 @@ static void __jump_label_transform(struc
*/
if (init) {
/* Ignore short nops, we do not change them */
- if (memcmp(ip, nop_short, 2) == 0)
+ if (memcmp(ip, nop_short, 2) == 0) {
+ short_nops++;
+ printk("short jump at: %pS %p\n",
+ (void *)ip, (void *)ip);
return;
+ }
+ long_nops++;
/* We are initializing from the default nop */
if (unlikely(memcmp(ip, default_nop, 5) != 0))
bug_at(ip, __LINE__);
@@ -154,7 +162,7 @@ __init_or_module void arch_jump_label_tr
if (jlstate == JL_STATE_START) {
const unsigned char *ideal_nop = ideal_nops[NOP_ATOMIC5];
- if (memcmp(ideal_nop, default_nop, 5) != 0)
+ if (1 || memcmp(ideal_nop, default_nop, 5) != 0)
jlstate = JL_STATE_UPDATE;
else
jlstate = JL_STATE_NO_UPDATE;
@@ -162,4 +170,11 @@ __init_or_module void arch_jump_label_tr
if (jlstate == JL_STATE_UPDATE)
__jump_label_transform(entry, type, text_poke_early, 1);
}
+
+static __init int output_jumps(void)
+{
+ printk("short jumps: %d\n", short_nops);
+ printk(" long jumps: %d\n", long_nops);
+}
+late_initcall(output_jumps);
#endif
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists