ACPI / hotplug: Use device offline/online for graceful hot-removal
Modify the generic ACPI hotplug code to be able to check if devices scheduled for hot-removal may be gracefully removed from the system using the device offline/online mechanism introduced previously. Namely, make acpi_scan_hot_remove() handling device hot-removal call device_offline() for all physical companions of the ACPI device nodes involved in the operation and check the results. If any of the device_offline() calls fails, the function will not progress to the removal phase (which cannot be aborted), unless its (new) force argument is set (in case of a failing offline it will put the devices offlined by it back online). In support of 'forced' device hot-removal, add a new sysfs attribute 'force_remove' that will reside under /sys/firmware/acpi/hotplug/. Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Reviewed-by: Toshi Kani <toshi.kani@hp.com>
This commit is contained in:
@@ -780,6 +780,33 @@ void acpi_sysfs_add_hotplug_profile(struct acpi_hotplug_profile *hotplug,
|
||||
pr_err(PREFIX "Unable to add hotplug profile '%s'\n", name);
|
||||
}
|
||||
|
||||
static ssize_t force_remove_show(struct kobject *kobj,
|
||||
struct kobj_attribute *attr, char *buf)
|
||||
{
|
||||
return sprintf(buf, "%d\n", !!acpi_force_hot_remove);
|
||||
}
|
||||
|
||||
static ssize_t force_remove_store(struct kobject *kobj,
|
||||
struct kobj_attribute *attr,
|
||||
const char *buf, size_t size)
|
||||
{
|
||||
bool val;
|
||||
int ret;
|
||||
|
||||
ret = strtobool(buf, &val);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
lock_device_hotplug();
|
||||
acpi_force_hot_remove = val;
|
||||
unlock_device_hotplug();
|
||||
return size;
|
||||
}
|
||||
|
||||
static const struct kobj_attribute force_remove_attr =
|
||||
__ATTR(force_remove, S_IRUGO | S_IWUSR, force_remove_show,
|
||||
force_remove_store);
|
||||
|
||||
int __init acpi_sysfs_init(void)
|
||||
{
|
||||
int result;
|
||||
@@ -789,6 +816,10 @@ int __init acpi_sysfs_init(void)
|
||||
return result;
|
||||
|
||||
hotplug_kobj = kobject_create_and_add("hotplug", acpi_kobj);
|
||||
result = sysfs_create_file(hotplug_kobj, &force_remove_attr.attr);
|
||||
if (result)
|
||||
return result;
|
||||
|
||||
result = sysfs_create_file(acpi_kobj, &pm_profile_attr.attr);
|
||||
return result;
|
||||
}
|
||||
|
Referens i nytt ärende
Block a user