diff options
Diffstat (limited to 'drivers/base/power/runtime.c')
| -rw-r--r-- | drivers/base/power/runtime.c | 19 | 
1 files changed, 12 insertions, 7 deletions
diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c index b75335508d2c..48616f358854 100644 --- a/drivers/base/power/runtime.c +++ b/drivers/base/power/runtime.c @@ -287,7 +287,8 @@ static int rpm_get_suppliers(struct device *dev)  {  	struct device_link *link; -	list_for_each_entry_rcu(link, &dev->links.suppliers, c_node) { +	list_for_each_entry_rcu(link, &dev->links.suppliers, c_node, +				device_links_read_lock_held()) {  		int retval;  		if (!(link->flags & DL_FLAG_PM_RUNTIME) || @@ -309,7 +310,8 @@ static void rpm_put_suppliers(struct device *dev)  {  	struct device_link *link; -	list_for_each_entry_rcu(link, &dev->links.suppliers, c_node) { +	list_for_each_entry_rcu(link, &dev->links.suppliers, c_node, +				device_links_read_lock_held()) {  		if (READ_ONCE(link->status) == DL_STATE_SUPPLIER_UNBIND)  			continue; @@ -1624,7 +1626,7 @@ void pm_runtime_remove(struct device *dev)   * runtime PM references to the device, drop the usage counter of the device   * (as many times as needed).   * - * Links with the DL_FLAG_STATELESS flag set are ignored. + * Links with the DL_FLAG_MANAGED flag unset are ignored.   *   * Since the device is guaranteed to be runtime-active at the point this is   * called, nothing else needs to be done here. @@ -1640,8 +1642,9 @@ void pm_runtime_clean_up_links(struct device *dev)  	idx = device_links_read_lock(); -	list_for_each_entry_rcu(link, &dev->links.consumers, s_node) { -		if (link->flags & DL_FLAG_STATELESS) +	list_for_each_entry_rcu(link, &dev->links.consumers, s_node, +				device_links_read_lock_held()) { +		if (!(link->flags & DL_FLAG_MANAGED))  			continue;  		while (refcount_dec_not_one(&link->rpm_active)) @@ -1662,7 +1665,8 @@ void pm_runtime_get_suppliers(struct device *dev)  	idx = device_links_read_lock(); -	list_for_each_entry_rcu(link, &dev->links.suppliers, c_node) +	list_for_each_entry_rcu(link, &dev->links.suppliers, c_node, +				device_links_read_lock_held())  		if (link->flags & DL_FLAG_PM_RUNTIME) {  			link->supplier_preactivated = true;  			refcount_inc(&link->rpm_active); @@ -1683,7 +1687,8 @@ void pm_runtime_put_suppliers(struct device *dev)  	idx = device_links_read_lock(); -	list_for_each_entry_rcu(link, &dev->links.suppliers, c_node) +	list_for_each_entry_rcu(link, &dev->links.suppliers, c_node, +				device_links_read_lock_held())  		if (link->supplier_preactivated) {  			link->supplier_preactivated = false;  			if (refcount_dec_not_one(&link->rpm_active))  |