All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dmitry Torokhov <dtor_core-yWtbtysYrB+LZ21kGMrzwg@public.gmane.org>
To: acpi-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
Cc: Len Brown <len.brow-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
Subject: [PATCH 3/4] use acpi_subsys.rwsem in acpi/scan.c
Date: Tue, 24 Aug 2004 01:37:54 -0500	[thread overview]
Message-ID: <200408240137.55691.dtor_core@ameritech.net> (raw)
In-Reply-To: <200408240136.46113.dtor_core-yWtbtysYrB+LZ21kGMrzwg@public.gmane.org>


===================================================================


ChangeSet@1.1844, 2004-08-24 01:11:37-05:00, dtor_core-yWtbtysYrB+LZ21kGMrzwg@public.gmane.org
  ACPI: Do not use list_for_each_safe as it does not protect from
        changes done by other thread, take acpi_subsys.rwsem instead.
  
  Signed-off-by: Dmitry Torokhov <dtor-JGs/UdohzUI@public.gmane.org>


 bus.c          |    6 --
 scan.c         |  139 ++++++++++++++++++++++++++-------------------------------
 sleep/main.c   |    2 
 sleep/proc.c   |   34 ++++++-------
 sleep/wakeup.c |  126 ++++++++++++++++++++++-----------------------------
 5 files changed, 139 insertions(+), 168 deletions(-)


===================================================================



diff -Nru a/drivers/acpi/bus.c b/drivers/acpi/bus.c
--- a/drivers/acpi/bus.c	2004-08-24 01:17:20 -05:00
+++ b/drivers/acpi/bus.c	2004-08-24 01:17:20 -05:00
@@ -27,7 +27,6 @@
 #include <linux/list.h>
 #include <linux/sched.h>
 #include <linux/pm.h>
-#include <linux/device.h>
 #include <linux/proc_fs.h>
 #ifdef CONFIG_X86
 #include <asm/mpspec.h>
@@ -629,8 +628,6 @@
 	return_VALUE(-ENODEV);
 }
 
-decl_subsys(acpi,NULL,NULL);
-
 static int __init acpi_init (void)
 {
 	int			result = 0;
@@ -648,10 +645,7 @@
 		return -ENODEV;
 	}
 
-	firmware_register(&acpi_subsys);
-
 	result = acpi_bus_init();
-
 	if (!result) {
 #ifdef CONFIG_PM
 		if (!PM_IS_ACTIVE())
diff -Nru a/drivers/acpi/scan.c b/drivers/acpi/scan.c
--- a/drivers/acpi/scan.c	2004-08-24 01:17:20 -05:00
+++ b/drivers/acpi/scan.c	2004-08-24 01:17:20 -05:00
@@ -3,6 +3,7 @@
  */
 
 #include <linux/init.h>
+#include <linux/device.h>
 #include <linux/acpi.h>
 
 #include <acpi/acpi_drivers.h>
@@ -23,7 +24,6 @@
 #define ACPI_BUS_DEVICE_NAME		"System Bus"
 
 static LIST_HEAD(acpi_device_list);
-spinlock_t acpi_device_lock = SPIN_LOCK_UNLOCKED;
 LIST_HEAD(acpi_wakeup_device_list);
 
 static void acpi_device_release(struct kobject * kobj)
@@ -34,14 +34,13 @@
 	kfree(dev);
 }
 
+decl_subsys(acpi, NULL, NULL);
+
 static struct kobj_type ktype_acpi_ns = {
 	.release	= acpi_device_release,
 };
 
 static struct kset acpi_namespace_kset = {
-	.kobj		= { 
-		.name = "namespace",
-	},
 	.subsys = &acpi_subsys,
 	.ktype	= &ktype_acpi_ns,
 };
@@ -49,6 +48,8 @@
 
 static void acpi_device_register(struct acpi_device * device, struct acpi_device * parent)
 {
+	ACPI_FUNCTION_TRACE("acpi_device_register");
+
 	/*
 	 * Linkage
 	 * -------
@@ -57,20 +58,28 @@
 	INIT_LIST_HEAD(&device->children);
 	INIT_LIST_HEAD(&device->node);
 	INIT_LIST_HEAD(&device->g_list);
-
-	spin_lock(&acpi_device_lock);
-	if (device->parent) {
-		list_add_tail(&device->node, &device->parent->children);
-		list_add_tail(&device->g_list,&device->parent->g_list);
-	} else
-		list_add_tail(&device->g_list,&acpi_device_list);
-	spin_unlock(&acpi_device_lock);
+	INIT_LIST_HEAD(&device->wakeup_list);
 
 	kobject_set_name(&device->kobj, device->pnp.bus_id);
 	if (parent)
 		device->kobj.parent = kobject_get(&parent->kobj);
 	device->kobj.kset = &acpi_namespace_kset;
 	kobject_register(&device->kobj);
+
+	down_write(&acpi_subsys.rwsem);
+
+	if (device->parent) {
+		list_add_tail(&device->node, &device->parent->children);
+		list_add_tail(&device->g_list, &device->parent->g_list);
+	} else
+		list_add_tail(&device->g_list, &acpi_device_list);
+
+	if (device->wakeup.flags.valid)
+		list_add_tail(&device->wakeup_list, &acpi_wakeup_device_list);
+
+	up_write(&acpi_subsys.rwsem);
+
+	return_VOID;
 }
 
 static int
@@ -255,24 +264,17 @@
 
 	package = (union acpi_object *) buffer.pointer;
 	status = acpi_bus_extract_wakeup_device_power_package(device, package);
+	acpi_os_free(buffer.pointer);
 	if (ACPI_FAILURE(status)) {
 		ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Error extracting _PRW package\n"));
 		goto end;
 	}
 
-	acpi_os_free(buffer.pointer);
-
 	device->wakeup.flags.valid = 1;
 	/* Power button, Lid switch always enable wakeup*/
 	if (!acpi_match_ids(device, "PNP0C0D,PNP0C0C,PNP0C0E"))
 		device->wakeup.flags.run_wake = 1;
 
-	/* TBD: lock */
-	INIT_LIST_HEAD(&device->wakeup_list);
-	spin_lock(&acpi_device_lock);
-	list_add_tail(&device->wakeup_list, &acpi_wakeup_device_list);
-	spin_unlock(&acpi_device_lock);
-
 end:
 	if (ACPI_FAILURE(status))
 		device->flags.wake_capable = 0;
@@ -296,8 +298,6 @@
    -------------------------------------------------------------------------- */
 
 static LIST_HEAD(acpi_bus_drivers);
-static DECLARE_MUTEX(acpi_bus_drivers_lock);
-
 
 /**
  * acpi_bus_match 
@@ -367,54 +367,44 @@
 
 static int acpi_driver_attach(struct acpi_driver * drv)
 {
-	struct list_head * node, * next;
+	struct acpi_device *dev;
 	int count = 0;
 
 	ACPI_FUNCTION_TRACE("acpi_driver_attach");
 
-	spin_lock(&acpi_device_lock);
-	list_for_each_safe(node, next, &acpi_device_list) {
-		struct acpi_device * dev = container_of(node, struct acpi_device, g_list);
+	list_for_each_entry(dev, &acpi_device_list, g_list) {
 
 		if (dev->driver || !dev->status.present)
 			continue;
-		spin_unlock(&acpi_device_lock);
 
-		if (!acpi_bus_match(dev, drv)) {
-			if (!acpi_bus_driver_init(dev, drv)) {
-				atomic_inc(&drv->references);
-				count++;
-				ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found driver [%s] for device [%s]\n",
-						  drv->name, dev->pnp.bus_id));
-			}
+		if (acpi_bus_match(dev, drv) < 0)
+			continue;
+
+		if (acpi_bus_driver_init(dev, drv) == 0) {
+			atomic_inc(&drv->references);
+			count++;
+			ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found driver [%s] for device [%s]\n",
+					  drv->name, dev->pnp.bus_id));
 		}
-		spin_lock(&acpi_device_lock);
 	}
-	spin_unlock(&acpi_device_lock);
 	return_VALUE(count);
 }
 
 static int acpi_driver_detach(struct acpi_driver * drv)
 {
-	struct list_head * node, * next;
+	struct acpi_device *dev;
 
 	ACPI_FUNCTION_TRACE("acpi_driver_detach");
 
-	spin_lock(&acpi_device_lock);
-	list_for_each_safe(node,next,&acpi_device_list) {
-		struct acpi_device * dev = container_of(node,struct acpi_device,g_list);
-
+	list_for_each_entry(dev, &acpi_device_list, g_list) {
 		if (dev->driver == drv) {
-			spin_unlock(&acpi_device_lock);
 			if (drv->ops.remove)
 				drv->ops.remove(dev,ACPI_BUS_REMOVAL_NORMAL);
-			spin_lock(&acpi_device_lock);
 			dev->driver = NULL;
 			dev->driver_data = NULL;
 			atomic_dec(&drv->references);
 		}
 	}
-	spin_unlock(&acpi_device_lock);
 	return_VALUE(0);
 }
 
@@ -440,11 +430,13 @@
 	if (!driver)
 		return_VALUE(-EINVAL);
 
-	spin_lock(&acpi_device_lock);
+	down_write(&acpi_subsys.rwsem);
+
 	list_add_tail(&driver->node, &acpi_bus_drivers);
-	spin_unlock(&acpi_device_lock);
 	count = acpi_driver_attach(driver);
 
+	up_write(&acpi_subsys.rwsem);
+
 	return_VALUE(count);
 }
 
@@ -459,21 +451,21 @@
 acpi_bus_unregister_driver (
 	struct acpi_driver	*driver)
 {
-	int error = 0;
-
 	ACPI_FUNCTION_TRACE("acpi_bus_unregister_driver");
 
-	if (driver) {
-		acpi_driver_detach(driver);
+	if (!driver)
+		return_VALUE(-EINVAL);
+
+	down_write(&acpi_subsys.rwsem);
 
-		if (!atomic_read(&driver->references)) {
-			spin_lock(&acpi_device_lock);
-			list_del_init(&driver->node);
-			spin_unlock(&acpi_device_lock);
-		} 
-	} else 
-		error = -EINVAL;
-	return_VALUE(error);
+	acpi_driver_detach(driver);
+
+	if (!atomic_read(&driver->references))
+		list_del_init(&driver->node);
+
+	up_write(&acpi_subsys.rwsem);
+
+	return_VALUE(0);
 }
 
 /**
@@ -487,30 +479,27 @@
 	struct acpi_device	*device)
 {
 	int			result = 0;
-	struct list_head	* node, *next;
+	struct acpi_driver	*driver;
 
 	ACPI_FUNCTION_TRACE("acpi_bus_find_driver");
 
 	if (!device->flags.hardware_id && !device->flags.compatible_ids)
-		goto Done;
+		return_VALUE(0);
 
-	spin_lock(&acpi_device_lock);
-	list_for_each_safe(node,next,&acpi_bus_drivers) {
-		struct acpi_driver * driver = container_of(node,struct acpi_driver,node);
-
-		atomic_inc(&driver->references);
-		spin_unlock(&acpi_device_lock);
-		if (!acpi_bus_match(device, driver)) {
-			result = acpi_bus_driver_init(device, driver);
-			if (!result)
-				goto Done;
+	down_write(&acpi_subsys.rwsem);
+	list_for_each_entry(driver, &acpi_bus_drivers, node) {
+
+		if (acpi_bus_match(device, driver) < 0)
+			continue;
+
+		result = acpi_bus_driver_init(device, driver);
+		if (!result) {
+			atomic_inc(&driver->references);
+			break;
 		}
-		atomic_dec(&driver->references);
-		spin_lock(&acpi_device_lock);
 	}
-	spin_unlock(&acpi_device_lock);
+	up_write(&acpi_subsys.rwsem);
 
- Done:
 	return_VALUE(result);
 }
 
@@ -1044,6 +1033,8 @@
 	if (acpi_disabled)
 		return_VALUE(0);
 
+	firmware_register(&acpi_subsys);
+	kobject_set_name(&acpi_namespace_kset.kobj, "namespace");
 	kset_register(&acpi_namespace_kset);
 
 	/*
diff -Nru a/drivers/acpi/sleep/main.c b/drivers/acpi/sleep/main.c
--- a/drivers/acpi/sleep/main.c	2004-08-24 01:17:20 -05:00
+++ b/drivers/acpi/sleep/main.c	2004-08-24 01:17:20 -05:00
@@ -89,9 +89,9 @@
 			return error;
 	}
 
+	acpi_enable_wakeup_device(acpi_state);
 
 	local_irq_save(flags);
-	acpi_enable_wakeup_device(acpi_state);
 	switch (pm_state)
 	{
 	case PM_SUSPEND_STANDBY:
diff -Nru a/drivers/acpi/sleep/proc.c b/drivers/acpi/sleep/proc.c
--- a/drivers/acpi/sleep/proc.c	2004-08-24 01:17:20 -05:00
+++ b/drivers/acpi/sleep/proc.c	2004-08-24 01:17:20 -05:00
@@ -354,22 +354,20 @@
 }
 
 extern struct list_head	acpi_wakeup_device_list;
-extern spinlock_t acpi_device_lock;
 
 static int
 acpi_system_wakeup_device_seq_show(struct seq_file *seq, void *offset)
 {
-	struct list_head * node, * next;
+	struct acpi_device *dev;
 
 	seq_printf(seq, "Device	Sleep state	Status\n");
 
-	spin_lock(&acpi_device_lock);
-	list_for_each_safe(node, next, &acpi_wakeup_device_list) {
-		struct acpi_device * dev = container_of(node, struct acpi_device, wakeup_list);
+	down_read(&acpi_subsys.rwsem);
+	list_for_each_entry(dev, &acpi_wakeup_device_list, wakeup_list) {
 
 		if (!dev->wakeup.flags.valid)
 			continue;
-		spin_unlock(&acpi_device_lock);
+
 		if (dev->wakeup.flags.run_wake)
 			seq_printf(seq, "%4s	%4d		%8s\n",
 				dev->pnp.bus_id, (u32) dev->wakeup.sleep_state,
@@ -378,9 +376,9 @@
 			seq_printf(seq, "%4s	%4d		%8s\n",
 				dev->pnp.bus_id, (u32) dev->wakeup.sleep_state,
 				dev->wakeup.state.enabled ? "enabled" : "disabled");
-		spin_lock(&acpi_device_lock);
 	}
-	spin_unlock(&acpi_device_lock);
+	up_read(&acpi_subsys.rwsem);
+
 	return 0;
 }
 
@@ -391,30 +389,32 @@
 	size_t			count,
 	loff_t			*ppos)
 {
-	struct list_head * node, * next;
-	char		strbuf[5];
-	char		str[5] = "";
-	int 		len = count;
+	struct acpi_device	*dev;
+	char			strbuf[5];
+	char			str[5] = "";
+	int 			len = count;
 
 	if (len > 4) len = 4;
 
 	if (copy_from_user(strbuf, buffer, len))
 		return -EFAULT;
+
 	strbuf[len] = '\0';
 	sscanf(strbuf, "%s", str);
 
-	spin_lock(&acpi_device_lock);
-	list_for_each_safe(node, next, &acpi_wakeup_device_list) {
-		struct acpi_device * dev = container_of(node, struct acpi_device, wakeup_list);
+	down_write(&acpi_subsys.rwsem);
+	list_for_each_entry(dev, &acpi_wakeup_device_list, wakeup_list) {
+
 		if (!dev->wakeup.flags.valid)
 			continue;
 
 		if (!strncmp(dev->pnp.bus_id, str, 4)) {
-			dev->wakeup.state.enabled = dev->wakeup.state.enabled ? 0:1;
+			dev->wakeup.state.enabled = dev->wakeup.state.enabled ? 0 : 1;
 			break;
 		}
 	}
-	spin_unlock(&acpi_device_lock);
+	up_write(&acpi_subsys.rwsem);
+
 	return count;
 }
 
diff -Nru a/drivers/acpi/sleep/wakeup.c b/drivers/acpi/sleep/wakeup.c
--- a/drivers/acpi/sleep/wakeup.c	2004-08-24 01:17:20 -05:00
+++ b/drivers/acpi/sleep/wakeup.c	2004-08-24 01:17:20 -05:00
@@ -20,31 +20,29 @@
  * is higher than requested sleep level
  */
 extern struct list_head	acpi_wakeup_device_list;
-extern spinlock_t acpi_device_lock;
 
 void
 acpi_enable_wakeup_device_prep(
 	u8		sleep_state)
 {
-	struct list_head * node, * next;
+	struct acpi_device *dev;
 
 	ACPI_FUNCTION_TRACE("acpi_enable_wakeup_device_prep");
 
-	spin_lock(&acpi_device_lock);
-	list_for_each_safe(node, next, &acpi_wakeup_device_list) {
-		struct acpi_device * dev = container_of(node, 
-			struct acpi_device, wakeup_list);
-		
-		if (!dev->wakeup.flags.valid || 
-			!dev->wakeup.state.enabled ||
-			(sleep_state > (u32) dev->wakeup.sleep_state))
+	down_write(&acpi_subsys.rwsem);
+	list_for_each_entry(dev, &acpi_wakeup_device_list, wakeup_list) {
+
+		if (!dev->wakeup.flags.valid || !dev->wakeup.state.enabled)
+			continue;
+
+		if (sleep_state > (u32) dev->wakeup.sleep_state)
 			continue;
 
-		spin_unlock(&acpi_device_lock);
 		acpi_enable_wakeup_device_power(dev);
-		spin_lock(&acpi_device_lock);
 	}
-	spin_unlock(&acpi_device_lock);
+	up_write(&acpi_subsys.rwsem);
+
+	return_VOID;
 }
 
 /**
@@ -56,46 +54,40 @@
 acpi_enable_wakeup_device(
 	u8		sleep_state)
 {
-	struct list_head * node, * next;
+	struct acpi_device *dev;
 
-	/* 
-	 * Caution: this routine must be invoked when interrupt is disabled 
-	 * Refer ACPI2.0: P212
-	 */
 	ACPI_FUNCTION_TRACE("acpi_enable_wakeup_device");
-	spin_lock(&acpi_device_lock);
-	list_for_each_safe(node, next, &acpi_wakeup_device_list) {
-		struct acpi_device * dev = container_of(node, 
-			struct acpi_device, wakeup_list);
+
+	down_write(&acpi_subsys.rwsem);
+	list_for_each_entry(dev, &acpi_wakeup_device_list, wakeup_list) {
 
 		/* If users want to disable run-wake GPE,
 		 * we only disable it for wake and leave it for runtime
 		 */
 		if (dev->wakeup.flags.run_wake && !dev->wakeup.state.enabled) {
-			spin_unlock(&acpi_device_lock);
-			acpi_set_gpe_type(dev->wakeup.gpe_device, 
-				dev->wakeup.gpe_number, ACPI_GPE_TYPE_RUNTIME);
+			acpi_set_gpe_type(dev->wakeup.gpe_device,
+					  dev->wakeup.gpe_number, ACPI_GPE_TYPE_RUNTIME);
 			/* Re-enable it, since set_gpe_type will disable it */
-			acpi_enable_gpe(dev->wakeup.gpe_device, 
-				dev->wakeup.gpe_number, ACPI_ISR);
-			spin_lock(&acpi_device_lock);
+			acpi_enable_gpe(dev->wakeup.gpe_device,
+					dev->wakeup.gpe_number, ACPI_NOT_ISR);
 			continue;
 		}
 
-		if (!dev->wakeup.flags.valid ||
-			!dev->wakeup.state.enabled ||
-			(sleep_state > (u32) dev->wakeup.sleep_state))
+		if (!dev->wakeup.flags.valid || !dev->wakeup.state.enabled)
+			continue;
+
+		if (sleep_state > (u32) dev->wakeup.sleep_state)
 			continue;
 
-		spin_unlock(&acpi_device_lock);
 		/* run-wake GPE has been enabled */
 		if (!dev->wakeup.flags.run_wake)
-			acpi_enable_gpe(dev->wakeup.gpe_device, 
-				dev->wakeup.gpe_number, ACPI_ISR);
+			acpi_enable_gpe(dev->wakeup.gpe_device,
+					dev->wakeup.gpe_number, ACPI_NOT_ISR);
 		dev->wakeup.state.active = 1;
-		spin_lock(&acpi_device_lock);
 	}
-	spin_unlock(&acpi_device_lock);
+	up_write(&acpi_subsys.rwsem);
+
+	return_VOID;
 }
 
 /**
@@ -107,73 +99,67 @@
 acpi_disable_wakeup_device (
 	u8		sleep_state)
 {
-	struct list_head * node, * next;
+	struct acpi_device *dev;
 
 	ACPI_FUNCTION_TRACE("acpi_disable_wakeup_device");
 
-	spin_lock(&acpi_device_lock);
-	list_for_each_safe(node, next, &acpi_wakeup_device_list) {
-		struct acpi_device * dev = container_of(node, 
-			struct acpi_device, wakeup_list);
+	down_write(&acpi_subsys.rwsem);
+	list_for_each_entry(dev, &acpi_wakeup_device_list, wakeup_list) {
 
 		if (dev->wakeup.flags.run_wake && !dev->wakeup.state.enabled) {
-			spin_unlock(&acpi_device_lock);
-			acpi_set_gpe_type(dev->wakeup.gpe_device, 
-				dev->wakeup.gpe_number, ACPI_GPE_TYPE_WAKE_RUN);
+			acpi_set_gpe_type(dev->wakeup.gpe_device,
+					  dev->wakeup.gpe_number, ACPI_GPE_TYPE_WAKE_RUN);
 			/* Re-enable it, since set_gpe_type will disable it */
-			acpi_enable_gpe(dev->wakeup.gpe_device, 
-				dev->wakeup.gpe_number, ACPI_NOT_ISR);
-			spin_lock(&acpi_device_lock);
+			acpi_enable_gpe(dev->wakeup.gpe_device,
+					dev->wakeup.gpe_number, ACPI_NOT_ISR);
 			continue;
 		}
 
-		if (!dev->wakeup.flags.valid || 
-			!dev->wakeup.state.active ||
-			(sleep_state > (u32) dev->wakeup.sleep_state))
+		if (!dev->wakeup.flags.valid || !dev->wakeup.state.active)
+			continue;
+
+		if (sleep_state > (u32) dev->wakeup.sleep_state)
 			continue;
 
-		spin_unlock(&acpi_device_lock);
 		acpi_disable_wakeup_device_power(dev);
 		/* Never disable run-wake GPE */
 		if (!dev->wakeup.flags.run_wake) {
-			acpi_disable_gpe(dev->wakeup.gpe_device, 
-				dev->wakeup.gpe_number, ACPI_NOT_ISR);
-			acpi_clear_gpe(dev->wakeup.gpe_device, 
-				dev->wakeup.gpe_number, ACPI_NOT_ISR);
+			acpi_disable_gpe(dev->wakeup.gpe_device,
+					 dev->wakeup.gpe_number, ACPI_NOT_ISR);
+			acpi_clear_gpe(dev->wakeup.gpe_device,
+				       dev->wakeup.gpe_number, ACPI_NOT_ISR);
 		}
 		dev->wakeup.state.active = 0;
-		spin_lock(&acpi_device_lock);
 	}
-	spin_unlock(&acpi_device_lock);
+	up_write(&acpi_subsys.rwsem);
+
+	return_VOID;
 }
 
 static int __init acpi_wakeup_device_init(void)
 {
-	struct list_head * node, * next;
+	struct acpi_device *dev;
 
 	if (acpi_disabled)
 		return 0;
+
 	printk("ACPI wakeup devices: \n");
 
-	spin_lock(&acpi_device_lock);
-	list_for_each_safe(node, next, &acpi_wakeup_device_list) {
-		struct acpi_device * dev = container_of(node, 
-			struct acpi_device, wakeup_list);
-		
+	down_write(&acpi_subsys.rwsem);
+	list_for_each_entry(dev, &acpi_wakeup_device_list, wakeup_list) {
+
 		/* In case user doesn't load button driver */
 		if (dev->wakeup.flags.run_wake && !dev->wakeup.state.enabled) {
-			spin_unlock(&acpi_device_lock);
-			acpi_set_gpe_type(dev->wakeup.gpe_device, 
-				dev->wakeup.gpe_number, ACPI_GPE_TYPE_WAKE_RUN);
-			acpi_enable_gpe(dev->wakeup.gpe_device, 
-				dev->wakeup.gpe_number, ACPI_NOT_ISR);
+			acpi_set_gpe_type(dev->wakeup.gpe_device,
+					  dev->wakeup.gpe_number, ACPI_GPE_TYPE_WAKE_RUN);
+			acpi_enable_gpe(dev->wakeup.gpe_device,
+					dev->wakeup.gpe_number, ACPI_NOT_ISR);
 			dev->wakeup.state.enabled = 1;
-			spin_lock(&acpi_device_lock);
 		}
 		printk("%4s ", dev->pnp.bus_id);
 	}
-	spin_unlock(&acpi_device_lock);
 	printk("\n");
+	up_write(&acpi_subsys.rwsem);
 
 	return 0;
 }


-------------------------------------------------------
SF.Net email is sponsored by Shop4tech.com-Lowest price on Blank Media
100pk Sonic DVD-R 4x for only $29 -100pk Sonic DVD+R for only $33
Save 50% off Retail on Ink & Toner - Free Shipping and Free Gift.
http://www.shop4tech.com/z/Inkjet_Cartridges/9_108_r285

  parent reply	other threads:[~2004-08-24  6:37 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-08-24  6:34 [PATCH 1/4] properly create kobjects in acpi/scan.c Dmitry Torokhov
     [not found] ` <200408240134.16962.dtor_core-yWtbtysYrB+LZ21kGMrzwg@public.gmane.org>
2004-08-24  6:36   ` [PATCH 2/4] event code fixes/cleanup Dmitry Torokhov
     [not found]     ` <200408240136.46113.dtor_core-yWtbtysYrB+LZ21kGMrzwg@public.gmane.org>
2004-08-24  6:37       ` Dmitry Torokhov [this message]
     [not found]         ` <200408240137.55691.dtor_core-yWtbtysYrB+LZ21kGMrzwg@public.gmane.org>
2004-08-24  6:39           ` [PATCH 4/4] allow multiple /proc/acpi/event readers Dmitry Torokhov
2004-08-24 15:23   ` [PATCH 1/4] properly create kobjects in acpi/scan.c Hiroshi Miura
     [not found]     ` <87zn4ky2zr.wl%miura-yiisDzvROlQdnm+yROfE0A@public.gmane.org>
2004-08-24 16:15       ` Mattia Dongili
2004-08-24 17:03       ` Dmitry Torokhov
2004-08-24 19:50   ` Len Brown

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=200408240137.55691.dtor_core@ameritech.net \
    --to=dtor_core-ywtbtysyrb+lz21kgmrzwg@public.gmane.org \
    --cc=acpi-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org \
    --cc=len.brow-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.