Skip site navigation (1)Skip section navigation (2)
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>