panic by unlocking of mutex in KLD

Hans Petter Selasky hselasky at c2i.net
Mon Jan 12 06:58:08 PST 2009


On Monday 12 January 2009, Alexej Sokolov wrote:
> Hello,
>
> by unloading of folowing module  I have kernel panic.
>
> I would like to get any explanation about my mistake.
>
> #include <sys/param.h>
> #include <sys/module.h>
> #include <sys/kernel.h>
> #include <sys/systm.h>
> #include <sys/queue.h>
> #include <sys/kernel.h>
> #include <sys/kobj.h>
> #include <sys/malloc.h>
> #include <sys/types.h>
> #include <sys/lock.h>
> #include <sys/mutex.h>
>
>
> struct mtx my_mtx;
>
>
> /* Load handler */
> static int
> load(struct module *mod, int cmd, void *arg)
> {
>         int error = 0;
>         switch(cmd) {
>                 case MOD_LOAD:
>                         printf("Start! Addres of mutex = 0x%X \n",
> &my_mtx);
>                         mtx_init(&my_mtx, "My mutex name", "My mutex
> type", MTX_DEF);
>
>                         mtx_lock(&my_mtx);
>                         break;
>                 case MOD_UNLOAD:
>                         printf("Stop! Addres of mutex = 0x%X \n",
> &my_mtx);
>                         mtx_unlock(&my_mtx);
>                         break;
>                 default:
>                         error = EOPNOTSUPP;
>                         break;
>         }
>
>         return (error);
> }
>
> /* Module structure */
> static moduledata_t mod_data = {
>         "mymod",
>         load,
>         NULL
> };
> MODULE_VERSION (kld, 1);
> DECLARE_MODULE (kld, mod_data, SI_SUB_DRIVERS, SI_ORDER_MIDDLE);
>
>
> Thanx

Hi,

You cannot do like this. Remember, two different threads are doing the 
load/unload. The mutex is associated with a thread. Print out "curthread" 
aswell and you will see. The mutex can only be unlocked by the same thread 
that locked it.

--HPS


More information about the freebsd-hackers mailing list