All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Rafael J. Wysocki" <rjw@rjwysocki.net>
To: Toshi Kani <toshi.kani@hp.com>
Cc: ACPI Devel Maling List <linux-acpi@vger.kernel.org>,
	LKML <linux-kernel@vger.kernel.org>,
	Linux PCI <linux-pci@vger.kernel.org>,
	Bjorn Helgaas <bhelgaas@google.com>,
	Yinghai Lu <yinghai@kernel.org>
Subject: Re: [Update][PATCH 4/6] ACPI / hotplug: Simplify device ejection routines
Date: Thu, 07 Nov 2013 01:14:57 +0100	[thread overview]
Message-ID: <1642586.5aH3MlB2GZ@vostro.rjw.lan> (raw)
In-Reply-To: <1383780421.1847.50.camel@misato.fc.hp.com>

On Wednesday, November 06, 2013 04:27:01 PM Toshi Kani wrote:
> On Mon, 2013-11-04 at 14:36 +0100, Rafael J. Wysocki wrote:
> > From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
> > 
> > Simplify handle_root_bridge_removal() and acpi_eject_store() by
> > getting rid of struct acpi_eject_event and passing device objects
> > directly to async routines executed via acpi_os_hotplug_execute().
>  :
> >  static ssize_t
> >  acpi_eject_store(struct device *d, struct device_attribute *attr,
> >  		const char *buf, size_t count)
> >  {
> >  	struct acpi_device *acpi_device = to_acpi_device(d);
> > -	struct acpi_eject_event *ej_event;
> >  	acpi_object_type not_used;
> >  	acpi_status status;
> > -	int ret;
> >  
> >  	if (!count || buf[0] != '1')
> >  		return -EINVAL;
> > @@ -518,28 +519,17 @@ acpi_eject_store(struct device *d, struc
> >  	if (ACPI_FAILURE(status) || !acpi_device->flags.ejectable)
> >  		return -ENODEV;
> >  
> > -	ej_event = kmalloc(sizeof(*ej_event), GFP_KERNEL);
> > -	if (!ej_event) {
> > -		ret = -ENOMEM;
> > -		goto err_out;
> > -	}
> >  	acpi_evaluate_hotplug_ost(acpi_device->handle, ACPI_OST_EC_OSPM_EJECT,
> >  				  ACPI_OST_SC_EJECT_IN_PROGRESS, NULL);
> > -	ej_event->device = acpi_device;
> > -	ej_event->event = ACPI_OST_EC_OSPM_EJECT;
> >  	get_device(&acpi_device->dev);
> > -	status = acpi_os_hotplug_execute(acpi_bus_hot_remove_device, ej_event);
> > +	status = acpi_os_hotplug_execute(acpi_eject_store_work, acpi_device);
> >  	if (ACPI_SUCCESS(status))
> >  		return count;
> >  
> >  	put_device(&acpi_device->dev);
> > -	kfree(ej_event);
> > -	ret = status == AE_NO_MEMORY ? -ENOMEM : -EAGAIN;
> 
> Why are you deleting the above line as part of this change?

Ah, because I forgot that acpi_os_hotplug_execute() can also return AE_NO_MEMORY. :-)

Good catch, updated pach follows.

Thanks,
Rafael

---
From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Subject: ACPI / hotplug: Simplify device ejection routines

Simplify handle_root_bridge_removal() and acpi_eject_store() by
getting rid of struct acpi_eject_event and passing device objects
directly to async routines executed via acpi_os_hotplug_execute().

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
---
 drivers/acpi/pci_root.c |   20 ++------------------
 drivers/acpi/scan.c     |   46 ++++++++++++++++++----------------------------
 include/acpi/acpi_bus.h |    5 -----
 3 files changed, 20 insertions(+), 51 deletions(-)

Index: linux-pm/drivers/acpi/pci_root.c
===================================================================
--- linux-pm.orig/drivers/acpi/pci_root.c
+++ linux-pm/drivers/acpi/pci_root.c
@@ -593,27 +593,11 @@ static void handle_root_bridge_insertion
 static void handle_root_bridge_removal(struct acpi_device *device)
 {
 	acpi_status status;
-	struct acpi_eject_event *ej_event;
-
-	ej_event = kmalloc(sizeof(*ej_event), GFP_KERNEL);
-	if (!ej_event) {
-		/* Inform firmware the hot-remove operation has error */
-		(void) acpi_evaluate_hotplug_ost(device->handle,
-					ACPI_NOTIFY_EJECT_REQUEST,
-					ACPI_OST_SC_NON_SPECIFIC_FAILURE,
-					NULL);
-		return;
-	}
-
-	ej_event->device = device;
-	ej_event->event = ACPI_NOTIFY_EJECT_REQUEST;
 
 	get_device(&device->dev);
-	status = acpi_os_hotplug_execute(acpi_bus_hot_remove_device, ej_event);
-	if (ACPI_FAILURE(status)) {
+	status = acpi_os_hotplug_execute(acpi_bus_hot_remove_device, device);
+	if (ACPI_FAILURE(status))
 		put_device(&device->dev);
-		kfree(ej_event);
-	}
 }
 
 static void _handle_hotplug_event_root(struct work_struct *work)
Index: linux-pm/drivers/acpi/scan.c
===================================================================
--- linux-pm.orig/drivers/acpi/scan.c
+++ linux-pm/drivers/acpi/scan.c
@@ -441,18 +441,8 @@ static void acpi_hotplug_notify_cb(acpi_
 					  NULL);
 }
 
-/**
- * acpi_bus_hot_remove_device: hot-remove a device and its children
- * @context: struct acpi_eject_event pointer (freed in this func)
- *
- * Hot-remove a device and its children. This function frees up the
- * memory space passed by arg context, so that the caller may call
- * this function asynchronously through acpi_os_hotplug_execute().
- */
-void acpi_bus_hot_remove_device(void *context)
+void __acpi_bus_hot_remove_device(struct acpi_device *device, u32 ost_src)
 {
-	struct acpi_eject_event *ej_event = context;
-	struct acpi_device *device = ej_event->device;
 	acpi_handle handle = device->handle;
 	int error;
 
@@ -461,13 +451,21 @@ void acpi_bus_hot_remove_device(void *co
 
 	error = acpi_scan_hot_remove(device);
 	if (error && handle)
-		acpi_evaluate_hotplug_ost(handle, ej_event->event,
+		acpi_evaluate_hotplug_ost(handle, ost_src,
 					  ACPI_OST_SC_NON_SPECIFIC_FAILURE,
 					  NULL);
 
 	mutex_unlock(&acpi_scan_lock);
 	unlock_device_hotplug();
-	kfree(context);
+}
+
+/**
+ * acpi_bus_hot_remove_device: Hot-remove a device and its children.
+ * @context: Address of the ACPI device object to hot-remove.
+ */
+void acpi_bus_hot_remove_device(void *context)
+{
+	__acpi_bus_hot_remove_device(context, ACPI_NOTIFY_EJECT_REQUEST);
 }
 EXPORT_SYMBOL(acpi_bus_hot_remove_device);
 
@@ -497,15 +495,18 @@ static ssize_t power_state_show(struct d
 
 static DEVICE_ATTR(power_state, 0444, power_state_show, NULL);
 
+static void acpi_eject_store_work(void *context)
+{
+	__acpi_bus_hot_remove_device(context, ACPI_OST_EC_OSPM_EJECT);
+}
+
 static ssize_t
 acpi_eject_store(struct device *d, struct device_attribute *attr,
 		const char *buf, size_t count)
 {
 	struct acpi_device *acpi_device = to_acpi_device(d);
-	struct acpi_eject_event *ej_event;
 	acpi_object_type not_used;
 	acpi_status status;
-	int ret;
 
 	if (!count || buf[0] != '1')
 		return -EINVAL;
@@ -518,28 +519,17 @@ acpi_eject_store(struct device *d, struc
 	if (ACPI_FAILURE(status) || !acpi_device->flags.ejectable)
 		return -ENODEV;
 
-	ej_event = kmalloc(sizeof(*ej_event), GFP_KERNEL);
-	if (!ej_event) {
-		ret = -ENOMEM;
-		goto err_out;
-	}
 	acpi_evaluate_hotplug_ost(acpi_device->handle, ACPI_OST_EC_OSPM_EJECT,
 				  ACPI_OST_SC_EJECT_IN_PROGRESS, NULL);
-	ej_event->device = acpi_device;
-	ej_event->event = ACPI_OST_EC_OSPM_EJECT;
 	get_device(&acpi_device->dev);
-	status = acpi_os_hotplug_execute(acpi_bus_hot_remove_device, ej_event);
+	status = acpi_os_hotplug_execute(acpi_eject_store_work, acpi_device);
 	if (ACPI_SUCCESS(status))
 		return count;
 
 	put_device(&acpi_device->dev);
-	kfree(ej_event);
-	ret = status == AE_NO_MEMORY ? -ENOMEM : -EAGAIN;
-
- err_out:
 	acpi_evaluate_hotplug_ost(acpi_device->handle, ACPI_OST_EC_OSPM_EJECT,
 				  ACPI_OST_SC_NON_SPECIFIC_FAILURE, NULL);
-	return ret;
+	return status == AE_NO_MEMORY ? -ENOMEM : -EAGAIN;
 }
 
 static DEVICE_ATTR(eject, 0200, NULL, acpi_eject_store);
Index: linux-pm/include/acpi/acpi_bus.h
===================================================================
--- linux-pm.orig/include/acpi/acpi_bus.h
+++ linux-pm/include/acpi/acpi_bus.h
@@ -339,11 +339,6 @@ struct acpi_bus_event {
 	u32 data;
 };
 
-struct acpi_eject_event {
-	struct acpi_device	*device;
-	u32		event;
-};
-
 struct acpi_hp_work {
 	struct work_struct work;
 	acpi_handle handle;


  reply	other threads:[~2013-11-07  0:02 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-11-04  0:17 [PATCH 0/3] ACPI scan and hotplug fixes for 3.14 Rafael J. Wysocki
2013-11-04  0:18 ` [PATCH 1/3] ACPI / scan: Start matching drivers after trying scan handlers Rafael J. Wysocki
2013-11-04  0:21 ` [PATCH 2/3] ACPI / hotplug: Refuse to hot-remove all objects with disabled hotplug Rafael J. Wysocki
2013-11-04  0:21 ` [PATCH 3/3] ACPI / hotplug: Merge device hot-removal routines Rafael J. Wysocki
2013-11-04  0:41   ` [PATCH on top of 3/3] ACPI / hotplug: Remove unnecessary get_device() and put_device() Rafael J. Wysocki
2013-11-04 13:26   ` [PATCH 3/3] ACPI / hotplug: Merge device hot-removal routines Rafael J. Wysocki
2013-11-04 13:29 ` [Update][PATCH 0/6] ACPI scan and hotplug fixes Rafael J. Wysocki
2013-11-04 13:30   ` [Update][PATCH 1/6] ACPI / scan: Start matching drivers after trying scan handlers Rafael J. Wysocki
2013-11-05 23:27     ` Toshi Kani
2013-11-04 13:32   ` [Update][PATCH 2/6] ACPI / hotplug: Refuse to hot-remove all objects with disabled hotplug Rafael J. Wysocki
2013-11-05 23:27     ` [fixup][PATCH " Rafael J. Wysocki
2013-11-06  0:39       ` Toshi Kani
2013-11-06  1:35         ` Rafael J. Wysocki
2013-11-06  1:32           ` Toshi Kani
2013-11-04 13:33   ` [Update][PATCH 3/6] ACPI / hotplug: Fix handle_root_bridge_removal() Rafael J. Wysocki
2013-11-06 23:21     ` Toshi Kani
2013-11-04 13:36   ` [Update][PATCH 4/6] ACPI / hotplug: Simplify device ejection routines Rafael J. Wysocki
2013-11-06 23:27     ` Toshi Kani
2013-11-07  0:14       ` Rafael J. Wysocki [this message]
2013-11-07  0:17         ` Toshi Kani
2013-11-07  0:35           ` Rafael J. Wysocki
2013-11-04 13:36   ` [Update][PATCH 5/6] ACPI / hotplug: Make acpi_bus_hot_remove_device() internal Rafael J. Wysocki
2013-11-04 13:36   ` [Update][PATCH 6/6] ACPI / hotplug: Merge device hot-removal routines Rafael J. Wysocki
2013-11-05 23:32   ` [PATCH 0/3] More ACPI hotplug updates (was: [Update][PATCH 0/6] ACPI scan and hotplug fixes) Rafael J. Wysocki
2013-11-05 23:34     ` [PATCH 1/3] ACPI / hotplug: Carry out PCI root eject directly Rafael J. Wysocki
2013-11-06  1:42       ` [Update][PATCH " Rafael J. Wysocki
2013-11-05 23:36     ` [PATCH 2/3] ACPI / hotplug: Do not execute "insert in progress" _OST Rafael J. Wysocki
2013-11-05 23:48     ` [PATCH 3/3] ACPI / hotplug: Consolidate deferred execution of ACPI hotplug routines Rafael J. Wysocki
2013-11-06  1:44       ` [Update][PATCH " Rafael J. Wysocki

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=1642586.5aH3MlB2GZ@vostro.rjw.lan \
    --to=rjw@rjwysocki.net \
    --cc=bhelgaas@google.com \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=toshi.kani@hp.com \
    --cc=yinghai@kernel.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.