Patch "cpufreq: Don't unregister cpufreq cooling on CPU hotplug" has been added to the 6.1-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

    cpufreq: Don't unregister cpufreq cooling on CPU hotplug

to the 6.1-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:
     cpufreq-don-t-unregister-cpufreq-cooling-on-cpu-hotp.patch
and it can be found in the queue-6.1 subdirectory.

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



commit 4e8292e599d5b1bf0f09cd5f41b3ef2a92fef8e2
Author: Viresh Kumar <viresh.kumar@xxxxxxxxxx>
Date:   Thu Feb 29 13:42:07 2024 +0530

    cpufreq: Don't unregister cpufreq cooling on CPU hotplug
    
    [ Upstream commit c4d61a529db788d2e52654f5b02c8d1de4952c5b ]
    
    Offlining a CPU and bringing it back online is a common operation and it
    happens frequently during system suspend/resume, where the non-boot CPUs
    are hotplugged out during suspend and brought back at resume.
    
    The cpufreq core already tries to make this path as fast as possible as
    the changes are only temporary in nature and full cleanup of resources
    isn't required in this case. For example the drivers can implement
    online()/offline() callbacks to avoid a lot of tear down of resources.
    
    On similar lines, there is no need to unregister the cpufreq cooling
    device during suspend / resume, but only while the policy is getting
    removed.
    
    Moreover, unregistering the cpufreq cooling device is resulting in an
    unwanted outcome, where the system suspend is eventually aborted in the
    process.  Currently, during system suspend the cpufreq core unregisters
    the cooling device, which in turn removes a kobject using device_del()
    and that generates a notification to the userspace via uevent broadcast.
    This causes system suspend to abort in some setups.
    
    This was also earlier reported (indirectly) by Roman [1]. Maybe there is
    another way around to fixing that problem properly, but this change
    makes sense anyways.
    
    Move the registering and unregistering of the cooling device to policy
    creation and removal times onlyy.
    
    Closes: https://bugzilla.kernel.org/show_bug.cgi?id=218521
    Reported-by: Manaf Meethalavalappu Pallikunhi <quic_manafm@xxxxxxxxxxx>
    Reported-by: Roman Stratiienko <r.stratiienko@xxxxxxxxx>
    Link: https://patchwork.kernel.org/project/linux-pm/patch/20220710164026.541466-1-r.stratiienko@xxxxxxxxx/ [1]
    Tested-by: Manaf Meethalavalappu Pallikunhi <quic_manafm@xxxxxxxxxxx>
    Signed-off-by: Viresh Kumar <viresh.kumar@xxxxxxxxxx>
    Reviewed-by: Dhruva Gole <d-gole@xxxxxx>
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@xxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index c8912756fc06d..91efa23e0e8f3 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -1525,7 +1525,8 @@ static int cpufreq_online(unsigned int cpu)
 	if (cpufreq_driver->ready)
 		cpufreq_driver->ready(policy);
 
-	if (cpufreq_thermal_control_enabled(cpufreq_driver))
+	/* Register cpufreq cooling only for a new policy */
+	if (new_policy && cpufreq_thermal_control_enabled(cpufreq_driver))
 		policy->cdev = of_cpufreq_cooling_register(policy);
 
 	pr_debug("initialization complete\n");
@@ -1609,11 +1610,6 @@ static void __cpufreq_offline(unsigned int cpu, struct cpufreq_policy *policy)
 	else
 		policy->last_policy = policy->policy;
 
-	if (cpufreq_thermal_control_enabled(cpufreq_driver)) {
-		cpufreq_cooling_unregister(policy->cdev);
-		policy->cdev = NULL;
-	}
-
 	if (has_target())
 		cpufreq_exit_governor(policy);
 
@@ -1674,6 +1670,15 @@ static void cpufreq_remove_dev(struct device *dev, struct subsys_interface *sif)
 		return;
 	}
 
+	/*
+	 * Unregister cpufreq cooling once all the CPUs of the policy are
+	 * removed.
+	 */
+	if (cpufreq_thermal_control_enabled(cpufreq_driver)) {
+		cpufreq_cooling_unregister(policy->cdev);
+		policy->cdev = NULL;
+	}
+
 	/* We did light-weight exit earlier, do full tear down now */
 	if (cpufreq_driver->offline)
 		cpufreq_driver->exit(policy);




[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