Commit d5db139a authored by Rusty Russell's avatar Rusty Russell

module: make module_refcount() a signed integer.

James Bottomley points out that it will be -1 during unload.  It's
only used for diagnostics, so let's not hide that as it could be a
clue as to what's gone wrong.

Cc: Jason Wessel <jason.wessel@windriver.com>
Acked-and-documention-added-by: default avatarJames Bottomley <James.Bottomley@HansenPartnership.com>
Reviewed-by: default avatarMasami Hiramatsu <maasami.hiramatsu.pt@hitachi.com>
Signed-off-by: default avatarRusty Russell <rusty@rustcorp.com.au>
parent c7496379
...@@ -444,7 +444,7 @@ extern void __module_put_and_exit(struct module *mod, long code) ...@@ -444,7 +444,7 @@ extern void __module_put_and_exit(struct module *mod, long code)
#define module_put_and_exit(code) __module_put_and_exit(THIS_MODULE, code) #define module_put_and_exit(code) __module_put_and_exit(THIS_MODULE, code)
#ifdef CONFIG_MODULE_UNLOAD #ifdef CONFIG_MODULE_UNLOAD
unsigned long module_refcount(struct module *mod); int module_refcount(struct module *mod);
void __symbol_put(const char *symbol); void __symbol_put(const char *symbol);
#define symbol_put(x) __symbol_put(VMLINUX_SYMBOL_STR(x)) #define symbol_put(x) __symbol_put(VMLINUX_SYMBOL_STR(x))
void symbol_put_addr(void *addr); void symbol_put_addr(void *addr);
......
...@@ -1979,7 +1979,7 @@ static int kdb_lsmod(int argc, const char **argv) ...@@ -1979,7 +1979,7 @@ static int kdb_lsmod(int argc, const char **argv)
kdb_printf("%-20s%8u 0x%p ", mod->name, kdb_printf("%-20s%8u 0x%p ", mod->name,
mod->core_size, (void *)mod); mod->core_size, (void *)mod);
#ifdef CONFIG_MODULE_UNLOAD #ifdef CONFIG_MODULE_UNLOAD
kdb_printf("%4ld ", module_refcount(mod)); kdb_printf("%4d ", module_refcount(mod));
#endif #endif
if (mod->state == MODULE_STATE_GOING) if (mod->state == MODULE_STATE_GOING)
kdb_printf(" (Unloading)"); kdb_printf(" (Unloading)");
......
...@@ -772,9 +772,18 @@ static int try_stop_module(struct module *mod, int flags, int *forced) ...@@ -772,9 +772,18 @@ static int try_stop_module(struct module *mod, int flags, int *forced)
return 0; return 0;
} }
unsigned long module_refcount(struct module *mod) /**
* module_refcount - return the refcount or -1 if unloading
*
* @mod: the module we're checking
*
* Returns:
* -1 if the module is in the process of unloading
* otherwise the number of references in the kernel to the module
*/
int module_refcount(struct module *mod)
{ {
return (unsigned long)atomic_read(&mod->refcnt) - MODULE_REF_BASE; return atomic_read(&mod->refcnt) - MODULE_REF_BASE;
} }
EXPORT_SYMBOL(module_refcount); EXPORT_SYMBOL(module_refcount);
...@@ -856,7 +865,7 @@ static inline void print_unload_info(struct seq_file *m, struct module *mod) ...@@ -856,7 +865,7 @@ static inline void print_unload_info(struct seq_file *m, struct module *mod)
struct module_use *use; struct module_use *use;
int printed_something = 0; int printed_something = 0;
seq_printf(m, " %lu ", module_refcount(mod)); seq_printf(m, " %i ", module_refcount(mod));
/* /*
* Always include a trailing , so userspace can differentiate * Always include a trailing , so userspace can differentiate
...@@ -908,7 +917,7 @@ EXPORT_SYMBOL_GPL(symbol_put_addr); ...@@ -908,7 +917,7 @@ EXPORT_SYMBOL_GPL(symbol_put_addr);
static ssize_t show_refcnt(struct module_attribute *mattr, static ssize_t show_refcnt(struct module_attribute *mattr,
struct module_kobject *mk, char *buffer) struct module_kobject *mk, char *buffer)
{ {
return sprintf(buffer, "%lu\n", module_refcount(mk->mod)); return sprintf(buffer, "%i\n", module_refcount(mk->mod));
} }
static struct module_attribute modinfo_refcnt = static struct module_attribute modinfo_refcnt =
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment