Re: [PATCH] Kmod optimization

From: tyler
Date: Thu Apr 13 2006 - 14:36:35 EST


On Thu, Apr 13, 2006 at 11:24:01AM -0700, Greg KH wrote:
> On Thu, Apr 13, 2006 at 08:03:45PM +0200, tyler@xxxxxxxx wrote:
> > Hi,
> >
> > the request_mod functions try to load automatically a module by running
> > a user mode process helper (modprobe).
> >
> > The user process is launched even if the module is already loaded. I
> > think it would be better to test if the module is already loaded.
>
> Does this cause a problem somehow? request_mod is called _very_
> infrequently from a normal kernel these days, so I really don't think
> this is necessary.

Yes I agree it _should_ be very infrequently called but it _will_ be very
infrequently called just if the user space configuration is done properly.

I personnaly think we shouldn't trust the configuration and the way the
different modules are loaded.

Well anyway, I've corrected the patch regarding the advices of randy.

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 1;
+
+ return 0;
+}
+
+
+
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 <linux/kernel.h>
#include <linux/init.h>
#include <asm/uaccess.h>
+#include <linux/spinlock.h>

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
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/