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
next prev 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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox