module_register_init fails, but driver is still loaded?

Andriy Gapon avg at FreeBSD.org
Fri Aug 5 15:39:27 UTC 2011


on 05/08/2011 18:21 Sergey Kandaurov said the following:
> On 4 August 2011 20:23, Garrett Cooper <yanegomi at gmail.com> wrote:
>> Hi hackers,
>>    I noticed that if anything fails while initializing a driver, the
>> driver stays attached to the kernel as a module instead of being
>> kicked when all references to the driver go to 0. Is this desired
>> behavior (it doesn't seem like it, but I can see potential pros and
>> cons of kicking the driver out of the kernel immediately when a
>> failure state occurs)? I've seen this on 7.2 ~ 9-CURRENT. Example
>> sourcecode and invocation attached below.
> 
> Hi.
> I have cooked something that might work, though I don't know how much
> is it correct from locking & cleanup side. Can you try it? Anyway, in its
> current form we cannot return error from module_register_init() because
> it's usually called from SYSINIT, so kldload(8) will say nonsense:
> can't load ./bad_module.ko: No error: 0.

Have you also accounted for a situation where multiple logical modules shared the
same kernel loadable file?  Especially when some modules load successfully while
others fail.

> Index: sys/kern/kern_module.c
> ===================================================================
> --- sys/kern/kern_module.c      (revision 224471)
> +++ sys/kern/kern_module.c      (working copy)
> @@ -112,6 +117,7 @@ module_register_init(const void *arg)
>         const moduledata_t *data = (const moduledata_t *)arg;
>         int error;
>         module_t mod;
> +       linker_file_t lf;
> 
>         mtx_lock(&Giant);
>         MOD_SLOCK;
> @@ -123,12 +129,14 @@ module_register_init(const void *arg)
>         error = MOD_EVENT(mod, MOD_LOAD);
>         if (error) {
>                 MOD_EVENT(mod, MOD_UNLOAD);
> +               lf = mod->file;
>                 MOD_XLOCK;
>                 module_release(mod);
>                 MOD_XUNLOCK;
>                 printf("module_register_init: MOD_LOAD (%s, %p, %p) error"
>                     " %d\n", data->name, (void *)data->evhand, data->priv,
>                     error);
> +               linker_release_module(NULL, NULL, lf);
>         } else {
>                 MOD_XLOCK;
>                 if (mod->file) {
> 
> 


-- 
Andriy Gapon


More information about the freebsd-hackers mailing list