Messages in this thread | | | Date | Tue, 27 Sep 2016 10:54:13 +0200 | From | Lukas Wunner <> | Subject | Re: [Update][RFC/RFT][PATCH v3 2/5] driver core: Functional dependencies tracking support |
| |
On Fri, Sep 16, 2016 at 02:33:55PM +0200, Rafael J. Wysocki wrote: > +void device_links_unbind_consumers(struct device *dev) > +{ > + struct device_link *link; > + int idx; > + > + start: > + idx = device_links_read_lock(); > + > + list_for_each_entry_rcu(link, &dev->links_to_consumers, s_node) { > + enum device_link_status status; > + > + if (link->flags & DEVICE_LINK_STATELESS) > + continue; > + > + spin_lock(&link->lock); > + status = link->status; > + if (status == DEVICE_LINK_CONSUMER_PROBE) { > + spin_unlock(&link->lock); > + > + device_links_read_unlock(idx); > + > + wait_for_device_probe(); > + goto start; > + }
While revisiting this function it just occurred to me that there's a theoretical infinite loop here if the consumer probes, is unbound by the supplier, then reprobes again before the supplier had a chance to update the link to DEVICE_LINK_SUPPLIER_UNBIND. Perhaps this isn't a problem in practice, but noting anyway.
The problem is that the link state is written to both by the supplier and consumer. If there was a separate bit in struct device_link to indicate the supplier's desire to unbind, the problem would go away. However a mix of such a bit plus the state machine would become somewhat confusing...
Best regards,
Lukas
| |