Messages in this thread | | | Subject | Need ack from sparc maintainer (was: [PATCH 1/4] jump label: introduce static_branch() interface) | From | Steven Rostedt <> | Date | Wed, 16 Mar 2011 16:06:13 -0400 |
| |
On Wed, 2011-03-16 at 15:58 -0400, Jason Baron wrote: > Introduce: > > static __always_inline bool static_branch(struct jump_label_key *key); > > instead of the old JUMP_LABEL(key, label) macro. > > In this way, jump labels become really easy to use: > > Define: > > struct jump_label_key jump_key; > > Can be used as: > > if (static_branch(&jump_key)) > do unlikely code > > enable/disale via: > > jump_label_inc(&jump_key); > jump_label_dec(&jump_key); > > that's it! > > For the jump labels disabled case, the static_branch() becomes an > atomic_read(), and jump_label_inc()/dec() are simply atomic_inc(), > atomic_dec() operations. We show testing results for this change below. > > Thanks to H. Peter Anvin for suggesting the 'static_branch()' construct. > > Since we now require a 'struct jump_label_key *key', we can store a pointer into > the jump table addresses. In this way, we can enable/disable jump labels, in > basically constant time. This change allows us to completely remove the previous > hashtable scheme. Thanks to Peter Zijlstra for this re-write. > > Testing: > > I ran a series of 'tbench 20' runs 5 times (with reboots) for 3 > configurations, where tracepoints were disabled. > > jump label configured in > avg: 815.6 > > jump label *not* configured in (using atomic reads) > avg: 800.1 > > jump label *not* configured in (regular reads) > avg: 803.4 > > > Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> > Signed-off-by: Jason Baron <jbaron@redhat.com> > Suggested-by: H. Peter Anvin <hpa@linux.intel.com> > Tested-by: David Daney <ddaney@caviumnetworks.com> > Acked-by: Ralf Baechle <ralf@linux-mips.org> > --- > arch/mips/include/asm/jump_label.h | 22 +- > arch/sparc/include/asm/jump_label.h | 25 +-
Hi David,
Can you give your Acked-by for this change.
Thanks,
-- Steve
> arch/x86/include/asm/alternative.h | 3 +- > arch/x86/include/asm/jump_label.h | 26 +- > arch/x86/kernel/alternative.c | 2 +- > arch/x86/kernel/module.c | 1 + > include/asm-generic/vmlinux.lds.h | 14 +- > include/linux/dynamic_debug.h | 2 - > include/linux/jump_label.h | 89 ++++--- > include/linux/jump_label_ref.h | 44 --- > include/linux/perf_event.h | 26 +- > include/linux/tracepoint.h | 22 +- > kernel/jump_label.c | 539 ++++++++++++++--------------------- > kernel/perf_event.c | 4 +- > kernel/tracepoint.c | 23 +- > 15 files changed, 356 insertions(+), 486 deletions(-) > delete mode 100644 include/linux/jump_label_ref.h >
> diff --git a/arch/sparc/include/asm/jump_label.h b/arch/sparc/include/asm/jump_label.h > index 427d468..fc73a82 100644 > --- a/arch/sparc/include/asm/jump_label.h > +++ b/arch/sparc/include/asm/jump_label.h > @@ -7,17 +7,20 @@ > > #define JUMP_LABEL_NOP_SIZE 4 > > -#define JUMP_LABEL(key, label) \ > - do { \ > - asm goto("1:\n\t" \ > - "nop\n\t" \ > - "nop\n\t" \ > - ".pushsection __jump_table, \"a\"\n\t"\ > - ".align 4\n\t" \ > - ".word 1b, %l[" #label "], %c0\n\t" \ > - ".popsection \n\t" \ > - : : "i" (key) : : label);\ > - } while (0) > +static __always_inline bool arch_static_branch(struct jump_label_key *key) > +{ > + asm goto("1:\n\t" > + "nop\n\t" > + "nop\n\t" > + ".pushsection __jump_table, \"aw\"\n\t" > + ".align 4\n\t" > + ".word 1b, %l[l_yes], %c0\n\t" > + ".popsection \n\t" > + : : "i" (key) : : l_yes); > + return false; > +l_yes: > + return true; > +} >
| |