Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 21 Aug 2009 13:12:17 GMT
From:      Hans Petter Selasky <hselasky@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 167571 for review
Message-ID:  <200908211312.n7LDCHRd032307@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=167571

Change 167571 by hselasky@hselasky_laptop001 on 2009/08/21 13:11:26

	
	IFC @ 167570
	
	- catch up newbus locking change

Affected files ...

.. //depot/projects/usb/src/sys/amd64/amd64/machdep.c#25 integrate
.. //depot/projects/usb/src/sys/contrib/pf/net/pf.c#15 integrate
.. //depot/projects/usb/src/sys/contrib/pf/net/pfvar.h#6 integrate
.. //depot/projects/usb/src/sys/dev/aac/aac.c#9 integrate
.. //depot/projects/usb/src/sys/dev/acpica/acpi.c#20 integrate
.. //depot/projects/usb/src/sys/dev/acpica/acpi_battery.c#8 integrate
.. //depot/projects/usb/src/sys/dev/acpica/acpi_cpu.c#12 integrate
.. //depot/projects/usb/src/sys/dev/acpica/acpi_dock.c#7 integrate
.. //depot/projects/usb/src/sys/dev/acpica/acpi_thermal.c#9 integrate
.. //depot/projects/usb/src/sys/dev/adb/adb_bus.c#5 integrate
.. //depot/projects/usb/src/sys/dev/amdtemp/amdtemp.c#3 integrate
.. //depot/projects/usb/src/sys/dev/amr/amr.c#10 integrate
.. //depot/projects/usb/src/sys/dev/ata/ata-all.c#19 integrate
.. //depot/projects/usb/src/sys/dev/atkbdc/psm.c#12 integrate
.. //depot/projects/usb/src/sys/dev/bge/if_bge.c#20 integrate
.. //depot/projects/usb/src/sys/dev/bktr/bktr_os.c#6 integrate
.. //depot/projects/usb/src/sys/dev/drm/drm_drv.c#14 integrate
.. //depot/projects/usb/src/sys/dev/e1000/if_em.c#12 integrate
.. //depot/projects/usb/src/sys/dev/e1000/if_igb.c#13 integrate
.. //depot/projects/usb/src/sys/dev/hptrr/hptrr_osm_bsd.c#2 integrate
.. //depot/projects/usb/src/sys/dev/ips/ips_pci.c#4 integrate
.. //depot/projects/usb/src/sys/dev/mfi/mfi.c#18 integrate
.. //depot/projects/usb/src/sys/dev/mii/e1000phy.c#9 integrate
.. //depot/projects/usb/src/sys/dev/mlx/mlx.c#8 integrate
.. //depot/projects/usb/src/sys/dev/mmc/mmc.c#11 integrate
.. //depot/projects/usb/src/sys/dev/pccbb/pccbb.c#14 integrate
.. //depot/projects/usb/src/sys/dev/pst/pst-iop.c#4 integrate
.. //depot/projects/usb/src/sys/dev/rp/rp.c#7 integrate
.. //depot/projects/usb/src/sys/dev/sound/pci/hda/hdac.c#34 integrate
.. //depot/projects/usb/src/sys/dev/twe/twe.c#4 integrate
.. //depot/projects/usb/src/sys/dev/usb/controller/usb_controller.c#30 edit
.. //depot/projects/usb/src/sys/dev/usb/input/ukbd.c#31 edit
.. //depot/projects/usb/src/sys/dev/usb/net/usb_ethernet.c#11 edit
.. //depot/projects/usb/src/sys/dev/usb/usb_busdma.c#16 edit
.. //depot/projects/usb/src/sys/dev/usb/usb_compat_linux.c#48 edit
.. //depot/projects/usb/src/sys/dev/usb/usb_dev.c#36 integrate
.. //depot/projects/usb/src/sys/dev/usb/usb_device.c#50 edit
.. //depot/projects/usb/src/sys/dev/usb/usb_handle_request.c#21 integrate
.. //depot/projects/usb/src/sys/dev/usb/usb_hub.c#31 integrate
.. //depot/projects/usb/src/sys/dev/usb/usb_process.c#12 edit
.. //depot/projects/usb/src/sys/dev/usb/wlan/if_upgt.c#15 integrate
.. //depot/projects/usb/src/sys/dev/xen/blkback/blkback.c#4 integrate
.. //depot/projects/usb/src/sys/dev/xen/netback/netback.c#4 integrate
.. //depot/projects/usb/src/sys/i386/acpica/acpi_machdep.c#11 integrate
.. //depot/projects/usb/src/sys/i386/bios/smapi.c#6 integrate
.. //depot/projects/usb/src/sys/i386/bios/smbios.c#4 integrate
.. //depot/projects/usb/src/sys/i386/bios/vpd.c#4 integrate
.. //depot/projects/usb/src/sys/i386/i386/machdep.c#21 integrate
.. //depot/projects/usb/src/sys/kern/subr_bus.c#27 integrate
.. //depot/projects/usb/src/sys/kern/subr_sglist.c#2 integrate
.. //depot/projects/usb/src/sys/kern/tty_pty.c#10 integrate
.. //depot/projects/usb/src/sys/net/flowtable.c#10 integrate
.. //depot/projects/usb/src/sys/net/flowtable.h#7 integrate
.. //depot/projects/usb/src/sys/netinet/ip_carp.c#19 integrate
.. //depot/projects/usb/src/sys/netinet/ip_fw.h#19 integrate
.. //depot/projects/usb/src/sys/netinet/ip_output.c#27 integrate
.. //depot/projects/usb/src/sys/netinet/ipfw/ip_fw2.c#10 integrate
.. //depot/projects/usb/src/sys/netinet/ipfw/ip_fw_pfil.c#4 integrate
.. //depot/projects/usb/src/sys/netinet/sctp_output.c#22 integrate
.. //depot/projects/usb/src/sys/netinet/sctputil.c#24 integrate
.. //depot/projects/usb/src/sys/netinet/tcp_timewait.c#17 integrate
.. //depot/projects/usb/src/sys/pc98/cbus/fdc.c#6 integrate
.. //depot/projects/usb/src/sys/sys/bus.h#9 integrate
.. //depot/projects/usb/src/sys/sys/sglist.h#2 integrate
.. //depot/projects/usb/src/sys/xen/xenbus/xenbus_probe.c#6 integrate

Differences ...

==== //depot/projects/usb/src/sys/amd64/amd64/machdep.c#25 (text+ko) ====

@@ -39,7 +39,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/amd64/machdep.c,v 1.707 2009/08/02 11:26:23 ed Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/amd64/machdep.c,v 1.709 2009/08/20 22:58:05 jkim Exp $");
 
 #include "opt_atalk.h"
 #include "opt_atpic.h"
@@ -217,6 +217,7 @@
 		    strncmp(sysenv, "MacBook3,1", 10) == 0 ||
 		    strncmp(sysenv, "MacBookPro1,1", 13) == 0 ||
 		    strncmp(sysenv, "MacBookPro1,2", 13) == 0 ||
+		    strncmp(sysenv, "MacBookPro3,1", 13) == 0 ||
 		    strncmp(sysenv, "Macmini1,1", 10) == 0) {
 			if (bootverbose)
 				printf("Disabling LEGACY_USB_EN bit on "
@@ -235,19 +236,21 @@
 #ifdef PERFMON
 	perfmon_init();
 #endif
+	realmem = Maxmem;
+
+	/*
+	 * Display physical memory if SMBIOS reports reasonable amount.
+	 */
+	memsize = 0;
 	sysenv = getenv("smbios.memory.enabled");
 	if (sysenv != NULL) {
-		memsize = (uintmax_t)strtoul(sysenv, (char **)NULL, 10);
+		memsize = (uintmax_t)strtoul(sysenv, (char **)NULL, 10) << 10;
 		freeenv(sysenv);
-	} else
-		memsize = 0;
-	if (memsize > 0)
-		printf("real memory  = %ju (%ju MB)\n", memsize << 10,
-		    memsize >> 10);
-	else
-		printf("real memory  = %ju (%ju MB)\n", ptoa((uintmax_t)Maxmem),
-		    ptoa((uintmax_t)Maxmem) / 1048576);
-	realmem = Maxmem;
+	}
+	if (memsize < ptoa((uintmax_t)cnt.v_free_count))
+		memsize = ptoa((uintmax_t)Maxmem);
+	printf("real memory  = %ju (%ju MB)\n", memsize, memsize >> 20);
+
 	/*
 	 * Display any holes after the first chunk of extended memory.
 	 */

==== //depot/projects/usb/src/sys/contrib/pf/net/pf.c#15 (text+ko) ====

@@ -41,7 +41,7 @@
 #include "opt_inet6.h"
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/contrib/pf/net/pf.c,v 1.69 2009/08/02 19:43:32 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/contrib/pf/net/pf.c,v 1.70 2009/08/19 00:10:10 mlaier Exp $");
 #endif
 
 #ifdef __FreeBSD__
@@ -971,6 +971,9 @@
 pf_purge_thread(void *v)
 {
 	int nloops = 0, s;
+#ifdef __FreeBSD__
+	int locked;
+#endif
 
 	for (;;) {
 		tsleep(pf_purge_thread, PWAIT, "pftm", 1 * hz);
@@ -978,14 +981,19 @@
 #ifdef __FreeBSD__
 		sx_slock(&pf_consistency_lock);
 		PF_LOCK();
+		locked = 0;
 
 		if (pf_end_threads) {
-			pf_purge_expired_states(pf_status.states);
+			PF_UNLOCK();
+			sx_sunlock(&pf_consistency_lock);
+			sx_xlock(&pf_consistency_lock);
+			PF_LOCK();
+			pf_purge_expired_states(pf_status.states, 1);
 			pf_purge_expired_fragments();
-			pf_purge_expired_src_nodes(0);
+			pf_purge_expired_src_nodes(1);
 			pf_end_threads++;
 
-			sx_sunlock(&pf_consistency_lock);
+			sx_xunlock(&pf_consistency_lock);
 			PF_UNLOCK();
 			wakeup(pf_purge_thread);
 			kproc_exit(0);
@@ -994,20 +1002,44 @@
 		s = splsoftnet();
 
 		/* process a fraction of the state table every second */
+#ifdef __FreeBSD__
+		if(!pf_purge_expired_states(1 + (pf_status.states
+		    / pf_default_rule.timeout[PFTM_INTERVAL]), 0)) {
+			PF_UNLOCK();
+			sx_sunlock(&pf_consistency_lock);
+			sx_xlock(&pf_consistency_lock);
+			PF_LOCK();
+			locked = 1;
+
+			pf_purge_expired_states(1 + (pf_status.states
+			    / pf_default_rule.timeout[PFTM_INTERVAL]), 1);
+		}
+#else
 		pf_purge_expired_states(1 + (pf_status.states
 		    / pf_default_rule.timeout[PFTM_INTERVAL]));
+#endif
 
 		/* purge other expired types every PFTM_INTERVAL seconds */
 		if (++nloops >= pf_default_rule.timeout[PFTM_INTERVAL]) {
 			pf_purge_expired_fragments();
-			pf_purge_expired_src_nodes(0);
+			if (!pf_purge_expired_src_nodes(locked)) {
+				PF_UNLOCK();
+				sx_sunlock(&pf_consistency_lock);
+				sx_xlock(&pf_consistency_lock);
+				PF_LOCK();
+				locked = 1;
+				pf_purge_expired_src_nodes(1);
+			}
 			nloops = 0;
 		}
 
 		splx(s);
 #ifdef __FreeBSD__
 		PF_UNLOCK();
-		sx_sunlock(&pf_consistency_lock);
+		if (locked)
+			sx_xunlock(&pf_consistency_lock);
+		else
+			sx_sunlock(&pf_consistency_lock);
 #endif
 	}
 }
@@ -1056,8 +1088,13 @@
 	return (state->expire + timeout);
 }
 
+#ifdef __FreeBSD__
+int
+pf_purge_expired_src_nodes(int waslocked)
+#else
 void
 pf_purge_expired_src_nodes(int waslocked)
+#endif
 {
 	 struct pf_src_node		*cur, *next;
 	 int				 locked = waslocked;
@@ -1068,12 +1105,8 @@
 		 if (cur->states <= 0 && cur->expire <= time_second) {
 			 if (! locked) {
 #ifdef __FreeBSD__
-				 if (!sx_try_upgrade(&pf_consistency_lock)) {
-					 PF_UNLOCK();
-					 sx_sunlock(&pf_consistency_lock);
-					 sx_xlock(&pf_consistency_lock);
-					 PF_LOCK();
-				 }
+				 if (!sx_try_upgrade(&pf_consistency_lock))
+				 	return (0);
 #else
 				 rw_enter_write(&pf_consistency_lock);
 #endif
@@ -1100,6 +1133,10 @@
 #else
 		rw_exit_write(&pf_consistency_lock);
 #endif
+
+#ifdef __FreeBSD__
+	return (1);
+#endif
 }
 
 void
@@ -1202,12 +1239,21 @@
 	pf_status.states--;
 }
 
+#ifdef __FreeBSD__
+int
+pf_purge_expired_states(u_int32_t maxcheck, int waslocked)
+#else
 void
 pf_purge_expired_states(u_int32_t maxcheck)
+#endif
 {
 	static struct pf_state	*cur = NULL;
 	struct pf_state		*next;
+#ifdef __FreeBSD__
+	int 			 locked = waslocked;
+#else
 	int 			 locked = 0;
+#endif
 
 	while (maxcheck--) {
 		/* wrap to start of list when we hit the end */
@@ -1224,12 +1270,8 @@
 			/* free unlinked state */
 			if (! locked) {
 #ifdef __FreeBSD__
-				 if (!sx_try_upgrade(&pf_consistency_lock)) {
-					 PF_UNLOCK();
-					 sx_sunlock(&pf_consistency_lock);
-					 sx_xlock(&pf_consistency_lock);
-					 PF_LOCK();
-				 }
+				 if (!sx_try_upgrade(&pf_consistency_lock))
+				 	return (0);
 #else
 				rw_enter_write(&pf_consistency_lock);
 #endif
@@ -1241,12 +1283,8 @@
 			pf_unlink_state(cur);
 			if (! locked) {
 #ifdef __FreeBSD__
-				 if (!sx_try_upgrade(&pf_consistency_lock)) {
-					 PF_UNLOCK();
-					 sx_sunlock(&pf_consistency_lock);
-					 sx_xlock(&pf_consistency_lock);
-					 PF_LOCK();
-				 }
+				 if (!sx_try_upgrade(&pf_consistency_lock))
+				 	return (0);
 #else
 				rw_enter_write(&pf_consistency_lock);
 #endif
@@ -1257,10 +1295,13 @@
 		cur = next;
 	}
 
-	if (locked)
 #ifdef __FreeBSD__
+	if (!waslocked && locked)
 		sx_downgrade(&pf_consistency_lock);
+
+	return (1);
 #else
+	if (locked)
 		rw_exit_write(&pf_consistency_lock);
 #endif
 }

==== //depot/projects/usb/src/sys/contrib/pf/net/pfvar.h#6 (text+ko) ====

@@ -1,4 +1,4 @@
-/*	$FreeBSD: src/sys/contrib/pf/net/pfvar.h,v 1.19 2009/07/14 22:48:30 rwatson Exp $	*/
+/*	$FreeBSD: src/sys/contrib/pf/net/pfvar.h,v 1.20 2009/08/19 00:10:10 mlaier Exp $	*/
 /*	$OpenBSD: pfvar.h,v 1.244 2007/02/23 21:31:51 deraadt Exp $ */
 
 /*
@@ -1593,8 +1593,13 @@
 extern struct pool		 pf_state_scrub_pl;
 #endif
 extern void			 pf_purge_thread(void *);
+#ifdef __FreeBSD__
+extern int			 pf_purge_expired_src_nodes(int);
+extern int			 pf_purge_expired_states(u_int32_t, int);
+#else
 extern void			 pf_purge_expired_src_nodes(int);
 extern void			 pf_purge_expired_states(u_int32_t);
+#endif
 extern void			 pf_unlink_state(struct pf_state *);
 extern void			 pf_free_state(struct pf_state *);
 extern int			 pf_insert_state(struct pfi_kif *,

==== //depot/projects/usb/src/sys/dev/aac/aac.c#9 (text+ko) ====

@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/aac/aac.c,v 1.143 2009/08/02 14:28:40 attilio Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/aac/aac.c,v 1.144 2009/08/20 19:17:53 jhb Exp $");
 
 /*
  * Driver for the Adaptec 'FSA' family of PCI/SCSI RAID adapters.
@@ -3270,10 +3270,10 @@
 			while (co != NULL) {
 				if (co->co_found == 0) {
 					mtx_unlock(&sc->aac_io_lock);
-					newbus_xlock();
+					mtx_lock(&Giant);
 					device_delete_child(sc->aac_dev,
 							    co->co_disk);
-					newbus_xunlock();
+					mtx_unlock(&Giant);
 					mtx_lock(&sc->aac_io_lock);
 					co_next = TAILQ_NEXT(co, co_link);
 					mtx_lock(&sc->aac_container_lock);
@@ -3291,9 +3291,9 @@
 			/* Attach the newly created containers */
 			if (added) {
 				mtx_unlock(&sc->aac_io_lock);
-				newbus_xlock();
+				mtx_lock(&Giant);
 				bus_generic_attach(sc->aac_dev);
-				newbus_xunlock();
+				mtx_unlock(&Giant);
 				mtx_lock(&sc->aac_io_lock);
 			}
 

==== //depot/projects/usb/src/sys/dev/acpica/acpi.c#20 (text+ko) ====

@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi.c,v 1.265 2009/08/02 14:28:40 attilio Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi.c,v 1.266 2009/08/20 19:17:53 jhb Exp $");
 
 #include "opt_acpi.h"
 #include <sys/param.h>
@@ -675,6 +675,8 @@
     device_t child, *devlist;
     int error, i, numdevs, pstate;
 
+    GIANT_REQUIRED;
+
     /* First give child devices a chance to suspend. */
     error = bus_generic_suspend(dev);
     if (error)
@@ -717,6 +719,8 @@
     int i, numdevs, error;
     device_t child, *devlist;
 
+    GIANT_REQUIRED;
+
     /*
      * Put all devices in D0 before resuming them.  Call _S0D on each one
      * since some systems expect this.
@@ -741,6 +745,8 @@
 acpi_shutdown(device_t dev)
 {
 
+    GIANT_REQUIRED;
+
     /* Allow children to shutdown first. */
     bus_generic_shutdown(dev);
 
@@ -2528,7 +2534,11 @@
     thread_unlock(curthread);
 #endif
 
-    newbus_xlock();
+    /*
+     * Be sure to hold Giant across DEVICE_SUSPEND/RESUME since non-MPSAFE
+     * drivers need this.
+     */
+    mtx_lock(&Giant);
 
     slp_state = ACPI_SS_NONE;
 
@@ -2601,7 +2611,7 @@
     if (slp_state >= ACPI_SS_SLEPT)
 	acpi_enable_fixed_events(sc);
 
-    newbus_xunlock();
+    mtx_unlock(&Giant);
 
 #ifdef SMP
     thread_lock(curthread);

==== //depot/projects/usb/src/sys/dev/acpica/acpi_battery.c#8 (text+ko) ====

@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_battery.c,v 1.29 2009/08/02 14:28:40 attilio Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_battery.c,v 1.30 2009/08/20 19:17:53 jhb Exp $");
 
 #include "opt_acpi.h"
 #include <sys/param.h>
@@ -329,7 +329,6 @@
 
     dev = NULL;
     found_unit = 0;
-    newbus_slock();
     batt_dc = devclass_find("battery");
     maxunit = devclass_get_maxunit(batt_dc);
     for (i = 0; i < maxunit; i++) {
@@ -341,7 +340,6 @@
 	found_unit++;
 	dev = NULL;
     }
-    newbus_sunlock();
 
     return (dev);
 }
@@ -371,17 +369,13 @@
      */
     switch (cmd) {
     case ACPIIO_BATT_GET_UNITS:
-	newbus_slock();
 	*(int *)addr = acpi_battery_get_units();
-	newbus_sunlock();
 	error = 0;
 	break;
     case ACPIIO_BATT_GET_BATTINFO:
 	if (dev != NULL || unit == ACPI_BATTERY_ALL_UNITS) {
 	    bzero(&ioctl_arg->battinfo, sizeof(ioctl_arg->battinfo));
-	    newbus_slock();
 	    error = acpi_battery_get_battinfo(dev, &ioctl_arg->battinfo);
-	    newbus_sunlock();
 	}
 	break;
     case ACPIIO_BATT_GET_BIF:
@@ -422,11 +416,6 @@
 {
     int val, error;
 
-    /*
-     * Tolerate a race here because newbus lock can't be acquired before
-     * acpi_battery_get_battinfo() as it can create a LOR with the sysctl
-     * lock.
-     */
     acpi_battery_get_battinfo(NULL, &acpi_battery_battinfo);
     val = *(u_int *)oidp->oid_arg1;
     error = sysctl_handle_int(oidp, &val, 0, req);
@@ -438,10 +427,6 @@
 {
     int count, error;
 
-    /*
-     * Tolerate a race here in order to avoid a LOR between sysctl lock
-     * and newbus lock.
-     */
     count = acpi_battery_get_units();
     error = sysctl_handle_int(oidp, &count, 0, req);
     return (error);

==== //depot/projects/usb/src/sys/dev/acpica/acpi_cpu.c#12 (text+ko) ====

@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_cpu.c,v 1.79 2009/08/02 14:28:40 attilio Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_cpu.c,v 1.80 2009/08/20 19:17:53 jhb Exp $");
 
 #include "opt_acpi.h"
 #include <sys/param.h>
@@ -732,9 +732,7 @@
     int i;
 
     /* Get set of CPU devices */
-    newbus_slock();
     devclass_get_devices(acpi_cpu_devclass, &cpu_devices, &cpu_ndevices);
-    newbus_sunlock();
 
     /*
      * Setup any quirks that might necessary now that we have probed

==== //depot/projects/usb/src/sys/dev/acpica/acpi_dock.c#7 (text) ====

@@ -23,7 +23,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/dev/acpica/acpi_dock.c,v 1.8 2009/08/02 14:28:40 attilio Exp $
+ * $FreeBSD: src/sys/dev/acpica/acpi_dock.c,v 1.9 2009/08/20 19:17:53 jhb Exp $
  */
 
 #include "opt_acpi.h"
@@ -188,12 +188,12 @@
 
 	dev = (device_t)context;
 
-	newbus_xlock();
 	if (!device_is_enabled(dev))
 		device_enable(dev);
 
+	mtx_lock(&Giant);
 	device_probe_and_attach(dev);
-	newbus_xunlock();
+	mtx_unlock(&Giant);
 }
 
 static ACPI_STATUS
@@ -299,11 +299,11 @@
 	    "ejecting device for %s\n", acpi_name(handle));
 
 	dev = acpi_get_device(handle);
-	newbus_xlock();
 	if (dev != NULL && device_is_attached(dev)) {
+		mtx_lock(&Giant);
 		device_detach(dev);
+		mtx_unlock(&Giant);
 	}
-	newbus_xunlock();
 
 	acpi_SetInteger(handle, "_EJ0", 0);
 out:

==== //depot/projects/usb/src/sys/dev/acpica/acpi_thermal.c#9 (text+ko) ====

@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_thermal.c,v 1.72 2009/08/02 14:28:40 attilio Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_thermal.c,v 1.73 2009/08/20 19:17:53 jhb Exp $");
 
 #include "opt_acpi.h"
 #include <sys/param.h>
@@ -936,8 +936,6 @@
     sc = NULL;
 
     for (;;) {
-	newbus_slock();
-
 	/* If the number of devices has changed, re-evaluate. */
 	if (devclass_get_count(acpi_tz_devclass) != devcount) {
 	    if (devs != NULL) {
@@ -950,7 +948,6 @@
 	    for (i = 0; i < devcount; i++)
 		sc[i] = device_get_softc(devs[i]);
 	}
-	newbus_sunlock();
 
 	/* Check for temperature events and act on them. */
 	for (i = 0; i < devcount; i++) {

==== //depot/projects/usb/src/sys/dev/adb/adb_bus.c#5 (text+ko) ====

@@ -22,7 +22,7 @@
  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/dev/adb/adb_bus.c,v 1.5 2009/08/02 14:28:40 attilio Exp $
+ * $FreeBSD: src/sys/dev/adb/adb_bus.c,v 1.6 2009/08/20 19:17:53 jhb Exp $
  */
 
 #include <sys/cdefs.h>
@@ -113,7 +113,6 @@
 	uint8_t i, next_free;
 	uint16_t r3;
 
-	newbus_xlock();
 	sc->sc_dev = dev;
 	sc->parent = device_get_parent(dev);
 
@@ -188,7 +187,6 @@
 	}
 
 	bus_generic_attach(dev);
-	newbus_xunlock();
 
 	config_intrhook_disestablish(&sc->enum_hook);
 }

==== //depot/projects/usb/src/sys/dev/amdtemp/amdtemp.c#3 (text+ko) ====

@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/amdtemp/amdtemp.c,v 1.4 2009/08/02 14:28:40 attilio Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/amdtemp/amdtemp.c,v 1.5 2009/08/20 19:17:53 jhb Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -269,7 +269,6 @@
 	/*
 	 * dev.cpu.N.temperature.
 	 */
-	newbus_xlock();
 	nexus = device_find_child(root_bus, "nexus", 0);
 	acpi = device_find_child(nexus, "acpi", 0);
 
@@ -286,7 +285,6 @@
 			    "Max of sensor 0 / 1");
 		}
 	}
-	newbus_xunlock();
 	config_intrhook_disestablish(&sc->sc_ich);
 }
 

==== //depot/projects/usb/src/sys/dev/amr/amr.c#10 (text+ko) ====

@@ -56,7 +56,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/amr/amr.c,v 1.90 2009/08/02 14:28:40 attilio Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/amr/amr.c,v 1.91 2009/08/20 19:17:53 jhb Exp $");
 
 /*
  * Driver for the AMI MegaRaid family of controllers.
@@ -90,10 +90,6 @@
 
 SYSCTL_NODE(_hw, OID_AUTO, amr, CTLFLAG_RD, 0, "AMR driver parameters");
 
-/*
- * In order to get rid of Giant, amr_state should be protected by
- * a proper softc lock for the cdev operations.
- */
 static d_open_t         amr_open;
 static d_close_t        amr_close;
 static d_ioctl_t        amr_ioctl;
@@ -316,11 +312,9 @@
 	config_intrhook_disestablish(&sc->amr_ich);
     sc->amr_ich.ich_func = NULL;
 
-    newbus_xlock();
     /* get up-to-date drive information */
     if (amr_query_controller(sc)) {
 	device_printf(sc->amr_dev, "can't scan controller for drives\n");
-	newbus_xunlock();
 	return;
     }
 
@@ -353,7 +347,6 @@
 
     /* interrupts will be enabled before we do anything more */
     sc->amr_state |= AMR_STATE_INTEN;
-    newbus_xunlock();
 
     /*
      * Start the timeout routine.
@@ -441,12 +434,8 @@
 amr_open(struct cdev *dev, int flags, int fmt, struct thread *td)
 {
     int			unit = dev2unit(dev);
-    struct amr_softc	*sc;
+    struct amr_softc	*sc = devclass_get_softc(devclass_find("amr"), unit);
 
-    newbus_slock();
-    sc = devclass_get_softc(devclass_find("amr"), unit);
-    newbus_sunlock();
-
     debug_called(1);
 
     sc->amr_state |= AMR_STATE_OPEN;
@@ -501,11 +490,7 @@
 amr_close(struct cdev *dev, int flags, int fmt, struct thread *td)
 {
     int			unit = dev2unit(dev);
-    struct amr_softc	*sc;
-
-    newbus_slock();
-    sc = devclass_get_softc(devclass_find("amr"), unit);
-    newbus_sunlock();
+    struct amr_softc	*sc = devclass_get_softc(devclass_find("amr"), unit);
 
     debug_called(1);
 
@@ -522,7 +507,6 @@
     struct amr_softc	*sc = (struct amr_softc *)dev->si_drv1;
     int			i, error = 0;
 
-    newbus_xlock();
     sc->amr_state |= AMR_STATE_REMAP_LD;
     while (sc->amr_busyslots) {
 	device_printf(sc->amr_dev, "idle controller\n");
@@ -546,7 +530,6 @@
 	     sc->amr_drive[i].al_disk = 0;
 	}
     }
-    newbus_xunlock();
 
 shutdown_out:
     amr_startup(sc);
@@ -822,9 +805,7 @@
 	    struct amr_linux_ioctl	ali;
 	    int				adapter, error;
 
-	    newbus_slock();
 	    devclass = devclass_find("amr");
-	    newbus_sunlock();
 	    if (devclass == NULL)
 		return (ENOENT);
 

==== //depot/projects/usb/src/sys/dev/ata/ata-all.c#19 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/ata/ata-all.c,v 1.308 2009/08/02 14:28:40 attilio Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/ata/ata-all.c,v 1.309 2009/08/20 19:17:53 jhb Exp $");
 
 #include "opt_ata.h"
 #include <sys/param.h>
@@ -54,6 +54,7 @@
 static  d_ioctl_t       ata_ioctl;
 static struct cdevsw ata_cdevsw = {
 	.d_version =    D_VERSION,
+	.d_flags =      D_NEEDGIANT, /* we need this as newbus isn't mpsafe */
 	.d_ioctl =      ata_ioctl,
 	.d_name =       "ata",
 };
@@ -203,9 +204,7 @@
 {
     device_t dev = (device_t)context;
 
-    newbus_xlock();
     ata_reinit(dev);
-    newbus_xunlock();
 }
 
 int
@@ -247,6 +246,7 @@
 
     /* reinit the children and delete any that fails */
     if (!device_get_children(dev, &children, &nchildren)) {
+	mtx_lock(&Giant);       /* newbus suckage it needs Giant */
 	for (i = 0; i < nchildren; i++) {
 	    /* did any children go missing ? */
 	    if (children[i] && device_is_attached(children[i]) &&
@@ -269,6 +269,7 @@
 	    }
 	}
 	free(children, M_TEMP);
+	mtx_unlock(&Giant);     /* newbus suckage dealt with, release Giant */
     }
 
     /* if we still have a good request put it on the queue again */
@@ -394,7 +395,6 @@
     int *value = (int *)data;
     int i, nchildren, error = ENOTTY;
 
-    newbus_xlock();
     switch (cmd) {
     case IOCATAGMAXCHANNEL:
 	/* In case we have channel 0..n this will return n+1. */
@@ -405,40 +405,32 @@
     case IOCATAREINIT:
 	if (*value >= devclass_get_maxunit(ata_devclass) ||
 	    !(device = devclass_get_device(ata_devclass, *value)) ||
-	    !device_is_attached(device)) {
-            newbus_xunlock();
+	    !device_is_attached(device))
 	    return ENXIO;
-	}
 	error = ata_reinit(device);
 	break;
 
     case IOCATAATTACH:
 	if (*value >= devclass_get_maxunit(ata_devclass) ||
 	    !(device = devclass_get_device(ata_devclass, *value)) ||
-	    !device_is_attached(device)) {
-            newbus_xunlock();
+	    !device_is_attached(device))
 	    return ENXIO;
-	}
 	error = DEVICE_ATTACH(device);
 	break;
 
     case IOCATADETACH:
 	if (*value >= devclass_get_maxunit(ata_devclass) ||
 	    !(device = devclass_get_device(ata_devclass, *value)) ||
-	    !device_is_attached(device)) {
-            newbus_xunlock();
+	    !device_is_attached(device))
 	    return ENXIO;
-	}
 	error = DEVICE_DETACH(device);
 	break;
 
     case IOCATADEVICES:
 	if (devices->channel >= devclass_get_maxunit(ata_devclass) ||
 	    !(device = devclass_get_device(ata_devclass, devices->channel)) ||
-	    !device_is_attached(device)) {
-            newbus_xunlock();
+	    !device_is_attached(device))
 	    return ENXIO;
-	}
 	bzero(devices->name[0], 32);
 	bzero(&devices->params[0], sizeof(struct ata_params));
 	bzero(devices->name[1], 32);
@@ -473,7 +465,6 @@
 	if (ata_raid_ioctl_func)
 	    error = ata_raid_ioctl_func(cmd, data);
     }
-    newbus_xunlock();
     return error;
 }
 
@@ -581,7 +572,7 @@
     struct ata_channel *ch;
     int ctlr;
 
-    newbus_xlock();
+    mtx_lock(&Giant);       /* newbus suckage it needs Giant */
 
     /* kick of probe and attach on all channels */
     for (ctlr = 0; ctlr < devclass_get_maxunit(ata_devclass); ctlr++) {
@@ -596,7 +587,8 @@
 	free(ata_delayed_attach, M_TEMP);
 	ata_delayed_attach = NULL;
     }
-    newbus_xunlock();
+
+    mtx_unlock(&Giant);     /* newbus suckage dealt with, release Giant */
 }
 
 
@@ -725,6 +717,7 @@
     if (bootverbose)
 	device_printf(dev, "Identifying devices: %08x\n", ch->devices);
 
+    mtx_lock(&Giant);
     /* Skip existing devices. */
     if (!device_get_children(dev, &children, &nchildren)) {
 	for (i = 0; i < nchildren; i++) {
@@ -736,8 +729,10 @@
     /* Create new devices. */
     if (bootverbose)
 	device_printf(dev, "New devices: %08x\n", n);
-    if (n == 0)
+    if (n == 0) {
+	mtx_unlock(&Giant);
 	return (0);
+    }
     for (i = 0; i < ATA_PM; ++i) {
 	if (n & (((ATA_ATA_MASTER | ATA_ATAPI_MASTER) << i))) {
 	    int unit = -1;
@@ -780,6 +775,7 @@
     }
     bus_generic_probe(dev);
     bus_generic_attach(dev);
+    mtx_unlock(&Giant);
     return 0;
 }
 

==== //depot/projects/usb/src/sys/dev/atkbdc/psm.c#12 (text+ko) ====

@@ -59,7 +59,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/atkbdc/psm.c,v 1.104 2009/08/02 14:28:40 attilio Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/atkbdc/psm.c,v 1.105 2009/08/20 19:17:53 jhb Exp $");
 
 #include "opt_isa.h"
 #include "opt_psm.h"
@@ -1488,9 +1488,7 @@
 	if (sc->state & PSM_OPEN)
 		return (EBUSY);
 
-	newbus_xlock();
 	device_busy(devclass_get_device(psm_devclass, unit));
-	newbus_xunlock();
 
 	/* Initialize state */
 	sc->mode.level = sc->dflt_mode.level;
@@ -1645,9 +1643,7 @@
 	/* close is almost always successful */
 	sc->state &= ~PSM_OPEN;
 	kbdc_lock(sc->kbdc, FALSE);
-	newbus_xlock();
 	device_unbusy(devclass_get_device(psm_devclass, unit));
-	newbus_xunlock();
 	return (0);
 }
 

==== //depot/projects/usb/src/sys/dev/bge/if_bge.c#20 (text+ko) ====

@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/bge/if_bge.c,v 1.226 2009/06/26 11:45:06 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/bge/if_bge.c,v 1.227 2009/08/18 21:07:39 stas Exp $");
 
 /*
  * Broadcom BCM570x family gigabit ethernet driver for FreeBSD.
@@ -3055,12 +3055,14 @@
 {
 	struct ifnet *ifp;
 	int rx_npkts = 0, stdcnt = 0, jumbocnt = 0;
+	uint16_t rx_prod, rx_cons;
 
 	BGE_LOCK_ASSERT(sc);
+	rx_cons = sc->bge_rx_saved_considx;
+	rx_prod = sc->bge_ldata.bge_status_block->bge_idx[0].bge_rx_prod_idx;
 
 	/* Nothing to do. */
-	if (sc->bge_rx_saved_considx ==
-	    sc->bge_ldata.bge_status_block->bge_idx[0].bge_rx_prod_idx)
+	if (rx_cons == rx_prod)
 		return (rx_npkts);
 
 	ifp = sc->bge_ifp;
@@ -3073,8 +3075,7 @@
 		bus_dmamap_sync(sc->bge_cdata.bge_rx_jumbo_ring_tag,
 		    sc->bge_cdata.bge_rx_jumbo_ring_map, BUS_DMASYNC_POSTREAD);
 
-	while (sc->bge_rx_saved_considx !=
-	    sc->bge_ldata.bge_status_block->bge_idx[0].bge_rx_prod_idx) {
+	while (rx_cons != rx_prod) {
 		struct bge_rx_bd	*cur_rx;
 		uint32_t		rxidx;
 		struct mbuf		*m = NULL;
@@ -3089,11 +3090,10 @@
 		}
 #endif
 
-		cur_rx =
-	    &sc->bge_ldata.bge_rx_return_ring[sc->bge_rx_saved_considx];
+		cur_rx = &sc->bge_ldata.bge_rx_return_ring[rx_cons];
 
 		rxidx = cur_rx->bge_idx;
-		BGE_INC(sc->bge_rx_saved_considx, sc->bge_return_ring_cnt);
+		BGE_INC(rx_cons, sc->bge_return_ring_cnt);
 
 		if (ifp->if_capenable & IFCAP_VLAN_HWTAGGING &&
 		    cur_rx->bge_flags & BGE_RXBDFLAG_VLAN_TAG) {

>>> TRUNCATED FOR MAIL (1000 lines) <<<



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