Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 11 Apr 2002 08:00:06 -0700 (PDT)
From:      "Richard S. Conto" <rsc@merit.edu>
To:        freebsd-bugs@FreeBSD.org
Subject:   Re: kern/36790: kernel panic in biodone() on boot (ATA related?)
Message-ID:  <200204111500.g3BF06m60496@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/36790; it has been noted by GNATS.

From: "Richard S. Conto" <rsc@merit.edu>
To: =?iso-8859-1?Q?S=F8ren?= Schmidt <sos@FreeBSD.org>
Cc: freebsd-gnats-submit@FreeBSD.org, rsc@merit.edu
Subject: Re: kern/36790: kernel panic in biodone() on boot (ATA related?)
Date: Thu, 11 Apr 2002 10:51:46 -0400

 S=F8ren
    I don't know if you've seen this PR, but I haven't been able
 to successfully boot a "current" FreeBSD-STABLE for some time now.
 I suspect this is related to the ATA work you've done recently, as
 the kernel panic occurs in a call to 'biodone()' from 'ad_interrupt()'
 in /sys/dev/ata/ata-disk.c (line 694).
 
 I haven't had time to trace this back further. If you have any suggestion=
 s
 for how I can provide more or better information, I'm quite willing to
 try.
 
 * $FreeBSD: src/sys/dev/ata/ata-disk.c,v 1.60.2.21 2002/03/25 21:42:47 so=
 s
 
 My technique for tracing things back was to:
 
 (*) Modify /sys/sys/buf.h () to change 'biodone()' from an
     entry point to a C-macro that calls "x_biodone(buf,__FILE__,__LINE)"
 
 (*) Modify /sys/kern/fvs_bio.c to change "biodone(struct *buf)" to
     "x_biodone(struct *buf, char *file, unsigned int lnum)" and change
     a few 'panic()' calls to add -- " at %s:%u", file, lnum --
 
 (*) Turn on kernel config option VFS_BIO_DEBUG
 
 (*) make buildworld, mergemaster, make installworld, etc.
 
 Unfortunately, my "technique" is very time consuming an takes about 8 hou=
 rs
 (elapsed time) on my laptop.
 
 diffs below:
 ----------------------------------------------------------
 
 * $FreeBSD: src/sys/sys/buf.h,v 1.88.2.7 2001/12/25 01:44:44 dillon
 
 % diff -c -b -w /sys/sys/buf.h.orig /sys/sys/buf.h
 *** /sys/sys/buf.h.orig Wed Apr 10 10:06:45 2002
 --- /sys/sys/buf.h      Wed Apr 10 10:09:18 2002
 ***************
 *** 500,506 ****
 --- 500,511 ----
   struct buf *getblk __P((struct vnode *, daddr_t, int, int, int));
   struct buf *geteblk __P((int));
   int   biowait __P((struct buf *));
 + #if 0
   void  biodone __P((struct buf *));
 + #else
 + void  x_biodone __P((struct buf *, char *file, unsigned int lnum));
 + #define biodone(buf) x_biodone(buf,__FILE__,__LINE__)
 + #endif
   =
 
   void  cluster_callback __P((struct buf *));
   int   cluster_read __P((struct vnode *, u_quad_t, daddr_t, long,
 ----------------------------------------------------------
 
 * $FreeBSD: src/sys/kern/vfs_bio.c,v 1.242.2.16 2002/04/03 17:11:13 dillo=
 n =
 
 
 % diff -c -b -w /sys/kern/vfs_bio.c.orig /sys/kern/vfs_bio.c
 *** /sys/kern/vfs_bio.c.orig    Mon Apr  8 14:32:40 2002
 --- /sys/kern/vfs_bio.c Wed Apr 10 10:15:03 2002
 ***************
 *** 2670,2683 ****
 --- 2670,2692 ----
    *    in the biodone routine.
    */
   void
 + #if 0
   biodone(register struct buf * bp)
 + #else
 + x_biodone(register struct buf * bp, char *file, unsigned int lnum)
 + #endif
   {
         int s, error;
   =
 
         s =3D splbio();
   =
 
 + #if 0
         KASSERT(BUF_REFCNT(bp) > 0, ("biodone: bp %p not busy %d", bp, BU=
 F_REFCNT(bp)));
         KASSERT(!(bp->b_flags & B_DONE), ("biodone: bp %p already done", =
 bp));
 + #else
 +       KASSERT(BUF_REFCNT(bp) > 0, ("biodone: bp %p not busy %d at %s:%u=
 ", bp, BUF_REFCNT(bp), file, lnum));
 +       KASSERT(!(bp->b_flags & B_DONE), ("biodone: bp %p already done at=
  %s:%u", bp, file, lnum));
 + #endif
   =
 
         bp->b_flags |=3D B_DONE;
         runningbufwakeup(bp);
 ***************
 *** 2714,2728 ****
 --- 2723,2752 ----
   =
 
   #if defined(VFS_BIO_DEBUG)
                 if (vp->v_usecount =3D=3D 0) {
 + #if 0
                         panic("biodone: zero vnode ref count");
 + #else
 +                       panic("biodone: zero vnode ref counti at %s:%u",
 +                               file, lnum);
 + #endif
                 }
   =
 
                 if (error) {
 + #if 0
                         panic("biodone: missing VM object");
 + #else
 +                       panic("biodone: missing VM object at %s:%u", file=
 ,
 +                               lnum);
 + #endif
                 }
   =
 
                 if ((vp->v_flag & VOBJBUF) =3D=3D 0) {
 + #if 0
                         panic("biodone: vnode is not setup for merged cac=
 he");
 + #else
 +                       panic("biodone: vnode is not setup for merged cac=
 hei at %s:%u",
 +                               file, lnum);
 + #endif
                 }
   #endif
   =
 
 ----------------------------------------------------------
 

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




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