From: Rusty Russell <rusty@rustcorp.com.au>
To: Jan Glauber <jang@linux.vnet.ibm.com>
Cc: LKML <linux-kernel@vger.kernel.org>,
Pavel Emelyanov <xemul@openvz.org>,
Andi Kleen <andi@firstfloor.org>,
Jon Masters <jonathan@jonmasters.org>
Subject: Re: [PATCH] module loader should not complain about unknown symbol
Date: Tue, 13 Nov 2007 13:52:22 +1100 [thread overview]
Message-ID: <200711131352.23244.rusty@rustcorp.com.au> (raw)
In-Reply-To: <200711130923.12616.rusty@rustcorp.com.au>
On Tuesday 13 November 2007 09:23:12 Rusty Russell wrote:
> Better might be to put in a waitqueue and wake it up whenever a module is
> deleted or changes status. Then use_module() can wait if
> strong_try_module_get() returns -EBUSY (up to 30 seconds, then print a
> warning and fail).
And here it is. Does it work for you Jan?
==
modules: wait for dependent modules doing init.
There have been reports of modules failing to load because the modules
they depend on are still loading. This changes the modules to wait
for a reasonable length of time in that case. We time out eventually,
because there can be module loops or broken modules.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
diff -r a38c2f5e95f8 kernel/module.c
--- a/kernel/module.c Tue Nov 13 09:06:30 2007 +1100
+++ b/kernel/module.c Tue Nov 13 13:45:46 2007 +1100
@@ -67,6 +67,9 @@ static DEFINE_MUTEX(module_mutex);
static DEFINE_MUTEX(module_mutex);
static LIST_HEAD(modules);
+/* Waiting for a module to finish initializing? */
+static DECLARE_WAIT_QUEUE_HEAD(module_wq);
+
static BLOCKING_NOTIFIER_HEAD(module_notify_list);
int register_module_notifier(struct notifier_block * nb)
@@ -86,8 +89,11 @@ static inline int strong_try_module_get(
static inline int strong_try_module_get(struct module *mod)
{
if (mod && mod->state == MODULE_STATE_COMING)
+ return -EBUSY;
+ if (try_module_get(mod))
return 0;
- return try_module_get(mod);
+ else
+ return -ENOENT;
}
static inline void add_taint_module(struct module *mod, unsigned flag)
@@ -539,11 +545,21 @@ static int use_module(struct module *a,
static int use_module(struct module *a, struct module *b)
{
struct module_use *use;
- int no_warn;
+ int no_warn, err;
if (b == NULL || already_uses(a, b)) return 1;
- if (!strong_try_module_get(b))
+ /* If we're interrupted or time out, we fail. */
+ if (wait_event_interruptible_timeout(
+ module_wq, (err = strong_try_module_get(b)) != -EBUSY,
+ 30 * HZ) <= 0) {
+ printk("%s: gave up waiting for init of module %s.\n",
+ a->name, b->name);
+ return 0;
+ }
+
+ /* If strong_try_module_get() returned a different error, we fail. */
+ if (err)
return 0;
DEBUGP("Allocating new usage for %s.\n", a->name);
@@ -814,7 +830,7 @@ static inline void module_unload_free(st
static inline int use_module(struct module *a, struct module *b)
{
- return strong_try_module_get(b);
+ return strong_try_module_get(b) == 0;
}
static inline void module_unload_init(struct module *mod)
@@ -1330,7 +1346,7 @@ void *__symbol_get(const char *symbol)
preempt_disable();
value = __find_symbol(symbol, &owner, &crc, 1);
- if (value && !strong_try_module_get(owner))
+ if (value && strong_try_module_get(owner) != 0)
value = 0;
preempt_enable();
@@ -2133,6 +2149,7 @@ sys_init_module(void __user *umod,
mutex_lock(&module_mutex);
free_module(mod);
mutex_unlock(&module_mutex);
+ wake_up(&module_wq);
return ret;
}
@@ -2147,6 +2164,7 @@ sys_init_module(void __user *umod,
mod->init_size = 0;
mod->init_text_size = 0;
mutex_unlock(&module_mutex);
+ wake_up(&module_wq);
return 0;
}
next prev parent reply other threads:[~2007-11-13 2:52 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-11-12 14:18 [PATCH] module loader should not complain about unknown symbol Jan Glauber
2007-11-12 16:59 ` Andi Kleen
2007-11-12 22:23 ` Rusty Russell
2007-11-13 2:52 ` Rusty Russell [this message]
2007-11-13 4:08 ` Peter Teoh
2007-11-13 4:40 ` Rusty Russell
2007-11-13 4:55 ` Jon Masters
2007-11-14 12:12 ` Jan Glauber
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200711131352.23244.rusty@rustcorp.com.au \
--to=rusty@rustcorp.com.au \
--cc=andi@firstfloor.org \
--cc=jang@linux.vnet.ibm.com \
--cc=jonathan@jonmasters.org \
--cc=linux-kernel@vger.kernel.org \
--cc=xemul@openvz.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox