Patch "ACPI: scan: Release PM resources blocked by unused objects" has been added to the 5.14-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    ACPI: scan: Release PM resources blocked by unused objects

to the 5.14-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     acpi-scan-release-pm-resources-blocked-by-unused-obj.patch
and it can be found in the queue-5.14 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 35430dbdd349c43efb0e19f1aeb5915985eb1d2d
Author: Rafael J. Wysocki <rafael.j.wysocki@xxxxxxxxx>
Date:   Sat Oct 9 16:22:09 2021 +0200

    ACPI: scan: Release PM resources blocked by unused objects
    
    [ Upstream commit c10383e8ddf4810b9a5c1595404c2724d925a0a6 ]
    
    On some systems the ACPI namespace contains device objects that are
    not used in certain configurations of the system.  If they start off
    in the D0 power state configuration, they will stay in it until the
    system reboots, because of the lack of any mechanism possibly causing
    their configuration to change.  If that happens, they may prevent
    some power resources from being turned off or generally they may
    prevent the platform from getting into the deepest low-power states
    thus causing some energy to be wasted.
    
    Address this issue by changing the configuration of unused ACPI
    device objects to the D3cold power state one after carrying out
    the ACPI-based enumeration of devices.
    
    BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=214091
    Link: https://lore.kernel.org/linux-acpi/20211007205126.11769-1-mario.limonciello@xxxxxxx/
    Reported-by: Mario Limonciello <mario.limonciello@xxxxxxx>
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@xxxxxxxxx>
    Tested-by: Mario Limonciello <mario.limonciello@xxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/acpi/glue.c b/drivers/acpi/glue.c
index fce3f3bba714a..3fd1713f1f626 100644
--- a/drivers/acpi/glue.c
+++ b/drivers/acpi/glue.c
@@ -363,3 +363,28 @@ int acpi_platform_notify(struct device *dev, enum kobject_action action)
 	}
 	return 0;
 }
+
+int acpi_dev_turn_off_if_unused(struct device *dev, void *not_used)
+{
+	struct acpi_device *adev = to_acpi_device(dev);
+
+	/*
+	 * Skip device objects with device IDs, because they may be in use even
+	 * if they are not companions of any physical device objects.
+	 */
+	if (adev->pnp.type.hardware_id)
+		return 0;
+
+	mutex_lock(&adev->physical_node_lock);
+
+	/*
+	 * Device objects without device IDs are not in use if they have no
+	 * corresponding physical device objects.
+	 */
+	if (list_empty(&adev->physical_node_list))
+		acpi_device_set_power(adev, ACPI_STATE_D3_COLD);
+
+	mutex_unlock(&adev->physical_node_lock);
+
+	return 0;
+}
diff --git a/drivers/acpi/internal.h b/drivers/acpi/internal.h
index d91b560e88674..8fbdc172864b0 100644
--- a/drivers/acpi/internal.h
+++ b/drivers/acpi/internal.h
@@ -117,6 +117,7 @@ bool acpi_device_is_battery(struct acpi_device *adev);
 bool acpi_device_is_first_physical_node(struct acpi_device *adev,
 					const struct device *dev);
 int acpi_bus_register_early_device(int type);
+int acpi_dev_turn_off_if_unused(struct device *dev, void *not_used);
 
 /* --------------------------------------------------------------------------
                      Device Matching and Notification
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
index b24513ec3fae1..ae9464091f1b1 100644
--- a/drivers/acpi/scan.c
+++ b/drivers/acpi/scan.c
@@ -2560,6 +2560,12 @@ int __init acpi_scan_init(void)
 		}
 	}
 
+	/*
+	 * Make sure that power management resources are not blocked by ACPI
+	 * device objects with no users.
+	 */
+	bus_for_each_dev(&acpi_bus_type, NULL, NULL, acpi_dev_turn_off_if_unused);
+
 	acpi_turn_off_unused_power_resources();
 
 	acpi_scan_initialized = true;



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux