diff options
| author | John Levon <levon@movementarian.org> | 2003-04-01 05:06:51 -0800 |
|---|---|---|
| committer | Linus Torvalds <torvalds@home.transmeta.com> | 2003-04-01 05:06:51 -0800 |
| commit | 84486c2e1356f503328271d8adbdba91d1ccfd68 (patch) | |
| tree | 221ff145f5cb54a234ec996d47111988327207bd /kernel | |
| parent | d7f405c0fe5bdceda4e2b1be5eefec1605449050 (diff) | |
[PATCH] module load notification
This implements a simple notifier so oprofile can notice removed and
added modules properly
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/module.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/kernel/module.c b/kernel/module.c index 163e5c00e74c..f37abf4c1e1b 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -31,6 +31,7 @@ #include <linux/errno.h> #include <linux/err.h> #include <linux/vermagic.h> +#include <linux/notifier.h> #include <asm/uaccess.h> #include <asm/semaphore.h> #include <asm/pgalloc.h> @@ -59,6 +60,29 @@ static spinlock_t modlist_lock = SPIN_LOCK_UNLOCKED; static DECLARE_MUTEX(module_mutex); static LIST_HEAD(modules); +static DECLARE_MUTEX(notify_mutex); +static struct notifier_block * module_notify_list; + +int register_module_notifier(struct notifier_block * nb) +{ + int err; + down(¬ify_mutex); + err = notifier_chain_register(&module_notify_list, nb); + up(¬ify_mutex); + return err; +} +EXPORT_SYMBOL(register_module_notifier); + +int unregister_module_notifier(struct notifier_block * nb) +{ + int err; + down(¬ify_mutex); + err = notifier_chain_unregister(&module_notify_list, nb); + up(¬ify_mutex); + return err; +} +EXPORT_SYMBOL(unregister_module_notifier); + /* We require a truly strong try_module_get() */ static inline int strong_try_module_get(struct module *mod) { @@ -1373,6 +1397,10 @@ sys_init_module(void *umod, /* Drop lock so they can recurse */ up(&module_mutex); + down(¬ify_mutex); + notifier_call_chain(&module_notify_list, MODULE_STATE_COMING, mod); + up(¬ify_mutex); + /* Start the module */ ret = mod->init(); if (ret < 0) { |
