diff options
| author | Ingo Molnar <mingo@elte.hu> | 2012-02-24 08:31:31 +0100 | 
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2012-02-24 10:05:59 +0100 | 
| commit | c5905afb0ee6550b42c49213da1c22d67316c194 (patch) | |
| tree | 253fdb322e6e5b257ffda3b9b66bce90a473a6f7 /include/linux/tracepoint.h | |
| parent | 1cfa60dc7d7c7cc774a44eee47ff135a644a1f31 (diff) | |
| download | olio-linux-3.10-c5905afb0ee6550b42c49213da1c22d67316c194.tar.xz olio-linux-3.10-c5905afb0ee6550b42c49213da1c22d67316c194.zip  | |
static keys: Introduce 'struct static_key', static_key_true()/false() and static_key_slow_[inc|dec]()
So here's a boot tested patch on top of Jason's series that does
all the cleanups I talked about and turns jump labels into a
more intuitive to use facility. It should also address the
various misconceptions and confusions that surround jump labels.
Typical usage scenarios:
        #include <linux/static_key.h>
        struct static_key key = STATIC_KEY_INIT_TRUE;
        if (static_key_false(&key))
                do unlikely code
        else
                do likely code
Or:
        if (static_key_true(&key))
                do likely code
        else
                do unlikely code
The static key is modified via:
        static_key_slow_inc(&key);
        ...
        static_key_slow_dec(&key);
The 'slow' prefix makes it abundantly clear that this is an
expensive operation.
I've updated all in-kernel code to use this everywhere. Note
that I (intentionally) have not pushed through the rename
blindly through to the lowest levels: the actual jump-label
patching arch facility should be named like that, so we want to
decouple jump labels from the static-key facility a bit.
On non-jump-label enabled architectures static keys default to
likely()/unlikely() branches.
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Acked-by: Jason Baron <jbaron@redhat.com>
Acked-by: Steven Rostedt <rostedt@goodmis.org>
Cc: a.p.zijlstra@chello.nl
Cc: mathieu.desnoyers@efficios.com
Cc: davem@davemloft.net
Cc: ddaney.cavm@gmail.com
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Link: http://lkml.kernel.org/r/20120222085809.GA26397@elte.hu
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'include/linux/tracepoint.h')
| -rw-r--r-- | include/linux/tracepoint.h | 8 | 
1 files changed, 4 insertions, 4 deletions
diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h index fc36da97ff7..bd96ecd0e05 100644 --- a/include/linux/tracepoint.h +++ b/include/linux/tracepoint.h @@ -17,7 +17,7 @@  #include <linux/errno.h>  #include <linux/types.h>  #include <linux/rcupdate.h> -#include <linux/jump_label.h> +#include <linux/static_key.h>  struct module;  struct tracepoint; @@ -29,7 +29,7 @@ struct tracepoint_func {  struct tracepoint {  	const char *name;		/* Tracepoint name */ -	struct jump_label_key key; +	struct static_key key;  	void (*regfunc)(void);  	void (*unregfunc)(void);  	struct tracepoint_func __rcu *funcs; @@ -145,7 +145,7 @@ static inline void tracepoint_synchronize_unregister(void)  	extern struct tracepoint __tracepoint_##name;			\  	static inline void trace_##name(proto)				\  	{								\ -		if (static_branch(&__tracepoint_##name.key))		\ +		if (static_key_false(&__tracepoint_##name.key))		\  			__DO_TRACE(&__tracepoint_##name,		\  				TP_PROTO(data_proto),			\  				TP_ARGS(data_args),			\ @@ -188,7 +188,7 @@ static inline void tracepoint_synchronize_unregister(void)  	__attribute__((section("__tracepoints_strings"))) = #name;	 \  	struct tracepoint __tracepoint_##name				 \  	__attribute__((section("__tracepoints"))) =			 \ -		{ __tpstrtab_##name, JUMP_LABEL_INIT, reg, unreg, NULL };\ +		{ __tpstrtab_##name, STATIC_KEY_INIT_FALSE, reg, unreg, NULL };\  	static struct tracepoint * const __tracepoint_ptr_##name __used	 \  	__attribute__((section("__tracepoints_ptrs"))) =		 \  		&__tracepoint_##name;  |