Skip to content

Commit fdd9ae2

Browse files
committed
PM: core: Annotate loops walking device links as _srcu
Since SRCU is used for the protection of device link lists, the loops over device link lists in multiple places in drivers/base/power/main.c and in pm_runtime_get_suppliers() should be annotated as _srcu rather than as _rcu which is the case currently. Change the annotations accordingly. Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org> Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Link: https://patch.msgid.link/2393512.ElGaqSPkdT@rafael.j.wysocki
1 parent b320789 commit fdd9ae2

2 files changed

Lines changed: 11 additions & 11 deletions

File tree

drivers/base/power/main.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@
4040

4141
typedef int (*pm_callback_t)(struct device *);
4242

43-
#define list_for_each_entry_rcu_locked(pos, head, member) \
44-
list_for_each_entry_rcu(pos, head, member, \
43+
#define list_for_each_entry_srcu_locked(pos, head, member) \
44+
list_for_each_entry_srcu(pos, head, member, \
4545
device_links_read_lock_held())
4646

4747
/*
@@ -281,7 +281,7 @@ static void dpm_wait_for_suppliers(struct device *dev, bool async)
281281
* callbacks freeing the link objects for the links in the list we're
282282
* walking.
283283
*/
284-
list_for_each_entry_rcu_locked(link, &dev->links.suppliers, c_node)
284+
list_for_each_entry_srcu_locked(link, &dev->links.suppliers, c_node)
285285
if (READ_ONCE(link->status) != DL_STATE_DORMANT)
286286
dpm_wait(link->supplier, async);
287287

@@ -338,7 +338,7 @@ static void dpm_wait_for_consumers(struct device *dev, bool async)
338338
* continue instead of trying to continue in parallel with its
339339
* unregistration).
340340
*/
341-
list_for_each_entry_rcu_locked(link, &dev->links.consumers, s_node)
341+
list_for_each_entry_srcu_locked(link, &dev->links.consumers, s_node)
342342
if (READ_ONCE(link->status) != DL_STATE_DORMANT)
343343
dpm_wait(link->consumer, async);
344344

@@ -675,7 +675,7 @@ static void dpm_async_resume_subordinate(struct device *dev, async_func_t func)
675675
idx = device_links_read_lock();
676676

677677
/* Start processing the device's "async" consumers. */
678-
list_for_each_entry_rcu_locked(link, &dev->links.consumers, s_node)
678+
list_for_each_entry_srcu_locked(link, &dev->links.consumers, s_node)
679679
if (READ_ONCE(link->status) != DL_STATE_DORMANT)
680680
dpm_async_with_cleanup(link->consumer, func);
681681

@@ -1330,7 +1330,7 @@ static void dpm_async_suspend_superior(struct device *dev, async_func_t func)
13301330
idx = device_links_read_lock();
13311331

13321332
/* Start processing the device's "async" suppliers. */
1333-
list_for_each_entry_rcu_locked(link, &dev->links.suppliers, c_node)
1333+
list_for_each_entry_srcu_locked(link, &dev->links.suppliers, c_node)
13341334
if (READ_ONCE(link->status) != DL_STATE_DORMANT)
13351335
dpm_async_with_cleanup(link->supplier, func);
13361336

@@ -1384,7 +1384,7 @@ static void dpm_superior_set_must_resume(struct device *dev)
13841384

13851385
idx = device_links_read_lock();
13861386

1387-
list_for_each_entry_rcu_locked(link, &dev->links.suppliers, c_node)
1387+
list_for_each_entry_srcu_locked(link, &dev->links.suppliers, c_node)
13881388
link->supplier->power.must_resume = true;
13891389

13901390
device_links_read_unlock(idx);
@@ -1813,7 +1813,7 @@ static void dpm_clear_superiors_direct_complete(struct device *dev)
18131813

18141814
idx = device_links_read_lock();
18151815

1816-
list_for_each_entry_rcu_locked(link, &dev->links.suppliers, c_node) {
1816+
list_for_each_entry_srcu_locked(link, &dev->links.suppliers, c_node) {
18171817
spin_lock_irq(&link->supplier->power.lock);
18181818
link->supplier->power.direct_complete = false;
18191819
spin_unlock_irq(&link->supplier->power.lock);
@@ -2065,7 +2065,7 @@ static bool device_prepare_smart_suspend(struct device *dev)
20652065

20662066
idx = device_links_read_lock();
20672067

2068-
list_for_each_entry_rcu_locked(link, &dev->links.suppliers, c_node) {
2068+
list_for_each_entry_srcu_locked(link, &dev->links.suppliers, c_node) {
20692069
if (!device_link_test(link, DL_FLAG_PM_RUNTIME))
20702070
continue;
20712071

drivers/base/power/runtime.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1903,8 +1903,8 @@ void pm_runtime_get_suppliers(struct device *dev)
19031903

19041904
idx = device_links_read_lock();
19051905

1906-
list_for_each_entry_rcu(link, &dev->links.suppliers, c_node,
1907-
device_links_read_lock_held())
1906+
list_for_each_entry_srcu(link, &dev->links.suppliers, c_node,
1907+
device_links_read_lock_held())
19081908
if (device_link_test(link, DL_FLAG_PM_RUNTIME)) {
19091909
link->supplier_preactivated = true;
19101910
pm_runtime_get_sync(link->supplier);

0 commit comments

Comments
 (0)