Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 29 Apr 2003 13:51:57 -0600 (MDT)
From:      "M. Warner Losh" <imp@bsdimp.com>
To:        jhb@FreeBSD.org
Cc:        cvs-all@FreeBSD.org
Subject:   Re: cvs commit: src/sys/dev/fxp if_fxp.c if_fxpvar.h
Message-ID:  <20030429.135157.94399579.imp@bsdimp.com>
In-Reply-To: <XFMail.20030429152414.jhb@FreeBSD.org>
References:  <16046.51947.425815.273156@grasshopper.cs.duke.edu> <XFMail.20030429152414.jhb@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
Here's the diff that I plan on committing.  It fixes the following
issues:
	1) gone duplicates the suspend functionality.  Roll the two
	   together to reduce the overhead.
	2) Move test for suspend under the lock.  Otherwise we have a
	   race.
	3) Move suspend test to before DEVICE_POLLING, since it is
	   supposed to keep things from happening at all.
	4) Rather than using 'gone' use mtx_owned instead to protect
	   recursive lock in ioctl.

Comments?


Index: if_fxp.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/fxp/if_fxp.c,v
retrieving revision 1.176
diff -u -r1.176 if_fxp.c
--- if_fxp.c	29 Apr 2003 05:47:14 -0000	1.176
+++ if_fxp.c	29 Apr 2003 19:47:30 -0000
@@ -881,7 +881,7 @@
 	FXP_LOCK(sc);
 	s = splimp();
 
-	sc->gone = 1;
+	sc->suspend = 1;	/* Do same thing as we do for suspend */
 	/*
 	 * Close down routes etc.
 	 */
@@ -1499,10 +1499,12 @@
 	struct ifnet *ifp = &sc->sc_if;
 	u_int8_t statack;
 
-	if (sc->gone)
+	FXP_LOCK(sc);
+	if (sc->suspended) {
+		FXP_UNLOCK(sc);
 		return;
+	}
 
-	FXP_LOCK(sc);
 #ifdef DEVICE_POLLING
 	if (ifp->if_flags & IFF_POLLING) {
 		FXP_UNLOCK(sc);
@@ -1516,12 +1518,6 @@
 		return;
 	}
 #endif
-
-	if (sc->suspended) {
-		FXP_UNLOCK(sc);
-		return;
-	}
-
 	while ((statack = CSR_READ_1(sc, FXP_CSR_SCB_STATACK)) != 0) {
 		/*
 		 * It should not be possible to have all bits set; the
@@ -2362,8 +2358,10 @@
 	struct mii_data *mii;
 	int s, error = 0;
 
-	if (sc->gone)
-		return (ENODEV);
+	// Detaching causes us to call ioctl with the mutex owned.  Preclude
+	// that by saying we're busy.
+	if (mtx_owned(&sc->sc_mtx))
+		return (EBUSY);
 
 	FXP_LOCK(sc);
 	s = splimp();
Index: if_fxpvar.h
===================================================================
RCS file: /home/ncvs/src/sys/dev/fxp/if_fxpvar.h,v
retrieving revision 1.26
diff -u -r1.26 if_fxpvar.h
--- if_fxpvar.h	29 Apr 2003 05:45:09 -0000	1.26
+++ if_fxpvar.h	29 Apr 2003 19:47:30 -0000
@@ -185,11 +185,10 @@
 	int tunable_int_delay;		/* interrupt delay value for ucode */
 	int tunable_bundle_max;		/* max # frames per interrupt (ucode) */
 	int eeprom_size;		/* size of serial EEPROM */
-	int suspended;			/* 0 = normal  1 = suspended (APM) */
+	int suspended;			/* 0 = normal  1 = suspended or dead */
 	int cu_resume_bug;
 	int revision;
 	int flags;
-	int gone;
 	u_int32_t saved_maps[5];	/* pci data */
 	u_int32_t saved_biosaddr;
 	u_int8_t saved_intline;



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