PM: runtime: Simplify locking in pm_runtime_put_suppliers()
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Fri, 17 Dec 2021 19:16:02 +0000 (20:16 +0100)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Wed, 22 Dec 2021 17:37:55 +0000 (18:37 +0100)
Notice that pm_runtime_put_suppliers() cannot be called with
disabled interrupts, because it may sleep (due to the device
links read locking in the non-SRCU case), and so it can use
spin_lock_irq() and spin_unlock_irq() for the locking.

Update the function accordingly and while at it move the "put"
local variable in it into the inner block where it is used.

This change is not expected to have any visible functional impact.

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/base/power/runtime.c

index f1b856ea8e10b2c90b846366da7cf172050c4a71..2f3cce17219bd6df9971e37cc91d1fab3bb3219c 100644 (file)
@@ -1748,8 +1748,6 @@ void pm_runtime_get_suppliers(struct device *dev)
 void pm_runtime_put_suppliers(struct device *dev)
 {
        struct device_link *link;
-       unsigned long flags;
-       bool put;
        int idx;
 
        idx = device_links_read_lock();
@@ -1757,11 +1755,17 @@ void pm_runtime_put_suppliers(struct device *dev)
        list_for_each_entry_rcu(link, &dev->links.suppliers, c_node,
                                device_links_read_lock_held())
                if (link->supplier_preactivated) {
+                       bool put;
+
                        link->supplier_preactivated = false;
-                       spin_lock_irqsave(&dev->power.lock, flags);
+
+                       spin_lock_irq(&dev->power.lock);
+
                        put = pm_runtime_status_suspended(dev) &&
                              refcount_dec_not_one(&link->rpm_active);
-                       spin_unlock_irqrestore(&dev->power.lock, flags);
+
+                       spin_unlock_irq(&dev->power.lock);
+
                        if (put)
                                pm_runtime_put(link->supplier);
                }