Messages in this thread Patch in this message | | | From | Michal Hocko <> | Subject | [RFC PATCH v2 1/5] jump_label: split out declaration parts into its own headers | Date | Fri, 9 Oct 2020 14:29:22 +0200 |
| |
From: Michal Hocko <mhocko@suse.com>
Follow up patch would like to add a static key into kernel.h and that requires a declaration of the key in the same file. Including jump_label.h into kernel.h is not possible due to headers dependencies.
Separate parts needed for declaration into its own header which doesn't depend on any other header file. kernel.h can include jump_abel_type.h.
Signed-off-by: Michal Hocko <mhocko@suse.com> --- include/linux/jump_label.h | 44 +---------------------------- include/linux/jump_label_type.h | 49 +++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 43 deletions(-) create mode 100644 include/linux/jump_label_type.h
diff --git a/include/linux/jump_label.h b/include/linux/jump_label.h index 32809624d422..bd0d846d0bde 100644 --- a/include/linux/jump_label.h +++ b/include/linux/jump_label.h @@ -75,6 +75,7 @@ #include <linux/types.h> #include <linux/compiler.h> +#include <linux/jump_label_type.h> extern bool static_key_initialized; @@ -82,35 +83,6 @@ extern bool static_key_initialized; "%s(): static key '%pS' used before call to jump_label_init()", \ __func__, (key)) -#ifdef CONFIG_JUMP_LABEL - -struct static_key { - atomic_t enabled; -/* - * Note: - * To make anonymous unions work with old compilers, the static - * initialization of them requires brackets. This creates a dependency - * on the order of the struct with the initializers. If any fields - * are added, STATIC_KEY_INIT_TRUE and STATIC_KEY_INIT_FALSE may need - * to be modified. - * - * bit 0 => 1 if key is initially true - * 0 if initially false - * bit 1 => 1 if points to struct static_key_mod - * 0 if points to struct jump_entry - */ - union { - unsigned long type; - struct jump_entry *entries; - struct static_key_mod *next; - }; -}; - -#else -struct static_key { - atomic_t enabled; -}; -#endif /* CONFIG_JUMP_LABEL */ #endif /* __ASSEMBLY__ */ #ifdef CONFIG_JUMP_LABEL @@ -343,14 +315,6 @@ static inline void static_key_disable(struct static_key *key) * All the below code is macros in order to play type games. */ -struct static_key_true { - struct static_key key; -}; - -struct static_key_false { - struct static_key key; -}; - #define STATIC_KEY_TRUE_INIT (struct static_key_true) { .key = STATIC_KEY_INIT_TRUE, } #define STATIC_KEY_FALSE_INIT (struct static_key_false){ .key = STATIC_KEY_INIT_FALSE, } @@ -360,18 +324,12 @@ struct static_key_false { #define DEFINE_STATIC_KEY_TRUE_RO(name) \ struct static_key_true name __ro_after_init = STATIC_KEY_TRUE_INIT -#define DECLARE_STATIC_KEY_TRUE(name) \ - extern struct static_key_true name - #define DEFINE_STATIC_KEY_FALSE(name) \ struct static_key_false name = STATIC_KEY_FALSE_INIT #define DEFINE_STATIC_KEY_FALSE_RO(name) \ struct static_key_false name __ro_after_init = STATIC_KEY_FALSE_INIT -#define DECLARE_STATIC_KEY_FALSE(name) \ - extern struct static_key_false name - #define DEFINE_STATIC_KEY_ARRAY_TRUE(name, count) \ struct static_key_true name[count] = { \ [0 ... (count) - 1] = STATIC_KEY_TRUE_INIT, \ diff --git a/include/linux/jump_label_type.h b/include/linux/jump_label_type.h new file mode 100644 index 000000000000..37cb02c12f35 --- /dev/null +++ b/include/linux/jump_label_type.h @@ -0,0 +1,49 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _LINUX_JUMP_LABEL_TYPE_H +#define _LINUX_JUMP_LABEL_TYPE_H + +#ifdef CONFIG_JUMP_LABEL + +struct static_key { + atomic_t enabled; +/* + * Note: + * To make anonymous unions work with old compilers, the static + * initialization of them requires brackets. This creates a dependency + * on the order of the struct with the initializers. If any fields + * are added, STATIC_KEY_INIT_TRUE and STATIC_KEY_INIT_FALSE may need + * to be modified. + * + * bit 0 => 1 if key is initially true + * 0 if initially false + * bit 1 => 1 if points to struct static_key_mod + * 0 if points to struct jump_entry + */ + union { + unsigned long type; + struct jump_entry *entries; + struct static_key_mod *next; + }; +}; + +#else +struct static_key { + atomic_t enabled; +}; +#endif /* CONFIG_JUMP_LABEL */ + +struct static_key_true { + struct static_key key; +}; + +struct static_key_false { + struct static_key key; +}; + +#define DECLARE_STATIC_KEY_TRUE(name) \ + extern struct static_key_true name + +#define DECLARE_STATIC_KEY_FALSE(name) \ + extern struct static_key_false name + +#endif /* _LINUX_JUMP_LABEL_TYPE_H */ -- 2.28.0
| |