Skip to content

Commit 3ce3f56

Browse files
committed
PM: core: Add two macros for walking device links
Add separate macros for walking links to suppliers and consumers of a device to help device links users to avoid exposing the internals of struct dev_links_info in their code and possible coding mistakes related to that. Accordingly, use the new macros to replace open-coded device links list walks in the core power management code. No intentional functional impact. 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/1944671.tdWV9SEqCh@rafael.j.wysocki
1 parent fdd9ae2 commit 3ce3f56

3 files changed

Lines changed: 16 additions & 13 deletions

File tree

drivers/base/base.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,14 @@ void device_links_unbind_consumers(struct device *dev);
251251
void fw_devlink_drivers_done(void);
252252
void fw_devlink_probing_done(void);
253253

254+
#define dev_for_each_link_to_supplier(__link, __dev) \
255+
list_for_each_entry_srcu(__link, &(__dev)->links.suppliers, c_node, \
256+
device_links_read_lock_held())
257+
258+
#define dev_for_each_link_to_consumer(__link, __dev) \
259+
list_for_each_entry_srcu(__link, &(__dev)->links.consumers, s_node, \
260+
device_links_read_lock_held())
261+
254262
/* device pm support */
255263
void device_pm_move_to_tail(struct device *dev);
256264

drivers/base/power/main.c

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,6 @@
4040

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

43-
#define list_for_each_entry_srcu_locked(pos, head, member) \
44-
list_for_each_entry_srcu(pos, head, member, \
45-
device_links_read_lock_held())
46-
4743
/*
4844
* The entries in the dpm_list list are in a depth first order, simply
4945
* because children are guaranteed to be discovered after parents, and
@@ -281,7 +277,7 @@ static void dpm_wait_for_suppliers(struct device *dev, bool async)
281277
* callbacks freeing the link objects for the links in the list we're
282278
* walking.
283279
*/
284-
list_for_each_entry_srcu_locked(link, &dev->links.suppliers, c_node)
280+
dev_for_each_link_to_supplier(link, dev)
285281
if (READ_ONCE(link->status) != DL_STATE_DORMANT)
286282
dpm_wait(link->supplier, async);
287283

@@ -338,7 +334,7 @@ static void dpm_wait_for_consumers(struct device *dev, bool async)
338334
* continue instead of trying to continue in parallel with its
339335
* unregistration).
340336
*/
341-
list_for_each_entry_srcu_locked(link, &dev->links.consumers, s_node)
337+
dev_for_each_link_to_consumer(link, dev)
342338
if (READ_ONCE(link->status) != DL_STATE_DORMANT)
343339
dpm_wait(link->consumer, async);
344340

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

677673
/* Start processing the device's "async" consumers. */
678-
list_for_each_entry_srcu_locked(link, &dev->links.consumers, s_node)
674+
dev_for_each_link_to_consumer(link, dev)
679675
if (READ_ONCE(link->status) != DL_STATE_DORMANT)
680676
dpm_async_with_cleanup(link->consumer, func);
681677

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

13321328
/* Start processing the device's "async" suppliers. */
1333-
list_for_each_entry_srcu_locked(link, &dev->links.suppliers, c_node)
1329+
dev_for_each_link_to_supplier(link, dev)
13341330
if (READ_ONCE(link->status) != DL_STATE_DORMANT)
13351331
dpm_async_with_cleanup(link->supplier, func);
13361332

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

13851381
idx = device_links_read_lock();
13861382

1387-
list_for_each_entry_srcu_locked(link, &dev->links.suppliers, c_node)
1383+
dev_for_each_link_to_supplier(link, dev)
13881384
link->supplier->power.must_resume = true;
13891385

13901386
device_links_read_unlock(idx);
@@ -1813,7 +1809,7 @@ static void dpm_clear_superiors_direct_complete(struct device *dev)
18131809

18141810
idx = device_links_read_lock();
18151811

1816-
list_for_each_entry_srcu_locked(link, &dev->links.suppliers, c_node) {
1812+
dev_for_each_link_to_supplier(link, dev) {
18171813
spin_lock_irq(&link->supplier->power.lock);
18181814
link->supplier->power.direct_complete = false;
18191815
spin_unlock_irq(&link->supplier->power.lock);
@@ -2065,7 +2061,7 @@ static bool device_prepare_smart_suspend(struct device *dev)
20652061

20662062
idx = device_links_read_lock();
20672063

2068-
list_for_each_entry_srcu_locked(link, &dev->links.suppliers, c_node) {
2064+
dev_for_each_link_to_supplier(link, dev) {
20692065
if (!device_link_test(link, DL_FLAG_PM_RUNTIME))
20702066
continue;
20712067

drivers/base/power/runtime.c

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

19041904
idx = device_links_read_lock();
19051905

1906-
list_for_each_entry_srcu(link, &dev->links.suppliers, c_node,
1907-
device_links_read_lock_held())
1906+
dev_for_each_link_to_supplier(link, dev)
19081907
if (device_link_test(link, DL_FLAG_PM_RUNTIME)) {
19091908
link->supplier_preactivated = true;
19101909
pm_runtime_get_sync(link->supplier);

0 commit comments

Comments
 (0)