Thread (6 messages) 6 messages, 2 authors, 2019-06-28

Re: [PATCH V4 2/3] thermal/drivers/cpu_cooling: Unregister with the policy

From: "Rafael J. Wysocki" <rafael@kernel.org>
Date: 2019-06-28 10:07:37
Also in: linux-omap, linux-pm, lkml

On Fri, Jun 28, 2019 at 11:12 AM Rafael J. Wysocki [off-list ref] wrote:
On Thu, Jun 27, 2019 at 11:02 PM Daniel Lezcano
[off-list ref] wrote:
quoted
Currently the function cpufreq_cooling_register() returns a cooling
device pointer which is used back as a pointer to call the function
cpufreq_cooling_unregister(). Even if it is correct, it would make
sense to not leak the structure inside a cpufreq driver and keep the
code thermal code self-encapsulate. Moreover, that forces to add an
extra variable in each driver using this function.

Instead of passing the cooling device to unregister, pass the policy.

Because the cpufreq_cooling_unregister() function uses the policy to
unregister itself. The only purpose of the cooling device pointer is
to unregister the cpu cooling device.

As there is no more need of this pointer, remove it.

Signed-off-by: Daniel Lezcano <redacted>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
[cut]
quoted
-void cpufreq_cooling_unregister(struct thermal_cooling_device *cdev)
+void cpufreq_cooling_unregister(struct cpufreq_policy *policy)
 {
        struct cpufreq_cooling_device *cpufreq_cdev;
I would do

        struct cpufreq_cooling_device *ccd, *cpufreq_cdev = NULL;

and then ->
Not even that. ->
quoted
        bool last;

-       if (!cdev)
-               return;
-
-       cpufreq_cdev = cdev->devdata;
-
        mutex_lock(&cooling_list_lock);
-       list_del(&cpufreq_cdev->node);
-       /* Unregister the notifier for the last cpufreq cooling device */
-       last = list_empty(&cpufreq_cdev_list);
+       list_for_each_entry(cpufreq_cdev, &cpufreq_cdev_list, node) {
-> list_for_each_entry(ccd, &cpufreq_cdev_list, node) {
                if (ccd->policy == policy) {
quoted
+               if (cpufreq_cdev->policy == policy) {
                           cpufreq_cdev = ccd;
quoted
+                       list_del(&cpufreq_cdev->node);
+                       last = list_empty(&cpufreq_cdev_list);
+                       break;
+               }
+       }
        mutex_unlock(&cooling_list_lock);
And here

if (!cpufreq_cdev)
        return;
-> It would be sufficient to simply do:

if (cpufreq_cdev->policy != policy)
        return;

here AFAICS.
And that's it.  No new functions needed.
quoted
-       if (last)
-               cpufreq_unregister_notifier(&thermal_cpufreq_notifier_block,
-                                           CPUFREQ_POLICY_NOTIFIER);
-
And I don't that the above needs to be changed at all in any case.

quoted
-       thermal_cooling_device_unregister(cdev);
-       ida_simple_remove(&cpufreq_ida, cpufreq_cdev->id);
-       kfree(cpufreq_cdev->idle_time);
-       kfree(cpufreq_cdev);
+       if (cpufreq_cdev->policy == policy)
+               __cpufreq_cooling_unregister(cpufreq_cdev, last);
 }
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help