Skip to content

Commit

Permalink
PM: runtime: Simplify locking in pm_runtime_put_suppliers()
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Rafael J. Wysocki committed Dec 22, 2021
1 parent e4719b5 commit 50a4606
Showing 1 changed file with 8 additions and 4 deletions.
12 changes: 8 additions & 4 deletions drivers/base/power/runtime.c
Original file line number Diff line number Diff line change
Expand Up @@ -1748,20 +1748,24 @@ 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();

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);
}
Expand Down

0 comments on commit 50a4606

Please sign in to comment.