Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 2 Jul 1998 21:30:11 +0200
From:      Eivind Eklund <eivind@yes.no>
To:        Kevin Day <toasty@home.dragondata.com>, Andreas Klemm <andreas@klemm.gtn.com>
Cc:        current@FreeBSD.ORG
Subject:   Re: -current wishlist
Message-ID:  <19980702213011.35162@follo.net>
In-Reply-To: <199807021520.KAA18837@home.dragondata.com>; from Kevin Day on Thu, Jul 02, 1998 at 10:20:51AM -0500
References:  <19980702102856.A11204@klemm.gtn.com> <199807021520.KAA18837@home.dragondata.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, Jul 02, 1998 at 10:20:51AM -0500, Kevin Day wrote:
> > On Wed, Jul 01, 1998 at 10:22:08PM -0500, Kevin Day wrote:
> > > 
> > > I don't know if there's a Santa Claus on -current right now, but I've got a
> > > few suggestions/weak spots I see in -current now, and would be more than
> > > willing to help anyone wanting to work on these. I'm not that deep into the
> > > mysteries of the kernel to just do it myself, but I'm a willing test
> > > subject. :)
> > > [...] 
> > > 5) Fix ccd under SMP
> > > [...] 
> > 
> > What problems ?
> > 
> 
> I get random 'Page fault while in kernel mode', then lockups before I can do
> a trace. Seperating the two drives into non-ccd paritions makes it go away,
> adding them back as a ccd drive starts it again.. Is it just me? :)

These fix a couple of reasons for such problems, I think.  They're
completely untested.  Feel free to test them :-)

They're part of a large fix-set I've got; unfortunately, the
(commercial) tools I use to find problems require a lot of 'pointless'
changes, including error control comments.  This means that extracting
individual fixes such as the below can be quite a bit of work, and
committing the 'pointless' changes has been deemed deterimental to
everybody that don't have the tools...


Index: ccd.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/ccd/ccd.c,v
retrieving revision 1.32
diff -u -r1.32 ccd.c
--- ccd.c	1998/03/09 20:39:26	1.32
+++ ccd.c	1998/05/31 01:10:56
@@ -427,7 +433,7 @@
 			printf("ccd%d: interleave must be at least %d\n",
 			    ccd->ccd_unit, (maxsecsize / DEV_BSIZE));
 #endif
-		while (ci >= cs->sc_cinfo) {
+		while (ci && ci >= cs->sc_cinfo) {
 			free(ci->ci_path, M_DEVBUF);
 			ci--;
 		}
@@ -792,14 +801,16 @@
 		rcount = cbp[0]->cb_buf.b_bcount;
 		if ((cbp[0]->cb_buf.b_flags & B_READ) == 0)
 			cbp[0]->cb_buf.b_vp->v_numoutput++;
-		VOP_STRATEGY(&cbp[0]->cb_buf);
+		/* XXX VOP_STRATEGY can fail - add error checking? */
+		(void)VOP_STRATEGY(&cbp[0]->cb_buf);
 		if (cs->sc_cflags & CCDF_MIRROR &&
 		    (cbp[0]->cb_buf.b_flags & B_READ) == 0) {
 			/* mirror, start another write */
 			cbp[1]->cb_buf.b_vp->v_numoutput++;
-			VOP_STRATEGY(&cbp[1]->cb_buf);
+			/* XXX VOP_STRATEGY can fail - add error checking? */
+			(void)VOP_STRATEGY(&cbp[1]->cb_buf);
 		}
		bn += btodb(rcount);
 		addr += rcount;
 	}
 }
@@ -918,7 +929,8 @@
 #endif
 	cb[0] = cbp;
 	if (cs->sc_cflags & CCDF_MIRROR &&
-	    (cbp->cb_buf.b_flags & B_READ) == 0) {
+	    (cbp->cb_buf.b_flags & B_READ) == 0
+		&& ci2) {
 		/* mirror, start one more write */
 		cbp = getccdbuf();
 		bzero(cbp, sizeof (struct ccdbuf));

Eivind.

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?19980702213011.35162>