Re: [Update][RFC/RFT][PATCH v3 2/5] driver core: Functional dependencies tracking support
From: Lukas Wunner <lukas@wunner.de>
Date: 2016-09-27 08:53:44
Also in:
lkml
From: Lukas Wunner <lukas@wunner.de>
Date: 2016-09-27 08:53:44
Also in:
lkml
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