tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: memcpy of struct buf, or similar?



On Sat, Jun 07, 2008 at 11:01:06PM +0100, ad%NetBSD.org@localhost wrote:
> On Sat, Jun 07, 2008 at 10:18:22PM +0100, Andrew Doran wrote:
> 
> > Does anyone know a point in the file system code, or ATA code, where outside
> > of vfs_bio.c we issue memcpy() on a buffer, assign to it or copy it another
> > way, or clear any part of it with memset()?
> > 
> > I am trying to fix PR 38761. Threads get stuck in biowait. The buffer always
> > has DONE set on it and has a waiter, but the waiter is stuck on the condvar.
> > It's on the sleep queue and it looks like no attempt has been made to wake
> > it up. The last time I saw this was in the tty code, and something was doing
> > memcpy() on clists.
> 
> I made biowait look like this:
> 
> int
> biowait(buf_t *bp)
> {
> 
>         KASSERT(ISSET(bp->b_cflags, BC_BUSY));
>         KASSERT(bp->b_refcnt > 0);
> 
>         mutex_enter(bp->b_objlock);
>         bp->b_oflags |= 0x80000000;
>         while (!ISSET(bp->b_oflags, BO_DONE | BO_DELWRI))
>                 cv_wait(&bp->b_done, bp->b_objlock);
>         bp->b_oflags &= ~0x80000000;
>         mutex_exit(bp->b_objlock);
> 
>         return bp->b_error;
> }
> 
> And changed the sync I/O case in biodone2 to do this:
> 
>         } else {
>                 /* Otherwise just wake up waiters in biowait(). */
>                 if ((bp->b_oflags & 0x80000000) != 0)
>                         KASSERT(cv_has_waiters(&bp->b_done));
>                 cv_broadcast(&bp->b_done);
>                 mutex_exit(bp->b_objlock);
>         }
> 
> And the assertion fires. So there is a waiter on the buffer, but it looks
> like something has clobbered the condition variable. biodone2() is being
> called from a soft interrupt so biodone() must have been called from
> interrupt context.

Do you have a way to know the underlying device the I/O was on ?

-- 
Manuel Bouyer <bouyer%antioche.eu.org@localhost>
     NetBSD: 26 ans d'experience feront toujours la difference
--


Home | Main Index | Thread Index | Old Index