Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 31 Mar 2005 08:23:57 -0500
From:      John Baldwin <john@baldwin.cx>
To:        "dragonfly dragonfly" <dragonylffly@hotmail.com>
Cc:        freebsd-arch@freebsd.org
Subject:   Re: FreeBSD module inference count problem
Message-ID:  <f0341fd8b21d58d70709597bbbfda2bd@baldwin.cx>
In-Reply-To: <BAY19-F23ED19BA60458B19900181DE470@phx.gbl>
References:  <BAY19-F23ED19BA60458B19900181DE470@phx.gbl>

next in thread | previous in thread | raw e-mail | index | archive | help

On Mar 30, 2005, at 8:24 PM, dragonfly dragonfly wrote:

> Hi all, Recently I am doing some programming on FreeBSD KLD. In my KLD 
> codes,I will start some kernel threads to serve requests,but i can not 
> find how to increase the module reference count,something like 
> 'MOD_INC_USE_COUNT' in Linux.If not do so,if the user downloaded the 
> module before all kernel threads exit, the system must be panic.I 
> searched the file 'module.h' carefully,only find 
> module_reference().But it seemed in total kernel source,the function 
> does not be used.Even use it,when i use kldstat to see its reference 
> count,it keep __1__! When i download the module before the kernel 
> thread wake up, system panic as expect. my KLD codes like below: 
> module_t curmod; void do_job(void *arg) { if (!curmod) printf("Module 
> not found\n"); else module_reference(curmod); 
> tsleep(curproc,PRIBIO,"foo worker",15*hz); printf("Wake up\n"); if 
> (curmod) module_release(curmod); kthread_exit(0); } static int 
> foo_loader(struct module *m, int what, void *arg) { int err = 0; 
> struct proc *newpp;
> switch (what) { case MOD_LOAD: curmod=m; 
> kthread_create(do_job,NULL,&newpp,0,0,"foo worker"); printf("foo 
> loaded\n"); break; case MOD_UNLOAD: case MOD_SHUTDOWN: printf("foo 
> unloaded.\n"); break; default: err = EOPNOTSUPP; break; }
> return(err); } Could you help me? Thanks.

Right now you need to provide your own reference count and fail the 
operation with EBUSY when MOD_UNLOAD is called if you have open 
references.  You can also have MOD_UNLOAD wake up the kthread and 
instruct it to die and then block until the kthread has exited before 
it returns.  (You should do that anyway if you really need to unload 
this module to ensure that the kthread's code isn't unmapped out from 
under it while it is running.)

-- 

John Baldwin <jhb@FreeBSD.org>  <><  http://www.FreeBSD.org/~jhb/
"Power Users Use the Power to Serve"  =  http://www.FreeBSD.org



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?f0341fd8b21d58d70709597bbbfda2bd>