On Thu, Apr 13, 2006 at 08:10:35PM +0100, Paulo Marques wrote: > tyler@agat.net wrote: > > > >+/* Test if a module is loaded : must hold module_mutex */ > >+inline int is_loaded(const char *module_name) > >+{ > >+ struct module *mod = find_module(module_name); > >+ > >+ if (!mod) > >+ return 1; For sure it is. Sorry, my mistake :) diff -uprN -X linux-2.6.16.5/Documentation/dontdiff linux-2.6.16.5/include/linux/module.h linux-2.6.16.5-tyler/include/linux/module.h --- linux-2.6.16.5/include/linux/module.h 2006-04-13 20:03:16.000000000 +0200 +++ linux-2.6.16.5-tyler/include/linux/module.h 2006-04-13 20:24:39.000000000 +0200 @@ -339,6 +339,19 @@ unsigned long module_kallsyms_lookup_nam int is_exported(const char *name, const struct module *mod); +/* Test if a module is loaded : must hold module_mutex */ +inline int is_loaded(const char *module_name) +{ + struct module *mod = find_module(module_name); + + if (!mod) + return 0; + + return 1; +} + + + extern void __module_put_and_exit(struct module *mod, long code) __attribute__((noreturn)); #define module_put_and_exit(code) __module_put_and_exit(THIS_MODULE, code); diff -uprN -X linux-2.6.16.5/Documentation/dontdiff linux-2.6.16.5/kernel/kmod.c linux-2.6.16.5-tyler/kernel/kmod.c --- linux-2.6.16.5/kernel/kmod.c 2006-04-13 20:03:16.000000000 +0200 +++ linux-2.6.16.5-tyler/kernel/kmod.c 2006-04-13 20:22:28.000000000 +0200 @@ -37,6 +37,7 @@ #include #include #include +#include extern int max_threads; @@ -48,6 +49,7 @@ static struct workqueue_struct *khelper_ modprobe_path is set via /proc/sys. */ char modprobe_path[KMOD_PATH_LEN] = "/sbin/modprobe"; +extern spinlock_t modlist_lock; /** * request_module - try to load a kernel module @@ -77,6 +79,7 @@ int request_module(const char *fmt, ...) static atomic_t kmod_concurrent = ATOMIC_INIT(0); #define MAX_KMOD_CONCURRENT 50 /* Completely arbitrary value - KAO */ static int kmod_loop_msg; + unsigned long flags; va_start(args, fmt); ret = vsnprintf(module_name, MODULE_NAME_LEN, fmt, args); @@ -84,6 +87,16 @@ int request_module(const char *fmt, ...) if (ret >= MODULE_NAME_LEN) return -ENAMETOOLONG; + /* We don't to load the module if it's already loaded */ + spin_lock_irqsave(&modlist_lock, flags); + if (is_loaded(module_name)) { + spin_unlock_irqrestore(&modlist_lock, flags); + return -EEXIST; + } + spin_unlock_irqrestore(&modlist_lock, flags); + + + /* If modprobe needs a service that is in a module, we get a recursive * loop. Limit the number of running kmod threads to max_threads/2 or * MAX_KMOD_CONCURRENT, whichever is the smaller. A cleaner method ___________________________________________________________________________ Faites de Yahoo! votre page d'accueil sur le web pour retrouver directement vos services préférés : vérifiez vos nouveaux mails, lancez vos recherches et suivez l'actualité en temps réel. Rendez-vous sur http://fr.yahoo.com/set