diff mbox

ACPI / scan: Make it clear that acpi_bus_trim() cannot fail

Message ID 1511096.zmfmBrfdmu@vostro.rjw.lan (mailing list archive)
State Accepted, archived
Headers show

Commit Message

Rafael Wysocki Jan. 24, 2013, 10:56 p.m. UTC
From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>

Since acpi_bus_trim() cannot fail, change its definition to a void
function, so that its callers don't check the return value in vain
and update the callers.

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
---

On top of current linux-pm.git/linux-next.

Thanks,
Rafael

---
 drivers/acpi/dock.c                |    8 ++------
 drivers/acpi/scan.c                |   12 +++---------
 drivers/pci/hotplug/acpiphp_glue.c |   10 +++-------
 include/acpi/acpi_bus.h            |    2 +-
 4 files changed, 9 insertions(+), 23 deletions(-)


--
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Comments

Yinghai Lu Jan. 25, 2013, 12:12 a.m. UTC | #1
On Thu, Jan 24, 2013 at 2:56 PM, Rafael J. Wysocki <rjw@sisk.pl> wrote:
> From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
>
> Since acpi_bus_trim() cannot fail, change its definition to a void
> function, so that its callers don't check the return value in vain
> and update the callers.
>
> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
> ---

Acked-by: Yinghai Lu <yinghai@kernel.org>
--
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Yasuaki Ishimatsu Jan. 25, 2013, 12:43 a.m. UTC | #2
2013/01/25 7:56, Rafael J. Wysocki wrote:
> From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
>
> Since acpi_bus_trim() cannot fail, change its definition to a void
> function, so that its callers don't check the return value in vain
> and update the callers.
>
> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
> ---

Acked-by: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>

>
> On top of current linux-pm.git/linux-next.
>
> Thanks,
> Rafael
>
> ---
>   drivers/acpi/dock.c                |    8 ++------
>   drivers/acpi/scan.c                |   12 +++---------
>   drivers/pci/hotplug/acpiphp_glue.c |   10 +++-------
>   include/acpi/acpi_bus.h            |    2 +-
>   4 files changed, 9 insertions(+), 23 deletions(-)
>
> Index: linux-pm/drivers/acpi/scan.c
> ===================================================================
> --- linux-pm.orig/drivers/acpi/scan.c
> +++ linux-pm/drivers/acpi/scan.c
> @@ -127,13 +127,8 @@ void acpi_bus_hot_remove_device(void *co
>   	ACPI_DEBUG_PRINT((ACPI_DB_INFO,
>   		"Hot-removing device %s...\n", dev_name(&device->dev)));
>
> -	if (acpi_bus_trim(device)) {
> -		printk(KERN_ERR PREFIX
> -				"Removing device failed\n");
> -		goto err_out;
> -	}
> -
> -	/* device has been freed */
> +	acpi_bus_trim(device);
> +	/* Device node has been released. */
>   	device = NULL;
>
>   	/* power off device */
> @@ -1656,7 +1651,7 @@ static acpi_status acpi_bus_remove(acpi_
>   	return AE_OK;
>   }
>
> -int acpi_bus_trim(struct acpi_device *start)
> +void acpi_bus_trim(struct acpi_device *start)
>   {
>   	/*
>   	 * Execute acpi_bus_device_detach() as a post-order callback to detach
> @@ -1672,7 +1667,6 @@ int acpi_bus_trim(struct acpi_device *st
>   	acpi_walk_namespace(ACPI_TYPE_ANY, start->handle, ACPI_UINT32_MAX, NULL,
>   			    acpi_bus_remove, NULL, NULL);
>   	acpi_bus_remove(start->handle, 0, NULL, NULL);
> -	return 0;
>   }
>   EXPORT_SYMBOL_GPL(acpi_bus_trim);
>
> Index: linux-pm/include/acpi/acpi_bus.h
> ===================================================================
> --- linux-pm.orig/include/acpi/acpi_bus.h
> +++ linux-pm/include/acpi/acpi_bus.h
> @@ -386,7 +386,7 @@ int acpi_bus_register_driver(struct acpi
>   void acpi_bus_unregister_driver(struct acpi_driver *driver);
>   int acpi_bus_scan(acpi_handle handle);
>   void acpi_bus_hot_remove_device(void *context);
> -int acpi_bus_trim(struct acpi_device *start);
> +void acpi_bus_trim(struct acpi_device *start);
>   acpi_status acpi_bus_get_ejd(acpi_handle handle, acpi_handle * ejd);
>   int acpi_match_device_ids(struct acpi_device *device,
>   			  const struct acpi_device_id *ids);
> Index: linux-pm/drivers/acpi/dock.c
> ===================================================================
> --- linux-pm.orig/drivers/acpi/dock.c
> +++ linux-pm/drivers/acpi/dock.c
> @@ -336,13 +336,9 @@ static struct acpi_device * dock_create_
>   static void dock_remove_acpi_device(acpi_handle handle)
>   {
>   	struct acpi_device *device;
> -	int ret;
>
> -	if (!acpi_bus_get_device(handle, &device)) {
> -		ret = acpi_bus_trim(device);
> -		if (ret)
> -			pr_debug("error removing bus, %x\n", -ret);
> -	}
> +	if (!acpi_bus_get_device(handle, &device))
> +		acpi_bus_trim(device);
>   }
>
>   /**
> Index: linux-pm/drivers/pci/hotplug/acpiphp_glue.c
> ===================================================================
> --- linux-pm.orig/drivers/pci/hotplug/acpiphp_glue.c
> +++ linux-pm/drivers/pci/hotplug/acpiphp_glue.c
> @@ -742,8 +742,7 @@ static int acpiphp_bus_add(struct acpiph
>   		/* this shouldn't be in here, so remove
>   		 * the bus then re-add it...
>   		 */
> -		ret_val = acpi_bus_trim(device);
> -		dbg("acpi_bus_trim return %x\n", ret_val);
> +		acpi_bus_trim(device);
>   	}
>
>   	ret_val = acpi_bus_scan(func->handle);
> @@ -772,11 +771,8 @@ static int acpiphp_bus_trim(acpi_handle
>   		return retval;
>   	}
>
> -	retval = acpi_bus_trim(device);
> -	if (retval)
> -		err("cannot remove from acpi list\n");
> -
> -	return retval;
> +	acpi_bus_trim(device);
> +	return 0;
>   }
>
>   static void acpiphp_set_acpi_region(struct acpiphp_slot *slot)
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>


--
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Toshi Kani Jan. 25, 2013, 3:19 p.m. UTC | #3
On Thu, 2013-01-24 at 23:56 +0100, Rafael J. Wysocki wrote:
> From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
> 
> Since acpi_bus_trim() cannot fail, change its definition to a void
> function, so that its callers don't check the return value in vain
> and update the callers.
> 
> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>

Acked-by: Toshi Kani <toshi.kani@hp.com>

Thanks,
-Toshi

> ---
> 
> On top of current linux-pm.git/linux-next.
> 
> Thanks,
> Rafael
> 
> ---
>  drivers/acpi/dock.c                |    8 ++------
>  drivers/acpi/scan.c                |   12 +++---------
>  drivers/pci/hotplug/acpiphp_glue.c |   10 +++-------
>  include/acpi/acpi_bus.h            |    2 +-
>  4 files changed, 9 insertions(+), 23 deletions(-)
> 
> Index: linux-pm/drivers/acpi/scan.c
> ===================================================================
> --- linux-pm.orig/drivers/acpi/scan.c
> +++ linux-pm/drivers/acpi/scan.c
> @@ -127,13 +127,8 @@ void acpi_bus_hot_remove_device(void *co
>  	ACPI_DEBUG_PRINT((ACPI_DB_INFO,
>  		"Hot-removing device %s...\n", dev_name(&device->dev)));
>  
> -	if (acpi_bus_trim(device)) {
> -		printk(KERN_ERR PREFIX
> -				"Removing device failed\n");
> -		goto err_out;
> -	}
> -
> -	/* device has been freed */
> +	acpi_bus_trim(device);
> +	/* Device node has been released. */
>  	device = NULL;
>  
>  	/* power off device */
> @@ -1656,7 +1651,7 @@ static acpi_status acpi_bus_remove(acpi_
>  	return AE_OK;
>  }
>  
> -int acpi_bus_trim(struct acpi_device *start)
> +void acpi_bus_trim(struct acpi_device *start)
>  {
>  	/*
>  	 * Execute acpi_bus_device_detach() as a post-order callback to detach
> @@ -1672,7 +1667,6 @@ int acpi_bus_trim(struct acpi_device *st
>  	acpi_walk_namespace(ACPI_TYPE_ANY, start->handle, ACPI_UINT32_MAX, NULL,
>  			    acpi_bus_remove, NULL, NULL);
>  	acpi_bus_remove(start->handle, 0, NULL, NULL);
> -	return 0;
>  }
>  EXPORT_SYMBOL_GPL(acpi_bus_trim);
>  
> Index: linux-pm/include/acpi/acpi_bus.h
> ===================================================================
> --- linux-pm.orig/include/acpi/acpi_bus.h
> +++ linux-pm/include/acpi/acpi_bus.h
> @@ -386,7 +386,7 @@ int acpi_bus_register_driver(struct acpi
>  void acpi_bus_unregister_driver(struct acpi_driver *driver);
>  int acpi_bus_scan(acpi_handle handle);
>  void acpi_bus_hot_remove_device(void *context);
> -int acpi_bus_trim(struct acpi_device *start);
> +void acpi_bus_trim(struct acpi_device *start);
>  acpi_status acpi_bus_get_ejd(acpi_handle handle, acpi_handle * ejd);
>  int acpi_match_device_ids(struct acpi_device *device,
>  			  const struct acpi_device_id *ids);
> Index: linux-pm/drivers/acpi/dock.c
> ===================================================================
> --- linux-pm.orig/drivers/acpi/dock.c
> +++ linux-pm/drivers/acpi/dock.c
> @@ -336,13 +336,9 @@ static struct acpi_device * dock_create_
>  static void dock_remove_acpi_device(acpi_handle handle)
>  {
>  	struct acpi_device *device;
> -	int ret;
>  
> -	if (!acpi_bus_get_device(handle, &device)) {
> -		ret = acpi_bus_trim(device);
> -		if (ret)
> -			pr_debug("error removing bus, %x\n", -ret);
> -	}
> +	if (!acpi_bus_get_device(handle, &device))
> +		acpi_bus_trim(device);
>  }
>  
>  /**
> Index: linux-pm/drivers/pci/hotplug/acpiphp_glue.c
> ===================================================================
> --- linux-pm.orig/drivers/pci/hotplug/acpiphp_glue.c
> +++ linux-pm/drivers/pci/hotplug/acpiphp_glue.c
> @@ -742,8 +742,7 @@ static int acpiphp_bus_add(struct acpiph
>  		/* this shouldn't be in here, so remove
>  		 * the bus then re-add it...
>  		 */
> -		ret_val = acpi_bus_trim(device);
> -		dbg("acpi_bus_trim return %x\n", ret_val);
> +		acpi_bus_trim(device);
>  	}
>  
>  	ret_val = acpi_bus_scan(func->handle);
> @@ -772,11 +771,8 @@ static int acpiphp_bus_trim(acpi_handle
>  		return retval;
>  	}
>  
> -	retval = acpi_bus_trim(device);
> -	if (retval)
> -		err("cannot remove from acpi list\n");
> -
> -	return retval;
> +	acpi_bus_trim(device);
> +	return 0;
>  }
>  
>  static void acpiphp_set_acpi_region(struct acpiphp_slot *slot)
> 


--
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Vasilis Liaskovitis Feb. 18, 2013, 12:25 p.m. UTC | #4
Hi,

On Thu, Jan 24, 2013 at 11:56:50PM +0100, Rafael J. Wysocki wrote:
> From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
> 
> Since acpi_bus_trim() cannot fail, change its definition to a void
> function, so that its callers don't check the return value in vain
> and update the callers.

I have missed a few patchsets/discussions in the last month and wanted to
ask a question related to this: Does the new always-succeed 2-pass
trim_device design guarantee safe memory hot-remove operations?

Afaict if memory offline fails now, the device is ejected (_EJ0) anyways
causing a panic. Tested in a VM with linux-next-20130207 and
linux-next-20130218 by doing an SCI-eject request on a hot-plugged dimm.

Are there more patches in development for safe memory hot-remove?

thanks,

- Vasilis
--
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Rafael Wysocki Feb. 18, 2013, 1:17 p.m. UTC | #5
On Monday, February 18, 2013 01:25:49 PM Vasilis Liaskovitis wrote:
> Hi,
> 
> On Thu, Jan 24, 2013 at 11:56:50PM +0100, Rafael J. Wysocki wrote:
> > From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
> > 
> > Since acpi_bus_trim() cannot fail, change its definition to a void
> > function, so that its callers don't check the return value in vain
> > and update the callers.
> 
> I have missed a few patchsets/discussions in the last month and wanted to
> ask a question related to this: Does the new always-succeed 2-pass
> trim_device design guarantee safe memory hot-remove operations?

I doesn't by itself.  Nor it really can, because the .remove() callbacks of
device drivers are not allowed to fail.

> Afaict if memory offline fails now, the device is ejected (_EJ0) anyways
> causing a panic. Tested in a VM with linux-next-20130207 and
> linux-next-20130218 by doing an SCI-eject request on a hot-plugged dimm.
> 
> Are there more patches in development for safe memory hot-remove?

Yes, there are.  I sent a patch series yesterday introducing some safety
measures (you can disable memory hotplug from user space or disable
automatic ejection).  There's more to come still.

The plan is to introduce offline/online operations for memory modules (in
analogy with CPU core online/offline) that can be started by user space and
memory eject will only be possible after offline (i.e. when the memory module
is known to be not in use).

Thanks,
Rafael
Vasilis Liaskovitis Feb. 18, 2013, 2:53 p.m. UTC | #6
On Mon, Feb 18, 2013 at 02:17:02PM +0100, Rafael J. Wysocki wrote:
> On Monday, February 18, 2013 01:25:49 PM Vasilis Liaskovitis wrote:
> > Hi,
> > 
> > On Thu, Jan 24, 2013 at 11:56:50PM +0100, Rafael J. Wysocki wrote:
> > > From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
> > > 
> > > Since acpi_bus_trim() cannot fail, change its definition to a void
> > > function, so that its callers don't check the return value in vain
> > > and update the callers.
> > 
> > I have missed a few patchsets/discussions in the last month and wanted to
> > ask a question related to this: Does the new always-succeed 2-pass
> > trim_device design guarantee safe memory hot-remove operations?
> 
> I doesn't by itself.  Nor it really can, because the .remove() callbacks of
> device drivers are not allowed to fail.

right.

> 
> > Afaict if memory offline fails now, the device is ejected (_EJ0) anyways
> > causing a panic. Tested in a VM with linux-next-20130207 and
> > linux-next-20130218 by doing an SCI-eject request on a hot-plugged dimm.
> > 
> > Are there more patches in development for safe memory hot-remove?
> 
> Yes, there are.  I sent a patch series yesterday introducing some safety
> measures (you can disable memory hotplug from user space or disable
> automatic ejection).  There's more to come still.
> 
> The plan is to introduce offline/online operations for memory modules (in
> analogy with CPU core online/offline) that can be started by user space and
> memory eject will only be possible after offline (i.e. when the memory module
> is known to be not in use).

ok, thanks for the info. I 'll test these and the follow ups.

thanks again,

- Vasilis
--
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

Index: linux-pm/drivers/acpi/scan.c
===================================================================
--- linux-pm.orig/drivers/acpi/scan.c
+++ linux-pm/drivers/acpi/scan.c
@@ -127,13 +127,8 @@  void acpi_bus_hot_remove_device(void *co
 	ACPI_DEBUG_PRINT((ACPI_DB_INFO,
 		"Hot-removing device %s...\n", dev_name(&device->dev)));
 
-	if (acpi_bus_trim(device)) {
-		printk(KERN_ERR PREFIX
-				"Removing device failed\n");
-		goto err_out;
-	}
-
-	/* device has been freed */
+	acpi_bus_trim(device);
+	/* Device node has been released. */
 	device = NULL;
 
 	/* power off device */
@@ -1656,7 +1651,7 @@  static acpi_status acpi_bus_remove(acpi_
 	return AE_OK;
 }
 
-int acpi_bus_trim(struct acpi_device *start)
+void acpi_bus_trim(struct acpi_device *start)
 {
 	/*
 	 * Execute acpi_bus_device_detach() as a post-order callback to detach
@@ -1672,7 +1667,6 @@  int acpi_bus_trim(struct acpi_device *st
 	acpi_walk_namespace(ACPI_TYPE_ANY, start->handle, ACPI_UINT32_MAX, NULL,
 			    acpi_bus_remove, NULL, NULL);
 	acpi_bus_remove(start->handle, 0, NULL, NULL);
-	return 0;
 }
 EXPORT_SYMBOL_GPL(acpi_bus_trim);
 
Index: linux-pm/include/acpi/acpi_bus.h
===================================================================
--- linux-pm.orig/include/acpi/acpi_bus.h
+++ linux-pm/include/acpi/acpi_bus.h
@@ -386,7 +386,7 @@  int acpi_bus_register_driver(struct acpi
 void acpi_bus_unregister_driver(struct acpi_driver *driver);
 int acpi_bus_scan(acpi_handle handle);
 void acpi_bus_hot_remove_device(void *context);
-int acpi_bus_trim(struct acpi_device *start);
+void acpi_bus_trim(struct acpi_device *start);
 acpi_status acpi_bus_get_ejd(acpi_handle handle, acpi_handle * ejd);
 int acpi_match_device_ids(struct acpi_device *device,
 			  const struct acpi_device_id *ids);
Index: linux-pm/drivers/acpi/dock.c
===================================================================
--- linux-pm.orig/drivers/acpi/dock.c
+++ linux-pm/drivers/acpi/dock.c
@@ -336,13 +336,9 @@  static struct acpi_device * dock_create_
 static void dock_remove_acpi_device(acpi_handle handle)
 {
 	struct acpi_device *device;
-	int ret;
 
-	if (!acpi_bus_get_device(handle, &device)) {
-		ret = acpi_bus_trim(device);
-		if (ret)
-			pr_debug("error removing bus, %x\n", -ret);
-	}
+	if (!acpi_bus_get_device(handle, &device))
+		acpi_bus_trim(device);
 }
 
 /**
Index: linux-pm/drivers/pci/hotplug/acpiphp_glue.c
===================================================================
--- linux-pm.orig/drivers/pci/hotplug/acpiphp_glue.c
+++ linux-pm/drivers/pci/hotplug/acpiphp_glue.c
@@ -742,8 +742,7 @@  static int acpiphp_bus_add(struct acpiph
 		/* this shouldn't be in here, so remove
 		 * the bus then re-add it...
 		 */
-		ret_val = acpi_bus_trim(device);
-		dbg("acpi_bus_trim return %x\n", ret_val);
+		acpi_bus_trim(device);
 	}
 
 	ret_val = acpi_bus_scan(func->handle);
@@ -772,11 +771,8 @@  static int acpiphp_bus_trim(acpi_handle
 		return retval;
 	}
 
-	retval = acpi_bus_trim(device);
-	if (retval)
-		err("cannot remove from acpi list\n");
-
-	return retval;
+	acpi_bus_trim(device);
+	return 0;
 }
 
 static void acpiphp_set_acpi_region(struct acpiphp_slot *slot)