PERFORCE change 167571 for review
Hans Petter Selasky
hselasky at FreeBSD.org
Fri Aug 21 13:12:18 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=167571
Change 167571 by hselasky at 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) <<<
More information about the p4-projects
mailing list