Date: Mon, 3 Jun 2002 11:30:40 +0800 From: "kai ouyang" <oykai@msn.com> To: "John Baldwin" <jhb@FreeBSD.org>, <current@FreeBSD.org> Subject: Re:Help: from proc to thread? Message-ID: <OE73usjzpDr3Di32AvJ00011357@hotmail.com>
index | next in thread | raw e-mail
[-- Attachment #1 --]
[-- Attachment #2 --]
>> Based on the explain of the thread: struct proc *td_proc; /* Associated process. */ in the struct
>> thread.
>> and refer to the CCD code.
>> I modify this function as following:
>> int raidlookup(path, td, vpp)
>> char *path;
>> struct thread *td;
>> struct vnode **vpp; /* result */
>> {
>> struct nameidata nd;
>> struct vnode *vp;
>> struct vattr va;
>> struct proc *p;
>> int error, flags;
>> /* Sanity check the p_fd fields. This is really just a hack */
>> p = td->td_proc;
>So it dies here?
>> Now the system will be crash , when it excutes the "p = td->td_proc".
>> the system Information is :
>> kernel: type 12 trap, code=0
>> Stopped at raidlookup+0x19: movl 0(%eax),%ebx
>Hmm, can you get the 'faulting va (virtual address)' error message that it
>prints out?
>Add a line to the beginning of the function as a sanity check that does:
>KASSERT(td != NULL, "thread is null");
>and compile your kernel with invariants and see if it panics with
>"thread is null".
Yeah, thread is NULL.
But I view all the callers, I did not find any assignment to td.
I do not know the kernel how assign td to the structure.
The RAIDFrame has the similar function as the vinum. I find this problem
when I config a RAID level volume.
Now, I check the raidctlioctl() function,because the process is here from user space to
kernel space.
Because the raidlookup's td is gotten from raidctlioctl() function.
I add the two line to the latter function.
KASSERT(td != NULL, ("raidctlioctl thread is NULL"));
KASSERT(raidPtr->engine_thread != NULL, ("raidctlioctl engine thread is NULL"));
It debugs in the second line. So, the raidctlioctl funcion has the td, but didn't
transfer the parameter to the raidlookup().
Hmmmm....
I take place the two line by the following lines:
KASSERT(td != NULL, ("raidctlioctl thread is NULL"));
raidPtr->engine_thread = td;
KASSERT(raidPtr->engine_thread != NULL, ("raidctlioctl engine thread is NULL"));
now it pass.
I want to know when the kernel assign td to raidctlioctl function?
Now, the RAIDFrame will be crash here:
RF_THREADGROUP_WAIT_START(&raidPtr->engine_tg);
panic: runq_choose: process 218(raid) in state 3
Debugger("panic")
Stopped at Debugger+0x40: xorl %eax,%eax
raidPtr->engine_tg is the RF_ThreadGroup_s structure.
struct RF_ThreadGroup_s {
int created;
int running;
int shutdown;
struct mtx mutex;
int cond;
};
/*
* Wait for all threads to start running
*/
#define RF_THREADGROUP_WAIT_START(_g_) { \
mtx_lock(&(_g_)->mutex); \
while((_g_)->running < (_g_)->created) { \
RF_LTSLEEP(&((_g_)->cond), PRIBIO, "rfwcond", 0, &((_g_)->mutex)); \
} \
mtx_unlock(&(_g_)->mutex); \
}
RF_LTSLEEP(void *cond, int pri, const char *text, int time, struct mtx *mutex)
{
return (msleep(cond, mutex, pri, text, time));
}
I man mtx_lock and find it excute after mtx_init().
help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?OE73usjzpDr3Di32AvJ00011357>
