svn commit: r196403 - in head/sys: dev/aac dev/acpica dev/adb dev/amdtemp dev/amr dev/ata dev/atkbdc dev/bktr dev/drm dev/ips dev/mfi dev/mlx dev/mmc dev/pccbb dev/pst dev/rp dev/sound/pci/hda dev/...

John Baldwin jhb at FreeBSD.org
Thu Aug 20 19:17:54 UTC 2009


Author: jhb
Date: Thu Aug 20 19:17:53 2009
New Revision: 196403
URL: http://svn.freebsd.org/changeset/base/196403

Log:
  Temporarily revert the new-bus locking for 8.0 release.  It will be
  reintroduced after HEAD is reopened for commits by re at .
  
  Approved by:	re (kib), attilio

Modified:
  head/sys/dev/aac/aac.c
  head/sys/dev/acpica/acpi.c
  head/sys/dev/acpica/acpi_battery.c
  head/sys/dev/acpica/acpi_cpu.c
  head/sys/dev/acpica/acpi_dock.c
  head/sys/dev/acpica/acpi_thermal.c
  head/sys/dev/adb/adb_bus.c
  head/sys/dev/amdtemp/amdtemp.c
  head/sys/dev/amr/amr.c
  head/sys/dev/ata/ata-all.c
  head/sys/dev/atkbdc/psm.c
  head/sys/dev/bktr/bktr_os.c
  head/sys/dev/drm/drm_drv.c
  head/sys/dev/ips/ips_pci.c
  head/sys/dev/mfi/mfi.c
  head/sys/dev/mlx/mlx.c
  head/sys/dev/mmc/mmc.c
  head/sys/dev/pccbb/pccbb.c
  head/sys/dev/pst/pst-iop.c
  head/sys/dev/rp/rp.c
  head/sys/dev/sound/pci/hda/hdac.c
  head/sys/dev/twe/twe.c
  head/sys/dev/usb/controller/usb_controller.c
  head/sys/dev/usb/input/ukbd.c
  head/sys/dev/usb/net/usb_ethernet.c
  head/sys/dev/usb/usb_compat_linux.c
  head/sys/dev/usb/usb_dev.c
  head/sys/dev/usb/usb_handle_request.c
  head/sys/dev/usb/usb_hub.c
  head/sys/dev/usb/wlan/if_upgt.c
  head/sys/dev/xen/blkback/blkback.c
  head/sys/dev/xen/netback/netback.c
  head/sys/i386/acpica/acpi_machdep.c
  head/sys/i386/bios/smapi.c
  head/sys/i386/bios/smbios.c
  head/sys/i386/bios/vpd.c
  head/sys/kern/subr_bus.c
  head/sys/pc98/cbus/fdc.c
  head/sys/sys/bus.h
  head/sys/xen/xenbus/xenbus_probe.c

Modified: head/sys/dev/aac/aac.c
==============================================================================
--- head/sys/dev/aac/aac.c	Thu Aug 20 14:20:56 2009	(r196402)
+++ head/sys/dev/aac/aac.c	Thu Aug 20 19:17:53 2009	(r196403)
@@ -3270,10 +3270,10 @@ aac_handle_aif(struct aac_softc *sc, str
 			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 @@ aac_handle_aif(struct aac_softc *sc, str
 			/* 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);
 			}
 

Modified: head/sys/dev/acpica/acpi.c
==============================================================================
--- head/sys/dev/acpica/acpi.c	Thu Aug 20 14:20:56 2009	(r196402)
+++ head/sys/dev/acpica/acpi.c	Thu Aug 20 19:17:53 2009	(r196403)
@@ -675,6 +675,8 @@ acpi_suspend(device_t dev)
     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 @@ acpi_resume(device_t dev)
     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 @@ static int
 acpi_shutdown(device_t dev)
 {
 
+    GIANT_REQUIRED;
+
     /* Allow children to shutdown first. */
     bus_generic_shutdown(dev);
 
@@ -2528,7 +2534,11 @@ acpi_EnterSleepState(struct acpi_softc *
     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 @@ backout:
     if (slp_state >= ACPI_SS_SLEPT)
 	acpi_enable_fixed_events(sc);
 
-    newbus_xunlock();
+    mtx_unlock(&Giant);
 
 #ifdef SMP
     thread_lock(curthread);

Modified: head/sys/dev/acpica/acpi_battery.c
==============================================================================
--- head/sys/dev/acpica/acpi_battery.c	Thu Aug 20 14:20:56 2009	(r196402)
+++ head/sys/dev/acpica/acpi_battery.c	Thu Aug 20 19:17:53 2009	(r196403)
@@ -329,7 +329,6 @@ acpi_battery_find_dev(u_int logical_unit
 
     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 @@ acpi_battery_find_dev(u_int logical_unit
 	found_unit++;
 	dev = NULL;
     }
-    newbus_sunlock();
 
     return (dev);
 }
@@ -371,17 +369,13 @@ acpi_battery_ioctl(u_long cmd, caddr_t a
      */
     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 @@ acpi_battery_sysctl(SYSCTL_HANDLER_ARGS)
 {
     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 @@ acpi_battery_units_sysctl(SYSCTL_HANDLER
 {
     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);

Modified: head/sys/dev/acpica/acpi_cpu.c
==============================================================================
--- head/sys/dev/acpica/acpi_cpu.c	Thu Aug 20 14:20:56 2009	(r196402)
+++ head/sys/dev/acpica/acpi_cpu.c	Thu Aug 20 19:17:53 2009	(r196403)
@@ -732,9 +732,7 @@ acpi_cpu_startup(void *arg)
     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

Modified: head/sys/dev/acpica/acpi_dock.c
==============================================================================
--- head/sys/dev/acpica/acpi_dock.c	Thu Aug 20 14:20:56 2009	(r196402)
+++ head/sys/dev/acpica/acpi_dock.c	Thu Aug 20 19:17:53 2009	(r196403)
@@ -188,12 +188,12 @@ acpi_dock_attach_later(void *context)
 
 	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 @@ acpi_dock_eject_child(ACPI_HANDLE handle
 	    "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:

Modified: head/sys/dev/acpica/acpi_thermal.c
==============================================================================
--- head/sys/dev/acpica/acpi_thermal.c	Thu Aug 20 14:20:56 2009	(r196402)
+++ head/sys/dev/acpica/acpi_thermal.c	Thu Aug 20 19:17:53 2009	(r196403)
@@ -936,8 +936,6 @@ acpi_tz_thread(void *arg)
     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 @@ acpi_tz_thread(void *arg)
 	    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++) {

Modified: head/sys/dev/adb/adb_bus.c
==============================================================================
--- head/sys/dev/adb/adb_bus.c	Thu Aug 20 14:20:56 2009	(r196402)
+++ head/sys/dev/adb/adb_bus.c	Thu Aug 20 19:17:53 2009	(r196403)
@@ -113,7 +113,6 @@ adb_bus_enumerate(void *xdev)
 	uint8_t i, next_free;
 	uint16_t r3;
 
-	newbus_xlock();
 	sc->sc_dev = dev;
 	sc->parent = device_get_parent(dev);
 
@@ -188,7 +187,6 @@ adb_bus_enumerate(void *xdev)
 	}
 
 	bus_generic_attach(dev);
-	newbus_xunlock();
 
 	config_intrhook_disestablish(&sc->enum_hook);
 }

Modified: head/sys/dev/amdtemp/amdtemp.c
==============================================================================
--- head/sys/dev/amdtemp/amdtemp.c	Thu Aug 20 14:20:56 2009	(r196402)
+++ head/sys/dev/amdtemp/amdtemp.c	Thu Aug 20 19:17:53 2009	(r196403)
@@ -269,7 +269,6 @@ amdtemp_intrhook(void *arg)
 	/*
 	 * 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 @@ amdtemp_intrhook(void *arg)
 			    "Max of sensor 0 / 1");
 		}
 	}
-	newbus_xunlock();
 	config_intrhook_disestablish(&sc->sc_ich);
 }
 

Modified: head/sys/dev/amr/amr.c
==============================================================================
--- head/sys/dev/amr/amr.c	Thu Aug 20 14:20:56 2009	(r196402)
+++ head/sys/dev/amr/amr.c	Thu Aug 20 19:17:53 2009	(r196403)
@@ -90,10 +90,6 @@ __FBSDID("$FreeBSD$");
 
 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 @@ amr_startup(void *arg)
 	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 @@ amr_startup(void *arg)
 
     /* interrupts will be enabled before we do anything more */
     sc->amr_state |= AMR_STATE_INTEN;
-    newbus_xunlock();
 
     /*
      * Start the timeout routine.
@@ -441,11 +434,7 @@ static int
 amr_open(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);
 
@@ -501,11 +490,7 @@ static int
 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 @@ amr_rescan_drives(struct cdev *dev)
     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 @@ amr_rescan_drives(struct cdev *dev)
 	     sc->amr_drive[i].al_disk = 0;
 	}
     }
-    newbus_xunlock();
 
 shutdown_out:
     amr_startup(sc);
@@ -822,9 +805,7 @@ amr_ioctl(struct cdev *dev, u_long cmd, 
 	    struct amr_linux_ioctl	ali;
 	    int				adapter, error;
 
-	    newbus_slock();
 	    devclass = devclass_find("amr");
-	    newbus_sunlock();
 	    if (devclass == NULL)
 		return (ENOENT);
 

Modified: head/sys/dev/ata/ata-all.c
==============================================================================
--- head/sys/dev/ata/ata-all.c	Thu Aug 20 14:20:56 2009	(r196402)
+++ head/sys/dev/ata/ata-all.c	Thu Aug 20 19:17:53 2009	(r196403)
@@ -54,6 +54,7 @@ __FBSDID("$FreeBSD$");
 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 @@ ata_conn_event(void *context, int dummy)
 {
     device_t dev = (device_t)context;
 
-    newbus_xlock();
     ata_reinit(dev);
-    newbus_xunlock();
 }
 
 int
@@ -247,6 +246,7 @@ ata_reinit(device_t dev)
 
     /* 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 @@ ata_reinit(device_t dev)
 	    }
 	}
 	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 @@ ata_ioctl(struct cdev *dev, u_long cmd, 
     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 @@ ata_ioctl(struct cdev *dev, u_long cmd, 
     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 @@ ata_ioctl(struct cdev *dev, u_long cmd, 
 	if (ata_raid_ioctl_func)
 	    error = ata_raid_ioctl_func(cmd, data);
     }
-    newbus_xunlock();
     return error;
 }
 
@@ -581,7 +572,7 @@ ata_boot_attach(void)
     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 @@ ata_boot_attach(void)
 	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 @@ ata_identify(device_t dev)
     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 @@ ata_identify(device_t dev)
     /* 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 @@ ata_identify(device_t dev)
     }
     bus_generic_probe(dev);
     bus_generic_attach(dev);
+    mtx_unlock(&Giant);
     return 0;
 }
 

Modified: head/sys/dev/atkbdc/psm.c
==============================================================================
--- head/sys/dev/atkbdc/psm.c	Thu Aug 20 14:20:56 2009	(r196402)
+++ head/sys/dev/atkbdc/psm.c	Thu Aug 20 19:17:53 2009	(r196403)
@@ -1488,9 +1488,7 @@ psmopen(struct cdev *dev, int flag, int 
 	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 @@ psmclose(struct cdev *dev, int flag, int
 	/* 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);
 }
 

Modified: head/sys/dev/bktr/bktr_os.c
==============================================================================
--- head/sys/dev/bktr/bktr_os.c	Thu Aug 20 14:20:56 2009	(r196402)
+++ head/sys/dev/bktr/bktr_os.c	Thu Aug 20 19:17:53 2009	(r196403)
@@ -597,9 +597,7 @@ bktr_open( struct cdev *dev, int flags, 
 		return( ENXIO );	
 
 	/* Record that the device is now busy */
-	newbus_xlock();
 	device_busy(devclass_get_device(bktr_devclass, unit)); 
-	newbus_xunlock();
 
 
 	if (bt848_card != -1) {
@@ -670,11 +668,8 @@ bktr_open( struct cdev *dev, int flags, 
 	}
 
 	/* If there was an error opening the device, undo the busy status */
-	if (result != 0) {
-		newbus_xlock();
+	if (result != 0)
 		device_unbusy(devclass_get_device(bktr_devclass, unit)); 
-		newbus_xunlock();
-	}
 	return( result );
 }
 
@@ -694,7 +689,6 @@ bktr_close( struct cdev *dev, int flags,
 	/* Get the device data */
 	bktr = (struct bktr_softc*)devclass_get_softc(bktr_devclass, unit);
 	if (bktr == NULL) {
-
 		/* the device is no longer valid/functioning */
 		return (ENXIO);
 	}
@@ -711,11 +705,10 @@ bktr_close( struct cdev *dev, int flags,
 		break;
 	default:
 		return (ENXIO);
+		break;
 	}
 
-	newbus_xlock();
 	device_unbusy(devclass_get_device(bktr_devclass, unit)); 
-	newbus_xunlock();
 	return( result );
 }
 

Modified: head/sys/dev/drm/drm_drv.c
==============================================================================
--- head/sys/dev/drm/drm_drv.c	Thu Aug 20 14:20:56 2009	(r196402)
+++ head/sys/dev/drm/drm_drv.c	Thu Aug 20 19:17:53 2009	(r196403)
@@ -614,13 +614,11 @@ int drm_open(struct cdev *kdev, int flag
 
 	if (!retcode) {
 		atomic_inc(&dev->counts[_DRM_STAT_OPENS]);
-		newbus_xlock();
 		DRM_LOCK();
 		device_busy(dev->device);
 		if (!dev->open_count++)
 			retcode = drm_firstopen(dev);
 		DRM_UNLOCK();
-		newbus_xunlock();
 	}
 
 	return retcode;
@@ -634,11 +632,6 @@ void drm_close(void *data)
 
 	DRM_DEBUG("open_count = %d\n", dev->open_count);
 
-	/*
-	 * We require to lock newbus here for handling device_unbusy() and
-	 * avoid a LOR with DRM_LOCK.
-	 */
-	newbus_xlock();
 	DRM_LOCK();
 
 	if (dev->driver->preclose != NULL)
@@ -715,7 +708,6 @@ void drm_close(void *data)
 	}
 
 	DRM_UNLOCK();
-	newbus_xunlock();
 }
 
 /* drm_ioctl is called whenever a process performs an ioctl on /dev/drm.

Modified: head/sys/dev/ips/ips_pci.c
==============================================================================
--- head/sys/dev/ips/ips_pci.c	Thu Aug 20 14:20:56 2009	(r196402)
+++ head/sys/dev/ips/ips_pci.c	Thu Aug 20 19:17:53 2009	(r196403)
@@ -173,12 +173,10 @@ ips_intrhook(void *arg)
 	struct ips_softc *sc = (struct ips_softc *)arg;
 
 	config_intrhook_disestablish(&sc->ips_ich);
-	newbus_xlock();
 	if (ips_adapter_init(sc))
 		ips_pci_free(sc);
 	else
 		sc->configured = 1;
-	newbus_xunlock();
 }
 
 static int ips_pci_free(ips_softc_t *sc)

Modified: head/sys/dev/mfi/mfi.c
==============================================================================
--- head/sys/dev/mfi/mfi.c	Thu Aug 20 14:20:56 2009	(r196402)
+++ head/sys/dev/mfi/mfi.c	Thu Aug 20 19:17:53 2009	(r196403)
@@ -1327,11 +1327,11 @@ mfi_add_ld_complete(struct mfi_command *
 	mfi_release_command(cm);
 
 	mtx_unlock(&sc->mfi_io_lock);
-	newbus_xlock();
+	mtx_lock(&Giant);
 	if ((child = device_add_child(sc->mfi_dev, "mfid", -1)) == NULL) {
 		device_printf(sc->mfi_dev, "Failed to add logical disk\n");
 		free(ld_info, M_MFIBUF);
-		newbus_xunlock();
+		mtx_unlock(&Giant);
 		mtx_lock(&sc->mfi_io_lock);
 		return;
 	}
@@ -1339,7 +1339,7 @@ mfi_add_ld_complete(struct mfi_command *
 	device_set_ivars(child, ld_info);
 	device_set_desc(child, "MFI Logical Disk");
 	bus_generic_attach(sc->mfi_dev);
-	newbus_xunlock();
+	mtx_unlock(&Giant);
 	mtx_lock(&sc->mfi_io_lock);
 }
 
@@ -1805,9 +1805,9 @@ mfi_check_command_post(struct mfi_softc 
 		KASSERT(ld != NULL, ("volume dissappeared"));
 		if (cm->cm_frame->header.cmd_status == MFI_STAT_OK) {
 			mtx_unlock(&sc->mfi_io_lock);
-			newbus_xlock();
+			mtx_lock(&Giant);
 			device_delete_child(sc->mfi_dev, ld->ld_dev);
-			newbus_xunlock();
+			mtx_unlock(&Giant);
 			mtx_lock(&sc->mfi_io_lock);
 		} else
 			mfi_disk_enable(ld);
@@ -1815,11 +1815,11 @@ mfi_check_command_post(struct mfi_softc 
 	case MFI_DCMD_CFG_CLEAR:
 		if (cm->cm_frame->header.cmd_status == MFI_STAT_OK) {
 			mtx_unlock(&sc->mfi_io_lock);
-			newbus_xlock();
+			mtx_lock(&Giant);
 			TAILQ_FOREACH_SAFE(ld, &sc->mfi_ld_tqh, ld_link, ldn) {
 				device_delete_child(sc->mfi_dev, ld->ld_dev);
 			}
-			newbus_xunlock();
+			mtx_unlock(&Giant);
 			mtx_lock(&sc->mfi_io_lock);
 		} else {
 			TAILQ_FOREACH(ld, &sc->mfi_ld_tqh, ld_link)
@@ -1985,9 +1985,7 @@ mfi_ioctl(struct cdev *dev, u_long cmd, 
 
 		adapter = ioc->mfi_adapter_no;
 		if (device_get_unit(sc->mfi_dev) == 0 && adapter != 0) {
-			newbus_slock();
 			devclass = devclass_find("mfi");
-			newbus_sunlock();
 			sc = devclass_get_softc(devclass, adapter);
 		}
 		mtx_lock(&sc->mfi_io_lock);
@@ -2175,9 +2173,7 @@ out:
 			struct mfi_linux_ioc_packet l_ioc;
 			int adapter;
 
-			newbus_slock();
 			devclass = devclass_find("mfi");
-			newbus_sunlock();
 			if (devclass == NULL)
 				return (ENOENT);
 
@@ -2198,9 +2194,7 @@ out:
 			struct mfi_linux_ioc_aen l_aen;
 			int adapter;
 
-			newbus_slock();
 			devclass = devclass_find("mfi");
-			newbus_sunlock();
 			if (devclass == NULL)
 				return (ENOENT);
 

Modified: head/sys/dev/mlx/mlx.c
==============================================================================
--- head/sys/dev/mlx/mlx.c	Thu Aug 20 14:20:56 2009	(r196402)
+++ head/sys/dev/mlx/mlx.c	Thu Aug 20 19:17:53 2009	(r196403)
@@ -772,9 +772,7 @@ mlx_ioctl(struct cdev *dev, u_long cmd, 
 	 * Scan the controller to see whether new drives have appeared.
 	 */
     case MLX_RESCAN_DRIVES:
-	newbus_xlock();
 	mlx_startup(sc);
-	newbus_xunlock();
 	return(0);
 
 	/*

Modified: head/sys/dev/mmc/mmc.c
==============================================================================
--- head/sys/dev/mmc/mmc.c	Thu Aug 20 14:20:56 2009	(r196402)
+++ head/sys/dev/mmc/mmc.c	Thu Aug 20 19:17:53 2009	(r196403)
@@ -1496,9 +1496,7 @@ mmc_delayed_attach(void *xsc)
 {
 	struct mmc_softc *sc = xsc;
 	
-	newbus_xlock();
 	mmc_scan(sc);
-	newbus_xunlock();
 	config_intrhook_disestablish(&sc->config_intrhook);
 }
 

Modified: head/sys/dev/pccbb/pccbb.c
==============================================================================
--- head/sys/dev/pccbb/pccbb.c	Thu Aug 20 14:20:56 2009	(r196402)
+++ head/sys/dev/pccbb/pccbb.c	Thu Aug 20 19:17:53 2009	(r196403)
@@ -464,7 +464,14 @@ cbb_event_thread(void *arg)
 	sc->flags |= CBB_KTHREAD_RUNNING;
 	while ((sc->flags & CBB_KTHREAD_DONE) == 0) {
 		mtx_unlock(&sc->mtx);
-		newbus_xlock();
+		/*
+		 * We take out Giant here because we need it deep,
+		 * down in the bowels of the vm system for mapping the
+		 * memory we need to read the CIS.  In addition, since
+		 * we are adding/deleting devices from the dev tree,
+		 * and that code isn't MP safe, we have to hold Giant.
+		 */
+		mtx_lock(&Giant);
 		status = cbb_get(sc, CBB_SOCKET_STATE);
 		DPRINTF(("Status is 0x%x\n", status));
 		if (!CBB_CARD_PRESENT(status)) {
@@ -490,7 +497,7 @@ cbb_event_thread(void *arg)
 			not_a_card = 0;		/* We know card type */
 			cbb_insert(sc);
 		}
-		newbus_xunlock();
+		mtx_unlock(&Giant);
 
 		/*
 		 * First time through we need to tell mountroot that we're

Modified: head/sys/dev/pst/pst-iop.c
==============================================================================
--- head/sys/dev/pst/pst-iop.c	Thu Aug 20 14:20:56 2009	(r196402)
+++ head/sys/dev/pst/pst-iop.c	Thu Aug 20 19:17:53 2009	(r196403)
@@ -152,9 +152,7 @@ iop_attach(void *arg)
 	    break;
 
 	case I2O_CLASS_RANDOM_BLOCK_STORAGE:
-	    newbus_xlock();
 	    pst_add_raid(sc, &sc->lct[i]);
-	    newbus_xunlock();
 	    break;
 	}
     }

Modified: head/sys/dev/rp/rp.c
==============================================================================
--- head/sys/dev/rp/rp.c	Thu Aug 20 14:20:56 2009	(r196402)
+++ head/sys/dev/rp/rp.c	Thu Aug 20 19:17:53 2009	(r196403)
@@ -903,9 +903,7 @@ rpopen(struct tty *tp)
 		rp_callout_handle = timeout(rp_do_poll, 
 					    (void *)NULL, POLL_INTERVAL);
 
-	newbus_xlock();
 	device_busy(rp->rp_ctlp->dev);
-	newbus_xunlock();
 	return(0);
 }
 
@@ -916,9 +914,7 @@ rpclose(struct tty *tp)
 
 	rp = tty_softc(tp);
 	rphardclose(tp);
-	newbus_xlock();
 	device_unbusy(rp->rp_ctlp->dev);
-	newbus_xunlock();
 }
 
 static void

Modified: head/sys/dev/sound/pci/hda/hdac.c
==============================================================================
--- head/sys/dev/sound/pci/hda/hdac.c	Thu Aug 20 14:20:56 2009	(r196402)
+++ head/sys/dev/sound/pci/hda/hdac.c	Thu Aug 20 19:17:53 2009	(r196403)
@@ -7435,7 +7435,6 @@ hdac_attach2(void *arg)
 		    quirks_on, quirks_off);
 	);
 
-	newbus_xlock();
 	hdac_lock(sc);
 
 	/* Remove ourselves from the config hooks */
@@ -7675,7 +7674,6 @@ hdac_attach2(void *arg)
 	    SYSCTL_CHILDREN(device_get_sysctl_tree(sc->dev)), OID_AUTO,
 	    "pindump", CTLTYPE_INT | CTLFLAG_RW, sc->dev, sizeof(sc->dev),
 	    sysctl_hdac_pindump, "I", "Dump pin states/data");
-	newbus_xunlock();
 }
 
 /****************************************************************************

Modified: head/sys/dev/twe/twe.c
==============================================================================
--- head/sys/dev/twe/twe.c	Thu Aug 20 14:20:56 2009	(r196402)
+++ head/sys/dev/twe/twe.c	Thu Aug 20 19:17:53 2009	(r196403)
@@ -294,10 +294,8 @@ twe_init(struct twe_softc *sc)
     /*
      * Scan for drives
      */
-    newbus_xlock();
     for (i = 0; i < TWE_MAX_UNITS; i++)
 	twe_add_unit(sc, i);
-    newbus_xunlock();
 
     /*
      * Initialise connection with controller.
@@ -623,15 +621,11 @@ twe_ioctl(struct twe_softc *sc, int ioct
 	break;
 
     case TWEIO_ADD_UNIT:
-	newbus_xlock();
 	error = twe_add_unit(sc, td->td_unit);
-	newbus_xunlock();
 	break;
 
     case TWEIO_DEL_UNIT:
-	newbus_xlock();
 	error = twe_del_unit(sc, td->td_unit);
-	newbus_xunlock();
 	break;
 
 	/* XXX implement ATA PASSTHROUGH */

Modified: head/sys/dev/usb/controller/usb_controller.c
==============================================================================
--- head/sys/dev/usb/controller/usb_controller.c	Thu Aug 20 14:20:56 2009	(r196402)
+++ head/sys/dev/usb/controller/usb_controller.c	Thu Aug 20 19:17:53 2009	(r196403)
@@ -143,7 +143,9 @@ usb_attach(device_t dev)
 	}
 
 	if (usb_post_init_called) {
+		mtx_lock(&Giant);
 		usb_attach_sub(dev, bus);
+		mtx_unlock(&Giant);
 		usb_needs_explore(bus, 1);
 	}
 	return (0);			/* return success */
@@ -226,13 +228,20 @@ usb_bus_explore(struct usb_proc_msg *pm)
 		}
 		USB_BUS_UNLOCK(bus);
 
+		mtx_lock(&Giant);
+
 		/*
 		 * First update the USB power state!
 		 */
 		usb_bus_powerd(bus);
-
-		 /* Explore the Root USB HUB. */
+		/*
+		 * Explore the Root USB HUB. This call can sleep,
+		 * exiting Giant, which is actually Giant.
+		 */
 		(udev->hub->explore) (udev);
+
+		mtx_unlock(&Giant);
+
 		USB_BUS_LOCK(bus);
 	}
 	if (bus->bus_roothold != NULL) {
@@ -260,7 +269,7 @@ usb_bus_detach(struct usb_proc_msg *pm)
 	device_set_softc(dev, NULL);
 	USB_BUS_UNLOCK(bus);
 
-	newbus_xlock();
+	mtx_lock(&Giant);
 
 	/* detach children first */
 	bus_generic_detach(dev);
@@ -272,7 +281,7 @@ usb_bus_detach(struct usb_proc_msg *pm)
 	usb_free_device(udev,
 	    USB_UNCFG_FLAG_FREE_EP0);
 
-	newbus_xunlock();
+	mtx_unlock(&Giant);
 	USB_BUS_LOCK(bus);
 	/* clear bdev variable last */
 	bus->bdev = NULL;
@@ -341,7 +350,7 @@ usb_bus_attach(struct usb_proc_msg *pm)
 	}
 
 	USB_BUS_UNLOCK(bus);
-	newbus_xlock();
+	mtx_lock(&Giant);		/* XXX not required by USB */
 
 	/* default power_mask value */
 	bus->hw_power_state =
@@ -374,7 +383,7 @@ usb_bus_attach(struct usb_proc_msg *pm)
 		err = USB_ERR_NOMEM;
 	}
 
-	newbus_xunlock();
+	mtx_unlock(&Giant);
 	USB_BUS_LOCK(bus);
 
 	if (err) {
@@ -463,7 +472,7 @@ usb_post_init(void *arg)
 	int max;
 	int n;
 
-	newbus_xlock();
+	mtx_lock(&Giant);
 
 	usb_devclass_ptr = devclass_find("usbus");
 
@@ -474,8 +483,11 @@ usb_post_init(void *arg)
 			dev = devclass_get_device(dc, n);
 			if (dev && device_is_attached(dev)) {
 				bus = device_get_ivars(dev);
-				if (bus)
+				if (bus) {
+					mtx_lock(&Giant);
 					usb_attach_sub(dev, bus);
+					mtx_unlock(&Giant);
+				}
 			}
 		}
 	} else {
@@ -487,7 +499,7 @@ usb_post_init(void *arg)
 
 	usb_needs_explore_all();
 
-	newbus_xunlock();
+	mtx_unlock(&Giant);
 }
 
 SYSINIT(usb_post_init, SI_SUB_KICK_SCHEDULER, SI_ORDER_ANY, usb_post_init, NULL);

Modified: head/sys/dev/usb/input/ukbd.c
==============================================================================
--- head/sys/dev/usb/input/ukbd.c	Thu Aug 20 14:20:56 2009	(r196402)
+++ head/sys/dev/usb/input/ukbd.c	Thu Aug 20 19:17:53 2009	(r196403)
@@ -745,7 +745,7 @@ ukbd_attach(device_t dev)
 	uint16_t n;
 	uint16_t hid_len;
 
-	mtx_lock(&Giant);
+	mtx_assert(&Giant, MA_OWNED);
 
 	kbd_init_struct(kbd, UKBD_DRIVER_NAME, KB_OTHER, unit, 0, 0, 0);
 
@@ -854,6 +854,9 @@ ukbd_attach(device_t dev)
 	if (bootverbose) {
 		genkbd_diag(kbd, bootverbose);
 	}
+	/* lock keyboard mutex */
+
+	mtx_lock(&Giant);
 
 	/* start the keyboard */
 
@@ -876,7 +879,7 @@ ukbd_detach(device_t dev)
 	struct ukbd_softc *sc = device_get_softc(dev);
 	int error;
 
-	mtx_lock(&Giant);
+	mtx_assert(&Giant, MA_OWNED);
 
 	DPRINTF("\n");
 
@@ -913,8 +916,6 @@ ukbd_detach(device_t dev)
 
 	usb_callout_drain(&sc->sc_callout);
 
-	mtx_unlock(&Giant);
-
 	DPRINTF("%s: disconnected\n",
 	    device_get_nameunit(dev));
 
@@ -926,9 +927,9 @@ ukbd_resume(device_t dev)
 {
 	struct ukbd_softc *sc = device_get_softc(dev);
 
-	mtx_lock(&Giant);
+	mtx_assert(&Giant, MA_OWNED);
+
 	ukbd_clear_state(&sc->sc_kbd);
-	mtx_unlock(&Giant);
 
 	return (0);
 }

Modified: head/sys/dev/usb/net/usb_ethernet.c
==============================================================================
--- head/sys/dev/usb/net/usb_ethernet.c	Thu Aug 20 14:20:56 2009	(r196402)
+++ head/sys/dev/usb/net/usb_ethernet.c	Thu Aug 20 19:17:53 2009	(r196403)
@@ -221,10 +221,10 @@ ue_attach_post_task(struct usb_proc_msg 
 
 	if (ue->ue_methods->ue_mii_upd != NULL && 
 	    ue->ue_methods->ue_mii_sts != NULL) {
-		newbus_xlock();
+		mtx_lock(&Giant);	/* device_xxx() depends on this */
 		error = mii_phy_probe(ue->ue_dev, &ue->ue_miibus,
 		    ue_ifmedia_upd, ue->ue_methods->ue_mii_sts);
-		newbus_xunlock();
+		mtx_unlock(&Giant);
 		if (error) {
 			device_printf(ue->ue_dev, "MII without any PHY\n");
 			goto error;
@@ -279,12 +279,9 @@ uether_ifdetach(struct usb_ether *ue)
 
 		/* detach miibus */
 		if (ue->ue_miibus != NULL) {
-
-			/*
-			 * It is up to the callers to provide the correct
-			 * newbus locking.
-			 */
+			mtx_lock(&Giant);	/* device_xxx() depends on this */
 			device_delete_child(ue->ue_dev, ue->ue_miibus);
+			mtx_unlock(&Giant);
 		}
 
 		/* detach ethernet */

Modified: head/sys/dev/usb/usb_compat_linux.c
==============================================================================
--- head/sys/dev/usb/usb_compat_linux.c	Thu Aug 20 14:20:56 2009	(r196402)
+++ head/sys/dev/usb/usb_compat_linux.c	Thu Aug 20 19:17:53 2009	(r196403)
@@ -215,12 +215,14 @@ usb_linux_probe(device_t dev)
 	if (uaa->usb_mode != USB_MODE_HOST) {
 		return (ENXIO);
 	}
+	mtx_lock(&Giant);
 	LIST_FOREACH(udrv, &usb_linux_driver_list, linux_driver_list) {
 		if (usb_linux_lookup_id(udrv->id_table, uaa)) {
 			err = 0;
 			break;
 		}
 	}
+	mtx_unlock(&Giant);
 
 	return (err);
 }
@@ -237,7 +239,9 @@ usb_linux_get_usb_driver(struct usb_linu
 {
 	struct usb_driver *udrv;
 

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***


More information about the svn-src-all mailing list