lkml.org 
[lkml]   [2011]   [Mar]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
SubjectNeed ack from sparc maintainer (was: [PATCH 1/4] jump label: introduce static_branch() interface)
From
Date
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;
> +}
>




\
 
 \ /
  Last update: 2011-03-16 21:09    [W:0.174 / U:0.496 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site