linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/4] ACPI: Refactor system notify handling
@ 2012-09-06 23:40 Toshi Kani
  2012-09-06 23:40 ` [PATCH v2 1/4] ACPI: Support system notify handler via .sys_notify Toshi Kani
                   ` (4 more replies)
  0 siblings, 5 replies; 7+ messages in thread
From: Toshi Kani @ 2012-09-06 23:40 UTC (permalink / raw)
  To: linux-acpi, lenb
  Cc: linux-kernel, bhelgaas, liuj97, isimatu.yasuaki, Toshi Kani

This patchset updates the ACPI system-level (ex. hotplug)
notify handling with a new .sys_notify interface.  It provides
the following changes:

- Allow ACPI drivers to register their system-level (hotplug)
  notify handlers to a new .sys_notify interface through their
  acpi_driver table.  This removes redundant ACPI namespace
  walks from ACPI drivers for faster booting.  The global notify
  handler acpi_bus_notify() is called for all system-level ACPI
  device notifications, which then calls an appropriate driver's
  handler if any.  ACPI drivers no longer need to register or
  unregister driver's handlers to each device object in ACPI
  namespace.
 
- Support dynamic ACPI namespace with LoadTable & Unload opcode
  without any changes in ACPI drivers.  There is no need to 
  register / unregister handlers to ACPI device objects that are
  being loaded to / unloaded from ACPI namespace.

- Allow ACPI drivers to use a common hotplug handler when it is
  implemented.  It removes functional conflict between driver's
  notify handler and the global notify handler acpi_bus_notify().
  acpi_bus_notify() only calls an appropriate notify handler if
  any.

Note that the changes maintain backward compatibility for ACPI
drivers.  Any drivers registered their hotplug handlers through
the existing interfaces, such as acpi_install_notify_handler()
and register_acpi_bus_notifier(), will continue to work as before.

v2:
 - Protected unbound driver from unloading when calling .sys_notify.
 - Changed acpi_bus_notify() to call acpi_bus_notify_list first for
   maintaining the original order.

---
Toshi Kani (4):
 ACPI: Support system notify handler via .sys_notify
 ACPI: Update processor_driver to use .sys_notify
 ACPI: Update acpi_memhotplug to use .sys_notify
 ACPI: Update container to use .sys_notify

---
 drivers/acpi/acpi_memhotplug.c  |   93 +-------------------------------------
 drivers/acpi/bus.c              |   64 ++++++++++++++++++++-------
 drivers/acpi/container.c        |   66 +--------------------------
 drivers/acpi/processor_driver.c |   82 +++-------------------------------
 drivers/acpi/scan.c             |   83 ++++++++++++++++++++++++++++++++++
 include/acpi/acpi_bus.h         |    6 +++
 6 files changed, 150 insertions(+), 244 deletions(-)

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH v2 1/4] ACPI: Support system notify handler via .sys_notify
  2012-09-06 23:40 [PATCH v2 0/4] ACPI: Refactor system notify handling Toshi Kani
@ 2012-09-06 23:40 ` Toshi Kani
  2012-09-06 23:40 ` [PATCH v2 2/4] ACPI: Update processor_driver to use .sys_notify Toshi Kani
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 7+ messages in thread
From: Toshi Kani @ 2012-09-06 23:40 UTC (permalink / raw)
  To: linux-acpi, lenb
  Cc: linux-kernel, bhelgaas, liuj97, isimatu.yasuaki, Toshi Kani

Added a new .sys_notify interface, which allows ACPI drivers to
register their system-level (ex. hotplug) notify handlers through
their acpi_driver table.  The global notify handler acpi_bus_notify()
is called for all system-level ACPI notifications, which is changed
to call an appropriate driver's handler if any.  With .sys_notify,
ACPI drivers no longer need to register or unregister driver's
handler to each ACPI device object.  It also supports dynamic ACPI
namespace with LoadTable & Unload opcode without any modification.

Added a common system notify handler acpi_bus_sys_notify(), which
allows ACPI drivers to set it to .sys_notify when this function is
fully implemented.

Note that the changes maintain backward compatibility for ACPI
drivers.  Any drivers registered their hotplug handler through the
existing interfaces, such as acpi_install_notify_handler() and
register_acpi_bus_notifier(), will continue to work as before.

Signed-off-by: Toshi Kani <toshi.kani@hp.com>
---
 drivers/acpi/bus.c      |   64 +++++++++++++++++++++++++++---------
 drivers/acpi/scan.c     |   83 +++++++++++++++++++++++++++++++++++++++++++++++
 include/acpi/acpi_bus.h |    6 +++
 3 files changed, 137 insertions(+), 16 deletions(-)

diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c
index 9628652..e33c54fc 100644
--- a/drivers/acpi/bus.c
+++ b/drivers/acpi/bus.c
@@ -760,21 +760,16 @@ void unregister_acpi_bus_notifier(struct notifier_block *nb)
 EXPORT_SYMBOL_GPL(unregister_acpi_bus_notifier);
 
 /**
- * acpi_bus_notify
- * ---------------
- * Callback for all 'system-level' device notifications (values 0x00-0x7F).
+ * acpi_bus_sys_notify: Common system notify handler
+ *
+ * ACPI drivers may specify this common handler to its sys_notify entry.
+ * TBD: This handler is not implemented yet.
  */
-static void acpi_bus_notify(acpi_handle handle, u32 type, void *data)
+void acpi_bus_sys_notify(acpi_handle handle, u32 type, void *data)
 {
-	struct acpi_device *device = NULL;
-	struct acpi_driver *driver;
-
 	ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Notification %#02x to handle %p\n",
 			  type, handle));
 
-	blocking_notifier_call_chain(&acpi_bus_notify_list,
-		type, (void *)handle);
-
 	switch (type) {
 
 	case ACPI_NOTIFY_BUS_CHECK:
@@ -823,14 +818,51 @@ static void acpi_bus_notify(acpi_handle handle, u32 type, void *data)
 				  type));
 		break;
 	}
+}
+
+/**
+ * acpi_bus_drv_notify: Call driver's system-level notify handler
+ */
+void acpi_bus_drv_notify(struct acpi_driver *driver,
+		struct acpi_device *device, acpi_handle handle,
+		u32 type, void *data)
+{
+	BUG_ON(!driver);
+
+	if (driver->ops.sys_notify)
+		driver->ops.sys_notify(handle, type, data);
+	else if (device && driver->ops.notify &&
+		 (driver->flags & ACPI_DRIVER_ALL_NOTIFY_EVENTS))
+		driver->ops.notify(device, type);
+
+	return;
+}
+
+/**
+ * acpi_bus_notify: The system-level global notify handler
+ *
+ * The global notify handler for all 'system-level' device notifications
+ * (values 0x00-0x7F).  This handler calls a driver's notify handler for
+ * the notified ACPI device.
+ */
+static void acpi_bus_notify(acpi_handle handle, u32 type, void *data)
+{
+	struct acpi_device *device = NULL;
+
+	/* call registered handlers in the bus notify list */
+	blocking_notifier_call_chain(&acpi_bus_notify_list,
+						type, (void *)handle);
 
+	/* obtain an associated driver if already bound */
 	acpi_bus_get_device(handle, &device);
-	if (device) {
-		driver = device->driver;
-		if (driver && driver->ops.notify &&
-		    (driver->flags & ACPI_DRIVER_ALL_NOTIFY_EVENTS))
-			driver->ops.notify(device, type);
-	}
+
+	/* call the driver's system-level notify handler */
+	if (device && device->driver)
+		acpi_bus_drv_notify(device->driver, device, handle, type, data);
+	else
+		acpi_lookup_drv_notify(handle, type, data);
+
+	return;
 }
 
 /* --------------------------------------------------------------------------
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
index d1ecca2..f47920e 100644
--- a/drivers/acpi/scan.c
+++ b/drivers/acpi/scan.c
@@ -1630,3 +1630,86 @@ int __init acpi_scan_init(void)
 
 	return result;
 }
+
+/* callback args for acpi_match_drv_notify() */
+struct acpi_notify_args {
+	struct acpi_device	*device;
+	acpi_handle		handle;
+	u32			event;
+	void			*data;
+};
+
+static int acpi_match_drv_notify(struct device_driver *drv, void *data)
+{
+	struct acpi_driver *driver = to_acpi_driver(drv);
+	struct acpi_notify_args *args = (struct acpi_notify_args *) data;
+
+	/* check if this driver matches with the device */
+	if (acpi_match_device_ids(args->device, driver->ids))
+		return 0;
+
+	/* call the driver's notify handler */
+	acpi_bus_drv_notify(driver, NULL, args->handle,
+					args->event, args->data);
+
+	return 1;
+}
+
+/**
+ * acpi_lookup_drv_notify: Look up and call a driver's notify handler
+ * @handle: ACPI handle of the notified device object
+ * @event: Notify event
+ * @data: Context
+ *
+ * Look up and call a driver's notify handler for the notified ACPI device
+ * object by walking through the list of ACPI drivers.
+ */
+void acpi_lookup_drv_notify(acpi_handle handle, u32 event, void *data)
+{
+	struct acpi_notify_args args;
+	struct acpi_device *device;
+	unsigned long long sta;
+	int type;
+	int ret;
+
+	/* allocate a temporary device object */
+	device = kzalloc(sizeof(struct acpi_device), GFP_KERNEL);
+	if (!device) {
+		pr_err(PREFIX "No memory to allocate a tmp device\n");
+		return;
+	}
+
+	/* obtain device type */
+	ret = acpi_bus_type_and_status(handle, &type, &sta);
+	if (ret) {
+		pr_err(PREFIX "Failed to get device type\n");
+		goto out;
+	}
+
+	/* setup this temporary device object */
+	INIT_LIST_HEAD(&device->pnp.ids);
+	device->device_type = type;
+	device->handle = handle;
+	device->parent = acpi_bus_get_parent(handle);
+	device->dev.bus = &acpi_bus_type;
+	device->driver = NULL;
+	STRUCT_TO_INT(device->status) = sta;
+	device->status.present = 1;
+
+	/* set HID to this device object */
+	acpi_device_set_id(device);
+
+	/* set args */
+	args.device = device;
+	args.handle = handle;
+	args.event = event;
+	args.data = data;
+
+	/* call a matched driver's notify handler */
+	(void) bus_for_each_drv(device->dev.bus, NULL,
+					&args, acpi_match_drv_notify);
+
+out:
+	kfree(device);
+	return;
+}
diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h
index bde976e..4a02ed4 100644
--- a/include/acpi/acpi_bus.h
+++ b/include/acpi/acpi_bus.h
@@ -123,6 +123,7 @@ typedef int (*acpi_op_start) (struct acpi_device * device);
 typedef int (*acpi_op_bind) (struct acpi_device * device);
 typedef int (*acpi_op_unbind) (struct acpi_device * device);
 typedef void (*acpi_op_notify) (struct acpi_device * device, u32 event);
+typedef void (*acpi_op_sys_notify) (acpi_handle handle, u32 event, void *data);
 
 struct acpi_bus_ops {
 	u32 acpi_op_add:1;
@@ -136,6 +137,7 @@ struct acpi_device_ops {
 	acpi_op_bind bind;
 	acpi_op_unbind unbind;
 	acpi_op_notify notify;
+	acpi_op_sys_notify sys_notify;
 };
 
 #define ACPI_DRIVER_ALL_NOTIFY_EVENTS	0x1	/* system AND device events */
@@ -345,6 +347,10 @@ extern int unregister_acpi_notifier(struct notifier_block *);
 
 extern int register_acpi_bus_notifier(struct notifier_block *nb);
 extern void unregister_acpi_bus_notifier(struct notifier_block *nb);
+extern void acpi_lookup_drv_notify(acpi_handle handle, u32 event, void *data);
+extern void acpi_bus_drv_notify(struct acpi_driver *driver,
+	struct acpi_device *device, acpi_handle handle, u32 type, void *data);
+
 /*
  * External Functions
  */
-- 
1.7.7.6


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v2 2/4] ACPI: Update processor_driver to use .sys_notify
  2012-09-06 23:40 [PATCH v2 0/4] ACPI: Refactor system notify handling Toshi Kani
  2012-09-06 23:40 ` [PATCH v2 1/4] ACPI: Support system notify handler via .sys_notify Toshi Kani
@ 2012-09-06 23:40 ` Toshi Kani
  2012-09-06 23:40 ` [PATCH v2 3/4] ACPI: Update acpi_memhotplug " Toshi Kani
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 7+ messages in thread
From: Toshi Kani @ 2012-09-06 23:40 UTC (permalink / raw)
  To: linux-acpi, lenb
  Cc: linux-kernel, bhelgaas, liuj97, isimatu.yasuaki, Toshi Kani

Changed the ACPI processor driver to use .sys_notify.  Removed
ACPI namespace walks and their call-back function that register
and unregister the hotplug handler to all processor objects
through acpi_[install|remove]_notify_handler().

Signed-off-by: Toshi Kani <toshi.kani@hp.com>
---
 drivers/acpi/processor_driver.c |   82 +++-----------------------------------
 1 files changed, 7 insertions(+), 75 deletions(-)

diff --git a/drivers/acpi/processor_driver.c b/drivers/acpi/processor_driver.c
index bfc31cb..a0f6123 100644
--- a/drivers/acpi/processor_driver.c
+++ b/drivers/acpi/processor_driver.c
@@ -85,6 +85,10 @@ static void acpi_processor_notify(struct acpi_device *device, u32 event);
 static acpi_status acpi_processor_hotadd_init(struct acpi_processor *pr);
 static int acpi_processor_handle_eject(struct acpi_processor *pr);
 static int acpi_processor_start(struct acpi_processor *pr);
+#ifdef CONFIG_ACPI_HOTPLUG_CPU
+static void acpi_processor_hotplug_notify(acpi_handle handle, u32 event,
+		void *data);
+#endif
 
 static const struct acpi_device_id processor_device_ids[] = {
 	{ACPI_PROCESSOR_OBJECT_HID, 0},
@@ -104,6 +108,9 @@ static struct acpi_driver acpi_processor_driver = {
 		.add = acpi_processor_add,
 		.remove = acpi_processor_remove,
 		.notify = acpi_processor_notify,
+#ifdef CONFIG_ACPI_HOTPLUG_CPU
+		.sys_notify = acpi_processor_hotplug_notify,
+#endif
 		},
 	.drv.pm = &acpi_processor_pm,
 };
@@ -755,67 +762,6 @@ static void acpi_processor_hotplug_notify(acpi_handle handle,
 	return;
 }
 
-static acpi_status is_processor_device(acpi_handle handle)
-{
-	struct acpi_device_info *info;
-	char *hid;
-	acpi_status status;
-
-	status = acpi_get_object_info(handle, &info);
-	if (ACPI_FAILURE(status))
-		return status;
-
-	if (info->type == ACPI_TYPE_PROCESSOR) {
-		kfree(info);
-		return AE_OK;	/* found a processor object */
-	}
-
-	if (!(info->valid & ACPI_VALID_HID)) {
-		kfree(info);
-		return AE_ERROR;
-	}
-
-	hid = info->hardware_id.string;
-	if ((hid == NULL) || strcmp(hid, ACPI_PROCESSOR_DEVICE_HID)) {
-		kfree(info);
-		return AE_ERROR;
-	}
-
-	kfree(info);
-	return AE_OK;	/* found a processor device object */
-}
-
-static acpi_status
-processor_walk_namespace_cb(acpi_handle handle,
-			    u32 lvl, void *context, void **rv)
-{
-	acpi_status status;
-	int *action = context;
-
-	status = is_processor_device(handle);
-	if (ACPI_FAILURE(status))
-		return AE_OK;	/* not a processor; continue to walk */
-
-	switch (*action) {
-	case INSTALL_NOTIFY_HANDLER:
-		acpi_install_notify_handler(handle,
-					    ACPI_SYSTEM_NOTIFY,
-					    acpi_processor_hotplug_notify,
-					    NULL);
-		break;
-	case UNINSTALL_NOTIFY_HANDLER:
-		acpi_remove_notify_handler(handle,
-					   ACPI_SYSTEM_NOTIFY,
-					   acpi_processor_hotplug_notify);
-		break;
-	default:
-		break;
-	}
-
-	/* found a processor; skip walking underneath */
-	return AE_CTRL_DEPTH;
-}
-
 static acpi_status acpi_processor_hotadd_init(struct acpi_processor *pr)
 {
 	acpi_handle handle = pr->handle;
@@ -869,26 +815,12 @@ static int acpi_processor_handle_eject(struct acpi_processor *pr)
 static
 void acpi_processor_install_hotplug_notify(void)
 {
-#ifdef CONFIG_ACPI_HOTPLUG_CPU
-	int action = INSTALL_NOTIFY_HANDLER;
-	acpi_walk_namespace(ACPI_TYPE_ANY,
-			    ACPI_ROOT_OBJECT,
-			    ACPI_UINT32_MAX,
-			    processor_walk_namespace_cb, NULL, &action, NULL);
-#endif
 	register_hotcpu_notifier(&acpi_cpu_notifier);
 }
 
 static
 void acpi_processor_uninstall_hotplug_notify(void)
 {
-#ifdef CONFIG_ACPI_HOTPLUG_CPU
-	int action = UNINSTALL_NOTIFY_HANDLER;
-	acpi_walk_namespace(ACPI_TYPE_ANY,
-			    ACPI_ROOT_OBJECT,
-			    ACPI_UINT32_MAX,
-			    processor_walk_namespace_cb, NULL, &action, NULL);
-#endif
 	unregister_hotcpu_notifier(&acpi_cpu_notifier);
 }
 
-- 
1.7.7.6


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v2 3/4] ACPI: Update acpi_memhotplug to use .sys_notify
  2012-09-06 23:40 [PATCH v2 0/4] ACPI: Refactor system notify handling Toshi Kani
  2012-09-06 23:40 ` [PATCH v2 1/4] ACPI: Support system notify handler via .sys_notify Toshi Kani
  2012-09-06 23:40 ` [PATCH v2 2/4] ACPI: Update processor_driver to use .sys_notify Toshi Kani
@ 2012-09-06 23:40 ` Toshi Kani
  2012-09-06 23:40 ` [PATCH v2 4/4] ACPI: Update container " Toshi Kani
  2012-10-09 13:55 ` [PATCH v2 0/4] ACPI: Refactor system notify handling Toshi Kani
  4 siblings, 0 replies; 7+ messages in thread
From: Toshi Kani @ 2012-09-06 23:40 UTC (permalink / raw)
  To: linux-acpi, lenb
  Cc: linux-kernel, bhelgaas, liuj97, isimatu.yasuaki, Toshi Kani

Changed the ACPI memory hotplug driver to use .sys_notify.  Removed
ACPI namespace walks and their call-back functions that register and
unregister the hotplug handler to all memory device objects through
acpi_[install|remove]_notify_handler().

Signed-off-by: Toshi Kani <toshi.kani@hp.com>
---
 drivers/acpi/acpi_memhotplug.c |   93 +--------------------------------------
 1 files changed, 3 insertions(+), 90 deletions(-)

diff --git a/drivers/acpi/acpi_memhotplug.c b/drivers/acpi/acpi_memhotplug.c
index 24c807f..1f62686 100644
--- a/drivers/acpi/acpi_memhotplug.c
+++ b/drivers/acpi/acpi_memhotplug.c
@@ -54,6 +54,8 @@ MODULE_LICENSE("GPL");
 
 static int acpi_memory_device_add(struct acpi_device *device);
 static int acpi_memory_device_remove(struct acpi_device *device, int type);
+static void acpi_memory_device_notify(acpi_handle handle, u32 event,
+	void *data);
 
 static const struct acpi_device_id memory_device_ids[] = {
 	{ACPI_MEMORY_DEVICE_HID, 0},
@@ -68,6 +70,7 @@ static struct acpi_driver acpi_memory_device_driver = {
 	.ops = {
 		.add = acpi_memory_device_add,
 		.remove = acpi_memory_device_remove,
+		.sys_notify = acpi_memory_device_notify,
 		},
 };
 
@@ -484,111 +487,21 @@ static int acpi_memory_device_remove(struct acpi_device *device, int type)
 	return 0;
 }
 
-/*
- * Helper function to check for memory device
- */
-static acpi_status is_memory_device(acpi_handle handle)
-{
-	char *hardware_id;
-	acpi_status status;
-	struct acpi_device_info *info;
-
-	status = acpi_get_object_info(handle, &info);
-	if (ACPI_FAILURE(status))
-		return status;
-
-	if (!(info->valid & ACPI_VALID_HID)) {
-		kfree(info);
-		return AE_ERROR;
-	}
-
-	hardware_id = info->hardware_id.string;
-	if ((hardware_id == NULL) ||
-	    (strcmp(hardware_id, ACPI_MEMORY_DEVICE_HID)))
-		status = AE_ERROR;
-
-	kfree(info);
-	return status;
-}
-
-static acpi_status
-acpi_memory_register_notify_handler(acpi_handle handle,
-				    u32 level, void *ctxt, void **retv)
-{
-	acpi_status status;
-
-
-	status = is_memory_device(handle);
-	if (ACPI_FAILURE(status))
-		return AE_OK;	/* continue */
-
-	status = acpi_install_notify_handler(handle, ACPI_SYSTEM_NOTIFY,
-					     acpi_memory_device_notify, NULL);
-	/* continue */
-	return AE_OK;
-}
-
-static acpi_status
-acpi_memory_deregister_notify_handler(acpi_handle handle,
-				      u32 level, void *ctxt, void **retv)
-{
-	acpi_status status;
-
-
-	status = is_memory_device(handle);
-	if (ACPI_FAILURE(status))
-		return AE_OK;	/* continue */
-
-	status = acpi_remove_notify_handler(handle,
-					    ACPI_SYSTEM_NOTIFY,
-					    acpi_memory_device_notify);
-
-	return AE_OK;	/* continue */
-}
-
 static int __init acpi_memory_device_init(void)
 {
 	int result;
-	acpi_status status;
-
 
 	result = acpi_bus_register_driver(&acpi_memory_device_driver);
 
 	if (result < 0)
 		return -ENODEV;
 
-	status = acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
-				     ACPI_UINT32_MAX,
-				     acpi_memory_register_notify_handler, NULL,
-				     NULL, NULL);
-
-	if (ACPI_FAILURE(status)) {
-		ACPI_EXCEPTION((AE_INFO, status, "walk_namespace failed"));
-		acpi_bus_unregister_driver(&acpi_memory_device_driver);
-		return -ENODEV;
-	}
-
 	acpi_hotmem_initialized = 1;
 	return 0;
 }
 
 static void __exit acpi_memory_device_exit(void)
 {
-	acpi_status status;
-
-
-	/*
-	 * Adding this to un-install notification handlers for all the device
-	 * handles.
-	 */
-	status = acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
-				     ACPI_UINT32_MAX,
-				     acpi_memory_deregister_notify_handler, NULL,
-				     NULL, NULL);
-
-	if (ACPI_FAILURE(status))
-		ACPI_EXCEPTION((AE_INFO, status, "walk_namespace failed"));
-
 	acpi_bus_unregister_driver(&acpi_memory_device_driver);
 
 	return;
-- 
1.7.7.6


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v2 4/4] ACPI: Update container to use .sys_notify
  2012-09-06 23:40 [PATCH v2 0/4] ACPI: Refactor system notify handling Toshi Kani
                   ` (2 preceding siblings ...)
  2012-09-06 23:40 ` [PATCH v2 3/4] ACPI: Update acpi_memhotplug " Toshi Kani
@ 2012-09-06 23:40 ` Toshi Kani
  2012-10-09 13:55 ` [PATCH v2 0/4] ACPI: Refactor system notify handling Toshi Kani
  4 siblings, 0 replies; 7+ messages in thread
From: Toshi Kani @ 2012-09-06 23:40 UTC (permalink / raw)
  To: linux-acpi, lenb
  Cc: linux-kernel, bhelgaas, liuj97, isimatu.yasuaki, Toshi Kani

Changed the ACPI container driver to use .sys_notify.  Removed
ACPI namespace walks and their call-back function that register
and unregister the hotplug handler to all container objects
through acpi_[install|remove]_notify_handler().

Signed-off-by: Toshi Kani <toshi.kani@hp.com>
---
 drivers/acpi/container.c |   66 ++-------------------------------------------
 1 files changed, 3 insertions(+), 63 deletions(-)

diff --git a/drivers/acpi/container.c b/drivers/acpi/container.c
index 1f9f7d7..d4e8b71 100644
--- a/drivers/acpi/container.c
+++ b/drivers/acpi/container.c
@@ -53,6 +53,7 @@ MODULE_LICENSE("GPL");
 
 static int acpi_container_add(struct acpi_device *device);
 static int acpi_container_remove(struct acpi_device *device, int type);
+static void container_notify(acpi_handle handle, u32 type, void *context);
 
 static const struct acpi_device_id container_device_ids[] = {
 	{"ACPI0004", 0},
@@ -69,6 +70,7 @@ static struct acpi_driver acpi_container_driver = {
 	.ops = {
 		.add = acpi_container_add,
 		.remove = acpi_container_remove,
+		.sys_notify = container_notify,
 		},
 };
 
@@ -152,7 +154,7 @@ static int container_device_add(struct acpi_device **device, acpi_handle handle)
 	return result;
 }
 
-static void container_notify_cb(acpi_handle handle, u32 type, void *context)
+static void container_notify(acpi_handle handle, u32 type, void *context)
 {
 	struct acpi_device *device = NULL;
 	int result;
@@ -211,82 +213,20 @@ static void container_notify_cb(acpi_handle handle, u32 type, void *context)
 	return;
 }
 
-static acpi_status
-container_walk_namespace_cb(acpi_handle handle,
-			    u32 lvl, void *context, void **rv)
-{
-	char *hid = NULL;
-	struct acpi_device_info *info;
-	acpi_status status;
-	int *action = context;
-
-	status = acpi_get_object_info(handle, &info);
-	if (ACPI_FAILURE(status)) {
-		return AE_OK;
-	}
-
-	if (info->valid & ACPI_VALID_HID)
-		hid = info->hardware_id.string;
-
-	if (hid == NULL) {
-		goto end;
-	}
-
-	if (strcmp(hid, "ACPI0004") && strcmp(hid, "PNP0A05") &&
-	    strcmp(hid, "PNP0A06")) {
-		goto end;
-	}
-
-	switch (*action) {
-	case INSTALL_NOTIFY_HANDLER:
-		acpi_install_notify_handler(handle,
-					    ACPI_SYSTEM_NOTIFY,
-					    container_notify_cb, NULL);
-		break;
-	case UNINSTALL_NOTIFY_HANDLER:
-		acpi_remove_notify_handler(handle,
-					   ACPI_SYSTEM_NOTIFY,
-					   container_notify_cb);
-		break;
-	default:
-		break;
-	}
-
-      end:
-	kfree(info);
-
-	return AE_OK;
-}
-
 static int __init acpi_container_init(void)
 {
 	int result = 0;
-	int action = INSTALL_NOTIFY_HANDLER;
 
 	result = acpi_bus_register_driver(&acpi_container_driver);
 	if (result < 0) {
 		return (result);
 	}
 
-	/* register notify handler to every container device */
-	acpi_walk_namespace(ACPI_TYPE_DEVICE,
-			    ACPI_ROOT_OBJECT,
-			    ACPI_UINT32_MAX,
-			    container_walk_namespace_cb, NULL, &action, NULL);
-
 	return (0);
 }
 
 static void __exit acpi_container_exit(void)
 {
-	int action = UNINSTALL_NOTIFY_HANDLER;
-
-
-	acpi_walk_namespace(ACPI_TYPE_DEVICE,
-			    ACPI_ROOT_OBJECT,
-			    ACPI_UINT32_MAX,
-			    container_walk_namespace_cb, NULL, &action, NULL);
-
 	acpi_bus_unregister_driver(&acpi_container_driver);
 
 	return;
-- 
1.7.7.6


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH v2 0/4] ACPI: Refactor system notify handling
  2012-09-06 23:40 [PATCH v2 0/4] ACPI: Refactor system notify handling Toshi Kani
                   ` (3 preceding siblings ...)
  2012-09-06 23:40 ` [PATCH v2 4/4] ACPI: Update container " Toshi Kani
@ 2012-10-09 13:55 ` Toshi Kani
  2012-10-11 15:36   ` Toshi Kani
  4 siblings, 1 reply; 7+ messages in thread
From: Toshi Kani @ 2012-10-09 13:55 UTC (permalink / raw)
  To: linux-acpi; +Cc: lenb, linux-kernel, bhelgaas, liuj97, isimatu.yasuaki

Hi Len,

Can you please review this patchset?  Please let me know if you have any
concern/question.

Thanks,
-Toshi


On Thu, 2012-09-06 at 17:40 -0600, Toshi Kani wrote:
> This patchset updates the ACPI system-level (ex. hotplug)
> notify handling with a new .sys_notify interface.  It provides
> the following changes:
> 
> - Allow ACPI drivers to register their system-level (hotplug)
>   notify handlers to a new .sys_notify interface through their
>   acpi_driver table.  This removes redundant ACPI namespace
>   walks from ACPI drivers for faster booting.  The global notify
>   handler acpi_bus_notify() is called for all system-level ACPI
>   device notifications, which then calls an appropriate driver's
>   handler if any.  ACPI drivers no longer need to register or
>   unregister driver's handlers to each device object in ACPI
>   namespace.
>  
> - Support dynamic ACPI namespace with LoadTable & Unload opcode
>   without any changes in ACPI drivers.  There is no need to 
>   register / unregister handlers to ACPI device objects that are
>   being loaded to / unloaded from ACPI namespace.
> 
> - Allow ACPI drivers to use a common hotplug handler when it is
>   implemented.  It removes functional conflict between driver's
>   notify handler and the global notify handler acpi_bus_notify().
>   acpi_bus_notify() only calls an appropriate notify handler if
>   any.
> 
> Note that the changes maintain backward compatibility for ACPI
> drivers.  Any drivers registered their hotplug handlers through
> the existing interfaces, such as acpi_install_notify_handler()
> and register_acpi_bus_notifier(), will continue to work as before.
> 
> v2:
>  - Protected unbound driver from unloading when calling .sys_notify.
>  - Changed acpi_bus_notify() to call acpi_bus_notify_list first for
>    maintaining the original order.
> 
> ---
> Toshi Kani (4):
>  ACPI: Support system notify handler via .sys_notify
>  ACPI: Update processor_driver to use .sys_notify
>  ACPI: Update acpi_memhotplug to use .sys_notify
>  ACPI: Update container to use .sys_notify
> 
> ---
>  drivers/acpi/acpi_memhotplug.c  |   93 +-------------------------------------
>  drivers/acpi/bus.c              |   64 ++++++++++++++++++++-------
>  drivers/acpi/container.c        |   66 +--------------------------
>  drivers/acpi/processor_driver.c |   82 +++-------------------------------
>  drivers/acpi/scan.c             |   83 ++++++++++++++++++++++++++++++++++
>  include/acpi/acpi_bus.h         |    6 +++
>  6 files changed, 150 insertions(+), 244 deletions(-)
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/
> 
> 



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2 0/4] ACPI: Refactor system notify handling
  2012-10-09 13:55 ` [PATCH v2 0/4] ACPI: Refactor system notify handling Toshi Kani
@ 2012-10-11 15:36   ` Toshi Kani
  0 siblings, 0 replies; 7+ messages in thread
From: Toshi Kani @ 2012-10-11 15:36 UTC (permalink / raw)
  To: linux-acpi; +Cc: lenb, linux-kernel, bhelgaas, liuj97, isimatu.yasuaki

Hi Len,

Can you please review this patchset?

Thanks,
-Toshi


On Tue, 2012-10-09 at 07:55 -0600, Toshi Kani wrote:
> Hi Len,
> 
> Can you please review this patchset?  Please let me know if you have any
> concern/question.
> 
> Thanks,
> -Toshi
> 
> 
> On Thu, 2012-09-06 at 17:40 -0600, Toshi Kani wrote:
> > This patchset updates the ACPI system-level (ex. hotplug)
> > notify handling with a new .sys_notify interface.  It provides
> > the following changes:
> > 
> > - Allow ACPI drivers to register their system-level (hotplug)
> >   notify handlers to a new .sys_notify interface through their
> >   acpi_driver table.  This removes redundant ACPI namespace
> >   walks from ACPI drivers for faster booting.  The global notify
> >   handler acpi_bus_notify() is called for all system-level ACPI
> >   device notifications, which then calls an appropriate driver's
> >   handler if any.  ACPI drivers no longer need to register or
> >   unregister driver's handlers to each device object in ACPI
> >   namespace.
> >  
> > - Support dynamic ACPI namespace with LoadTable & Unload opcode
> >   without any changes in ACPI drivers.  There is no need to 
> >   register / unregister handlers to ACPI device objects that are
> >   being loaded to / unloaded from ACPI namespace.
> > 
> > - Allow ACPI drivers to use a common hotplug handler when it is
> >   implemented.  It removes functional conflict between driver's
> >   notify handler and the global notify handler acpi_bus_notify().
> >   acpi_bus_notify() only calls an appropriate notify handler if
> >   any.
> > 
> > Note that the changes maintain backward compatibility for ACPI
> > drivers.  Any drivers registered their hotplug handlers through
> > the existing interfaces, such as acpi_install_notify_handler()
> > and register_acpi_bus_notifier(), will continue to work as before.
> > 
> > v2:
> >  - Protected unbound driver from unloading when calling .sys_notify.
> >  - Changed acpi_bus_notify() to call acpi_bus_notify_list first for
> >    maintaining the original order.
> > 
> > ---
> > Toshi Kani (4):
> >  ACPI: Support system notify handler via .sys_notify
> >  ACPI: Update processor_driver to use .sys_notify
> >  ACPI: Update acpi_memhotplug to use .sys_notify
> >  ACPI: Update container to use .sys_notify
> > 
> > ---
> >  drivers/acpi/acpi_memhotplug.c  |   93 +-------------------------------------
> >  drivers/acpi/bus.c              |   64 ++++++++++++++++++++-------
> >  drivers/acpi/container.c        |   66 +--------------------------
> >  drivers/acpi/processor_driver.c |   82 +++-------------------------------
> >  drivers/acpi/scan.c             |   83 ++++++++++++++++++++++++++++++++++
> >  include/acpi/acpi_bus.h         |    6 +++
> >  6 files changed, 150 insertions(+), 244 deletions(-)
> > --
> > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> > the body of a message to majordomo@vger.kernel.org
> > More majordomo info at  http://vger.kernel.org/majordomo-info.html
> > Please read the FAQ at  http://www.tux.org/lkml/
> > 
> > 
> 
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/



^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2012-10-11 15:43 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-09-06 23:40 [PATCH v2 0/4] ACPI: Refactor system notify handling Toshi Kani
2012-09-06 23:40 ` [PATCH v2 1/4] ACPI: Support system notify handler via .sys_notify Toshi Kani
2012-09-06 23:40 ` [PATCH v2 2/4] ACPI: Update processor_driver to use .sys_notify Toshi Kani
2012-09-06 23:40 ` [PATCH v2 3/4] ACPI: Update acpi_memhotplug " Toshi Kani
2012-09-06 23:40 ` [PATCH v2 4/4] ACPI: Update container " Toshi Kani
2012-10-09 13:55 ` [PATCH v2 0/4] ACPI: Refactor system notify handling Toshi Kani
2012-10-11 15:36   ` Toshi Kani

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).