diff options
author | Steven Rostedt <rostedt@goodmis.org> | 2012-03-26 12:50:52 +1030 |
---|---|---|
committer | Rusty Russell <rusty@rustcorp.com.au> | 2012-03-26 12:50:52 +1030 |
commit | d53799be6758841e1ffb1fd3780f73d0ffe44432 (patch) | |
tree | aad25045e0bcfe4b4e612d09a0c3abe3beb7e761 /kernel | |
parent | 026cee0086fe1df4cf74691cf273062cc769617d (diff) | |
download | op-kernel-dev-d53799be6758841e1ffb1fd3780f73d0ffe44432.zip op-kernel-dev-d53799be6758841e1ffb1fd3780f73d0ffe44432.tar.gz |
module: move __module_get and try_module_get() out of line.
With the preempt, tracepoint and everything, it's getting a bit
chubby. For an Ubuntu-based config:
Before:
$ size -t `find * -name '*.ko'` | grep TOTAL
56199906 3870760 1606616 61677282 3ad1ee2 (TOTALS)
$ size vmlinux
text data bss dec hex filename
8509342 850368 3358720 12718430 c2115e vmlinux
After:
$ size -t `find * -name '*.ko'` | grep TOTAL
56183760 3867892 1606616 61658268 3acd49c (TOTALS)
$ size vmlinux
text data bss dec hex filename
8501842 849088 3358720 12709650 c1ef12 vmlinux
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Acked-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> (made all out-of-line)
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/module.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/kernel/module.c b/kernel/module.c index 6f6651a..294692d 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -904,6 +904,36 @@ static ssize_t show_refcnt(struct module_attribute *mattr, static struct module_attribute modinfo_refcnt = __ATTR(refcnt, 0444, show_refcnt, NULL); +void __module_get(struct module *module) +{ + if (module) { + preempt_disable(); + __this_cpu_inc(module->refptr->incs); + trace_module_get(module, _RET_IP_); + preempt_enable(); + } +} +EXPORT_SYMBOL(__module_get); + +bool try_module_get(struct module *module) +{ + bool ret = true; + + if (module) { + preempt_disable(); + + if (likely(module_is_live(module))) { + __this_cpu_inc(module->refptr->incs); + trace_module_get(module, _RET_IP_); + } else + ret = false; + + preempt_enable(); + } + return ret; +} +EXPORT_SYMBOL(try_module_get); + void module_put(struct module *module) { if (module) { |