From: Alexander Polakov Date: Sun, 1 Nov 2009 20:03:31 +0000 (+0300) Subject: Use lockmgr locks for ACPI_SERIAL_* X-Git-Tag: v2.7.1~380^2~13^2~3 X-Git-Url: https://gitweb.dragonflybsd.org/dragonfly.git/commitdiff_plain/5c7ffd75515b1761778ef9fbb9e1fa11212f5b4f Use lockmgr locks for ACPI_SERIAL_* Suggested by dillon@ --- diff --git a/sys/dev/acpica5/acpi.c b/sys/dev/acpica5/acpi.c index fd22ed0373..d5786f92e1 100644 --- a/sys/dev/acpica5/acpi.c +++ b/sys/dev/acpica5/acpi.c @@ -414,7 +414,6 @@ acpi_attach(device_t dev) ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); - //lwkt_serialize_init(&acpi_sxlock); sc = device_get_softc(dev); sc->acpi_dev = dev; callout_init(&sc->susp_force_to); @@ -441,9 +440,8 @@ acpi_attach(device_t dev) panic("acpi rman_init memory failed"); /* Initialise the ACPI mutex */ -#ifdef notyet - spin_init(&acpi_mutex); -#endif + ACPI_LOCK_INIT(acpi, "acpi"); + ACPI_SERIAL_INIT(acpi); /* * Set the globals from our tunables. This is needed because ACPI-CA @@ -2178,7 +2176,9 @@ acpi_sleep_force(void *arg) int acpi_ReqSleepState(struct acpi_softc *sc, int state) { +#ifdef notyet struct apm_clone_data *clone; +#endif if (state < ACPI_STATE_S1 || state > ACPI_STATE_S5) return (EINVAL); @@ -2622,7 +2622,7 @@ acpi_wake_sysctl_walk(device_t dev) kfree(devlist, M_TEMP); return (error); } -#ifdef notye +#ifdef notyet for (i = 0; i < numdevs; i++) { child = devlist[i]; acpi_wake_sysctl_walk(child); diff --git a/sys/dev/acpica5/acpi_acad.c b/sys/dev/acpica5/acpi_acad.c index 6fc7b7b9a1..059045d04c 100644 --- a/sys/dev/acpica5/acpi_acad.c +++ b/sys/dev/acpica5/acpi_acad.c @@ -164,6 +164,8 @@ acpi_acad_attach(device_t dev) if (error != 0) return (error); + ACPI_SERIAL_INIT(acad); + if (device_get_unit(dev) == 0) { acpi_sc = acpi_device_get_parent_softc(dev); SYSCTL_ADD_PROC(&acpi_sc->acpi_sysctl_ctx, diff --git a/sys/dev/acpica5/acpi_battery.c b/sys/dev/acpica5/acpi_battery.c index 93a58a9993..5e66ab24d0 100644 --- a/sys/dev/acpica5/acpi_battery.c +++ b/sys/dev/acpica5/acpi_battery.c @@ -66,6 +66,7 @@ acpi_battery_register(device_t dev) int error; error = 0; + ACPI_SERIAL_INIT(battery); ACPI_SERIAL_BEGIN(battery); if (!acpi_batteries_initted) error = acpi_battery_init(); diff --git a/sys/dev/acpica5/acpi_cmbat.c b/sys/dev/acpica5/acpi_cmbat.c index a69b4bcb80..bd8c781897 100644 --- a/sys/dev/acpica5/acpi_cmbat.c +++ b/sys/dev/acpica5/acpi_cmbat.c @@ -133,6 +133,8 @@ acpi_cmbat_attach(device_t dev) handle = acpi_get_handle(dev); sc->dev = dev; + ACPI_SERIAL_INIT(cmbat); + timespecclear(&sc->bst_lastupdated); error = acpi_battery_register(dev); diff --git a/sys/dev/acpica5/acpi_ec.c b/sys/dev/acpica5/acpi_ec.c index d5a7c86870..b2dc22c8e4 100644 --- a/sys/dev/acpica5/acpi_ec.c +++ b/sys/dev/acpica5/acpi_ec.c @@ -461,6 +461,7 @@ acpi_ec_attach(device_t dev) params = acpi_get_private(dev); sc->ec_dev = dev; sc->ec_handle = acpi_get_handle(dev); + ACPI_SERIAL_INIT(ec); /* Retrieve previously probed values via device ivars. */ sc->ec_glk = params->glk; diff --git a/sys/dev/acpica5/acpi_lid.c b/sys/dev/acpica5/acpi_lid.c index 9633839871..ba1ed01804 100644 --- a/sys/dev/acpica5/acpi_lid.c +++ b/sys/dev/acpica5/acpi_lid.c @@ -108,6 +108,8 @@ acpi_lid_attach(device_t dev) sc->lid_dev = dev; sc->lid_handle = acpi_get_handle(dev); + ACPI_SERIAL_INIT(lid); + /* * If a system does not get lid events, it may make sense to change * the type to ACPI_ALL_NOTIFY. Some systems generate both a wake and diff --git a/sys/dev/acpica5/acpi_pci.c b/sys/dev/acpica5/acpi_pci.c index 895d6e05c8..a008f53604 100644 --- a/sys/dev/acpica5/acpi_pci.c +++ b/sys/dev/acpica5/acpi_pci.c @@ -331,6 +331,8 @@ acpi_pci_attach(device_t dev) device_printf(dev, "domain=%d, physical bus=%d\n", domain, busno); + ACPI_SERIAL_INIT(pci_powerstate); + /* * First, PCI devices are added as in the normal PCI bus driver. * Afterwards, the ACPI namespace under the bridge driver is diff --git a/sys/dev/acpica5/acpi_pci_link.c b/sys/dev/acpica5/acpi_pci_link.c index 2e78cdf8fc..986fa6f8bb 100644 --- a/sys/dev/acpica5/acpi_pci_link.c +++ b/sys/dev/acpica5/acpi_pci_link.c @@ -434,6 +434,7 @@ acpi_pci_link_attach(device_t dev) sc = device_get_softc(dev); sc->pl_dev = dev; + ACPI_SERIAL_INIT(pci_link); ACPI_SERIAL_BEGIN(pci_link); /* diff --git a/sys/dev/acpica5/acpi_pcib.c b/sys/dev/acpica5/acpi_pcib.c index 425c6d5e41..03dddbd21f 100644 --- a/sys/dev/acpica5/acpi_pcib.c +++ b/sys/dev/acpica5/acpi_pcib.c @@ -146,6 +146,8 @@ acpi_pcib_attach(device_t dev, ACPI_BUFFER *prt, int busno) if (!acpi_DeviceIsPresent(dev)) return_VALUE(ENXIO); + ACPI_SERIAL_INIT(pcib); + /* * Get the PCI interrupt routing table for this bus. If we can't * get it, this is not an error but may reduce functionality. There diff --git a/sys/dev/acpica5/acpi_powerres.c b/sys/dev/acpica5/acpi_powerres.c index d5fee40bd6..126368051b 100644 --- a/sys/dev/acpica5/acpi_powerres.c +++ b/sys/dev/acpica5/acpi_powerres.c @@ -119,10 +119,11 @@ static struct acpi_powerconsumer static void acpi_pwr_init(void *junk) { + ACPI_SERIAL_INIT(powerres); TAILQ_INIT(&acpi_powerresources); TAILQ_INIT(&acpi_powerconsumers); } -// SYSINIT(acpi_powerresource, SI_SUB_TUNABLES, SI_ORDER_ANY, acpi_pwr_init, NULL); +SYSINIT(acpi_powerresource, SI_BOOT1_TUNABLES, SI_ORDER_ANY, acpi_pwr_init, NULL); /* * Register a power resource. diff --git a/sys/dev/acpica5/acpivar.h b/sys/dev/acpica5/acpivar.h index 5957d19f56..7ab19cfe17 100644 --- a/sys/dev/acpica5/acpivar.h +++ b/sys/dev/acpica5/acpivar.h @@ -38,7 +38,7 @@ #include "bus_if.h" #include #include -#if __FreeBSD_version >= 500000 +#if __FreeBSD_version >= 500000 || defined(__DragonFly__) #include #include #endif @@ -165,11 +165,11 @@ extern struct lock acpi_lock; #define ACPI_LOCK_DECL(sys, name) static struct lock sys##_lock; #define ACPI_LOCK_INIT(sys, name) lockinit(&sys##_lock, name, 0, 0); -#define ACPI_SERIAL_INIT(sys) lwkt_serialize_init(&sys##_serializer); -#define ACPI_SERIAL_BEGIN(sys) lwkt_serialize_enter(&sys##_serializer); -#define ACPI_SERIAL_END(sys) lwkt_serialize_exit(&sys##_serializer); -#define ACPI_SERIAL_ASSERT(sys) ASSERT_SERIALIZED(&sys##_serializer); -#define ACPI_SERIAL_DECL(sys, name) static struct lwkt_serialize sys##_serializer; +#define ACPI_SERIAL_INIT(sys) lockinit(&sys##_serial, #sys, 0, 0); +#define ACPI_SERIAL_BEGIN(sys) lockmgr(&sys##_serial, LK_EXCLUSIVE|LK_RETRY); +#define ACPI_SERIAL_END(sys) lockmgr(&sys##_serial, LK_RELEASE); +#define ACPI_SERIAL_ASSERT(sys) KKASSERT(lockstatus(&sys##_serial, curthread) == LK_EXCLUSIVE); +#define ACPI_SERIAL_DECL(sys, name) static struct lock sys##_serial; /* * ACPI CA does not define layers for non-ACPI CA drivers. * We define some here within the range provided.