__try_module_get()
Subsystems (2)
PATCH 1/1 __try_module_get()
Linus, please apply.
Name: __try_module_get
Author: Rusty Russell
Status: Trivial
D: Introduces __try_module_get for places where we know we already hold
D: a reference and ignoring the fact that the module is being "rmmod --wait"ed
D: is simpler.
fs/filesystems.c +1 -11
@@ -32,17 +32,7 @@ static rwlock_t file_systems_lock = RW_L/* WARNING: This can be used only if we _already_ own a reference */ void get_filesystem (struct file_system_type *fs) { -if (!try_module_get (fs->owner)) { -#ifdef CONFIG_MODULE_UNLOAD -unsigned int cpu =get_cpu (); -local_inc (&fs->owner->ref[cpu].count); -put_cpu (); -#else -/* Getting filesystem while it's starting up? We're -already supposed to have a reference. */ -BUG (); -#endif - } +__try_module_get (fs->owner); }void put_filesystem (struct file_system_type *fs)
include/linux/module.h +19 -0
@@ -272,6 +272,7 @@ int module_text_address(unsigned long ad#ifdef CONFIG_MODULE_UNLOAD +unsigned int module_refcount (struct module *mod);void __symbol_put (const char *symbol);#define symbol_put (x) __symbol_put(MODULE_SYMBOL_PREFIX #x)void symbol_put_addr (void *addr);
@@ -282,6 +283,17 @@ void symbol_put_addr(void *addr);#define local_dec (x) atomic_dec(x)#endif +/* Sometimes we know we already have a refcount, and it's easier not +to handle the error case (which only happens with rmmod --wait). */ +static inline void __try_module_get (struct module *module) +{ +if (module) { +BUG_ON (module_refcount (module) ==0 ); +local_inc (&module->ref[get_cpu ()].count); +put_cpu (); + } +} +static inline int try_module_get (struct module *module) {int ret =1 ;
@@ -317,6 +329,9 @@ static inline int try_module_get(structstatic inline void module_put (struct module *module) { } +static inline void __try_module_get (struct module *module) +{ +}#define symbol_put (x) do { } while(0)#define symbol_put_addr (p) do { } while(0)
@@ -371,6 +386,10 @@ static inline int module_text_address(un#define symbol_put (x) do { } while(0)#define symbol_put_addr (x) do { } while(0) +static inline void __try_module_get (struct module *module) +{ +} +static inline int try_module_get (struct module *module) {return 1 ;
kernel/module.c +2 -1
@@ -374,7 +374,7 @@ static inline void restart_refcounts(voi }#endif -static unsigned int module_refcount (struct module *mod) +unsigned int module_refcount (struct module *mod) {unsigned int i, total =0 ;
@@ -382,6 +382,7 @@ static unsigned int module_refcount(stru total +=atomic_read (&mod->ref[i].count);return total; } +EXPORT_SYMBOL (module_refcount);/* This exists whether we can unload or not */ static void free_module (struct module *mod);
--
Anyone who quotes me in their sig is an idiot. -- Rusty Russell.