regmap: merge regmap_update_bits_check() into macro
[deliverable/linux.git] / include / linux / module.h
index 3a19c79918e02d37c3e77ed32a88eb9f36bb16c3..4560d8f1545d2cec7e6da19da460fff26151c105 100644 (file)
@@ -302,6 +302,28 @@ struct mod_tree_node {
        struct latch_tree_node node;
 };
 
+struct module_layout {
+       /* The actual code + data. */
+       void *base;
+       /* Total size. */
+       unsigned int size;
+       /* The size of the executable code.  */
+       unsigned int text_size;
+       /* Size of RO section of the module (text+rodata) */
+       unsigned int ro_size;
+
+#ifdef CONFIG_MODULES_TREE_LOOKUP
+       struct mod_tree_node mtn;
+#endif
+};
+
+#ifdef CONFIG_MODULES_TREE_LOOKUP
+/* Only touch one cacheline for common rbtree-for-core-layout case. */
+#define __module_layout_align ____cacheline_aligned
+#else
+#define __module_layout_align
+#endif
+
 struct module {
        enum module_state state;
 
@@ -366,37 +388,9 @@ struct module {
        /* Startup function. */
        int (*init)(void);
 
-       /*
-        * If this is non-NULL, vfree() after init() returns.
-        *
-        * Cacheline align here, such that:
-        *   module_init, module_core, init_size, core_size,
-        *   init_text_size, core_text_size and mtn_core::{mod,node[0]}
-        * are on the same cacheline.
-        */
-       void *module_init       ____cacheline_aligned;
-
-       /* Here is the actual code + data, vfree'd on unload. */
-       void *module_core;
-
-       /* Here are the sizes of the init and core sections */
-       unsigned int init_size, core_size;
-
-       /* The size of the executable code in each section.  */
-       unsigned int init_text_size, core_text_size;
-
-#ifdef CONFIG_MODULES_TREE_LOOKUP
-       /*
-        * We want mtn_core::{mod,node[0]} to be in the same cacheline as the
-        * above entries such that a regular lookup will only touch one
-        * cacheline.
-        */
-       struct mod_tree_node    mtn_core;
-       struct mod_tree_node    mtn_init;
-#endif
-
-       /* Size of RO sections of the module (text+rodata) */
-       unsigned int init_ro_size, core_ro_size;
+       /* Core layout: rbtree is accessed frequently, so keep together. */
+       struct module_layout core_layout __module_layout_align;
+       struct module_layout init_layout;
 
        /* Arch-specific module values */
        struct mod_arch_specific arch;
@@ -505,15 +499,15 @@ bool is_module_text_address(unsigned long addr);
 static inline bool within_module_core(unsigned long addr,
                                      const struct module *mod)
 {
-       return (unsigned long)mod->module_core <= addr &&
-              addr < (unsigned long)mod->module_core + mod->core_size;
+       return (unsigned long)mod->core_layout.base <= addr &&
+              addr < (unsigned long)mod->core_layout.base + mod->core_layout.size;
 }
 
 static inline bool within_module_init(unsigned long addr,
                                      const struct module *mod)
 {
-       return (unsigned long)mod->module_init <= addr &&
-              addr < (unsigned long)mod->module_init + mod->init_size;
+       return (unsigned long)mod->init_layout.base <= addr &&
+              addr < (unsigned long)mod->init_layout.base + mod->init_layout.size;
 }
 
 static inline bool within_module(unsigned long addr, const struct module *mod)
@@ -768,9 +762,13 @@ extern int module_sysfs_initialized;
 #ifdef CONFIG_DEBUG_SET_MODULE_RONX
 extern void set_all_modules_text_rw(void);
 extern void set_all_modules_text_ro(void);
+extern void module_enable_ro(const struct module *mod);
+extern void module_disable_ro(const struct module *mod);
 #else
 static inline void set_all_modules_text_rw(void) { }
 static inline void set_all_modules_text_ro(void) { }
+static inline void module_enable_ro(const struct module *mod) { }
+static inline void module_disable_ro(const struct module *mod) { }
 #endif
 
 #ifdef CONFIG_GENERIC_BUG
This page took 0.030967 seconds and 5 git commands to generate.