Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 01 Jun 2002 10:32:28 -0400 (EDT)
From:      John Baldwin <jhb@FreeBSD.org>
To:        kai ouyang <oykai@msn.com>
Cc:        current@FreeBSD.org
Subject:   RE: Help!
Message-ID:  <XFMail.20020601103228.jhb@FreeBSD.org>
In-Reply-To: <OE1349FFf70DQLGJZGT0000e264@hotmail.com>

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

On 01-Jun-2002 kai ouyang wrote:
> Hi, everybody
>  I am working on transfer RaidFrame from FreeBSD4.x to FreeBSD5.0.  Scott Long has transfered
> RAIDFrame from NetBSD to FreeBSD 4.x.
> Now, I am transfering those codes to FreeBSD5.0. This is my first strolling in FreeBSD5.0 kernel.
>  Firstly, I transfered some codes based on the relationship of vinum and ccd between 4.x and 5.0.
> It could compile successfully.
>  Now when I boot the box, the system tell me:
>  panic: sleeping without a mutex
>  Debugger("panic")
> Stopped at Debugger+0x40: xorl %eax,%eax
> 
> I traced the source code and found some information as follow:
> These is a function on RAIDFrame in the FreeBSD4.x .
> static __inline int
> RF_LTSLEEP(void *cond, int pri, const char *text, int time, struct simplelock *mutex)
> {
>  int ret;
>  if (mutex != NULL)
>   simple_unlock(mutex);
>  ret = tsleep(cond, pri, text, time);
>  if (mutex != NULL)
>   simple_lock(mutex);
>  return (ret);
> }
> 
> These is the above funtion I modifed to support FreeBSD5.0:
> static __inline int
> RF_LTSLEEP(void *cond, int pri, const char *text, int time, struct mtx *mutex)
> {
>  int ret;
>  if (mutex != NULL)
>   mtx_unlock(mutex);
>  ret = tsleep(cond, pri, text, time);
>  if (mutex != NULL)
>   mtx_lock(mutex);
>  return (ret);
> }
> 
> I have a clear ideal to use mtx.  
> I think there are maybe some problem in using the mtx.
> Thank you very much!

Use msleep instead of tsleep so it properly interlocks to avoid lost wakeups, thus:

static __inline int
RF_LTSLEEP(void *cond, int pri, const char *text, into time, struct mtx *mutex)
{
        return (msleep(cond, mutex, pri, text, time);
}

or better yet:

#define RF_LTSLEEP(cond, pri, text, time, mtx)  msleep((cond), (mtx), (pri), (text), (time))

-- 

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

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message




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