Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 29 Jun 1999 00:57:38 +0800
From:      Peter Wemm <peter@netplex.com.au>
To:        Kirk McKusick <mckusick@flamingo.McKusick.COM>
Cc:        Julian Elischer <julian@whistle.com>, Matthew Dillon <dillon@apollo.backplane.com>, Alan Cox <alc@cs.rice.edu>, Mike Smith <mike@smith.net.au>, "John S. Dyson" <toor@dyson.iquest.net>, dg@root.com, dyson@iquest.net, current@freebsd.org, Greg Lehey <grog@lemis.com>
Subject:   Re: Found the startup panic - ccd ( patch included ) 
Message-ID:  <19990628165738.E590283@overcee.netplex.com.au>
In-Reply-To: Your message of "Mon, 28 Jun 1999 04:54:07 MST." <199906281154.EAA02335@flamingo.McKusick.COM> 

next in thread | previous in thread | raw e-mail | index | archive | help
Kirk McKusick wrote:
[..]

I've been tinkering around for a while and think I have at least a
partial fix for the remaining problems.

Certain places use B_CALL and have biodone() from the b_iodone routine,
so we can't reliably use B_ASYNC as an indicator of needing to reassign
to LK_KERNPROC.  We have to do it on a case-by-case basis.

It's easier to do cluster_head processing at the point it's gathered
rather than in BUF_KERNPROC().

vfs_cluster.c is confusing, but I think I've figured out how to get it
right. I'm not 100% sure about checking for B_CALL in both cases prior
to VOP_STRATEGY(), and maybe reqbp needs to be considered for the first
read in cluster_read().

Also, I think the inline BUF_*() routines/macros would be better as
routines in something like vfs_bio.c as the internals cause problems
with prototypes etc.

I think this patch fixes the remaining panics in pageouts and clustering.

Index: kern/vfs_bio.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/vfs_bio.c,v
retrieving revision 1.218
diff -u -r1.218 vfs_bio.c
--- vfs_bio.c	1999/06/28 15:32:10	1.218
+++ vfs_bio.c	1999/06/28 16:48:53
@@ -517,7 +517,8 @@
 	if (curproc != NULL)
 		curproc->p_stats->p_ru.ru_oublock++;
 	splx(s);
-	BUF_KERNPROC(bp);
+	if (oldflags & B_ASYNC)
+		BUF_KERNPROC(bp);
 	VOP_STRATEGY(bp->b_vp, bp);
 
 	/*
Index: kern/vfs_cluster.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/vfs_cluster.c,v
retrieving revision 1.84
diff -u -r1.84 vfs_cluster.c
--- vfs_cluster.c	1999/06/26 02:46:08	1.84
+++ vfs_cluster.c	1999/06/28 16:48:53
@@ -252,7 +252,8 @@
 		if ((bp->b_flags & B_CLUSTER) == 0)
 			vfs_busy_pages(bp, 0);
 		bp->b_flags &= ~(B_ERROR|B_INVAL);
-		BUF_KERNPROC(bp);
+		if (bp->b_flags & (B_ASYNC|B_CALL))
+			BUF_KERNPROC(bp);
 		error = VOP_STRATEGY(vp, bp);
 		curproc->p_stats->p_ru.ru_inblock++;
 	}
@@ -286,7 +287,8 @@
 			if ((rbp->b_flags & B_CLUSTER) == 0)
 				vfs_busy_pages(rbp, 0);
 			rbp->b_flags &= ~(B_ERROR|B_INVAL);
-			BUF_KERNPROC(rbp);
+			if (rbp->b_flags & (B_ASYNC|B_CALL))
+				BUF_KERNPROC(rbp);
 			(void) VOP_STRATEGY(vp, rbp);
 			curproc->p_stats->p_ru.ru_inblock++;
 		}
@@ -414,6 +416,11 @@
 				break;
 			}
 		}
+		/*
+		 * XXX fbp from caller may not be B_ASYNC, but we are going
+		 * to biodone() it in cluster_callback() anyway
+		 */
+		BUF_KERNPROC(tbp);
 		TAILQ_INSERT_TAIL(&bp->b_cluster.cluster_head,
 			tbp, b_cluster.cluster_entry);
 		for (j = 0; j < tbp->b_npages; j += 1) {
@@ -788,6 +795,7 @@
 			reassignbuf(tbp, tbp->b_vp);	/* put on clean list */
 			++tbp->b_vp->v_numoutput;
 			splx(s);
+			BUF_KERNPROC(tbp);
 			TAILQ_INSERT_TAIL(&bp->b_cluster.cluster_head,
 				tbp, b_cluster.cluster_entry);
 		}
Index: sys/buf.h
===================================================================
RCS file: /home/ncvs/src/sys/sys/buf.h,v
retrieving revision 1.73
diff -u -r1.73 buf.h
--- buf.h	1999/06/27 11:40:03	1.73
+++ buf.h	1999/06/28 16:48:53
@@ -315,17 +315,8 @@
 static __inline void
 BUF_KERNPROC(struct buf *bp)
 {
-	struct buf *nbp;
-	int s;
 
-	s = splbio();
-	if (bp->b_flags & B_ASYNC)
-		bp->b_lock.lk_lockholder = LK_KERNPROC;
-	for (nbp = TAILQ_FIRST(&bp->b_cluster.cluster_head);
-	     nbp; nbp = TAILQ_NEXT(&nbp->b_cluster, cluster_entry))
-		if (nbp->b_flags & B_ASYNC)
-			nbp->b_lock.lk_lockholder = LK_KERNPROC;
-	splx(s);
+	bp->b_lock.lk_lockholder = LK_KERNPROC;
 }
 /*
  * Find out the number of references to a lock.


Cheers,
-Peter
--
Peter Wemm - peter@FreeBSD.org; peter@yahoo-inc.com; peter@netplex.com.au



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?19990628165738.E590283>