Re: [PATCH v4 0/5] Functional dependencies between devices
[+cc Andreas Noever] On Thu, Sep 29, 2016 at 02:24:58AM +0200, Rafael J. Wysocki wrote: > On Thursday, September 08, 2016 11:25:44 PM Rafael J. Wysocki wrote: > > > This is a refresh of the functional dependencies series that I posted > > > last year and which has been picked up by Marek quite recently. I've cooked up a patch to replace quirk_apple_wait_for_thunderbolt() in drivers/pci/quirks.c with the "device links" functionality added by Rafael's series quoted above. The patch is included below. I've also pushed a branch to GitHub which comprises Rafael's series plus the patch on top: https://github.com/l1k/linux/commits/device_links One issue that cropped up is that the API does not provide public functions to lock a device's link lists for traversal. Thus when iterating over the links and deleting them in the thunderbolt driver's ->remove hook, the list is completely unprotected. It's not an issue for this particular use case as noone else but this driver adds or deletes links to the NHI, it just *looks* a bit fishy and there may be other use cases where locking matters. Maybe patch [2/5] should export device_links_read_lock() / device_links_read_unlock()? Apart from that, everything seems to work as it should: On driver load: [ 13.829752] thunderbolt :07:00.0: NHI initialized, starting thunderbolt [...] [ 13.853747] pcieport :06:03.0: Linked as a consumer to :07:00.0 [ 13.853749] pcieport :06:04.0: Linked as a consumer to :07:00.0 [ 13.853751] pcieport :06:05.0: Linked as a consumer to :07:00.0 [ 13.853753] pcieport :06:06.0: Linked as a consumer to :07:00.0 Those are the four hotplug ports on the controller. On driver unload: [ 89.378691] pcieport :06:03.0: Dropping the link to :07:00.0 [ 89.383346] pcieport :06:04.0: Dropping the link to :07:00.0 [ 89.387977] pcieport :06:05.0: Dropping the link to :07:00.0 [ 89.392589] pcieport :06:06.0: Dropping the link to :07:00.0 [...] [ 89.424511] thunderbolt :07:00.0: shutdown On resume from system sleep: [ 282.537470] ACPI: Waking up from system sleep state S3 [...] [ 282.625378] pcieport :06:04.0: start waiting for :07:00.0 [ 282.625380] pcieport :06:03.0: start waiting for :07:00.0 [ 282.625382] pcieport :06:05.0: start waiting for :07:00.0 [ 282.625383] pcieport :06:06.0: start waiting for :07:00.0 [ 282.656789] thunderbolt :07:00.0: resuming... [...] [ 283.500660] thunderbolt :07:00.0: resume finished [ 283.500672] pcieport :06:04.0: done waiting for :07:00.0 [ 283.500673] pcieport :06:03.0: done waiting for :07:00.0 [ 283.500675] pcieport :06:05.0: done waiting for :07:00.0 [ 283.500677] pcieport :06:06.0: done waiting for :07:00.0 [ 283.564849] PM: noirq resume of devices complete after 971.845 msecs [ 283.564868] pciehp :06:04.0:pcie204: Slot(4-1): Card present [ 283.564873] pciehp :06:04.0:pcie204: Slot(4-1): Link Up The "start waiting for" and "done waiting for" messages are debug printk's that I had put in there. I've also rebased and tested this on my Thunderbolt runpm series and the only difference is that the dpm_wait() is only executed for port :06:04.0 (the one which actually has a device connected), the three other hotplug ports use direct_complete. So Rafael's series is now also Tested-by: Lukas Wunnerthough it should be noted that my patch does not make use of the optional DEVICE_LINK_PM_RUNTIME flag introduced with patch [4/5]. (But I believe Marek has tested that feature.) Thanks, Lukas -- >8 -- Subject: [PATCH] thunderbolt: Use device links instead of PCI quirk When resuming from system sleep, attached Thunderbolt devices are inaccessible until the NHI has re-established PCI tunnels to them. As a consequence, the Thunderbolt controller's hotplug bridges (below which the attached devices appear) must delay resuming until the NHI has finished. That requirement is not enforced by the PM core automatically as it only guarantees correct resume ordering between parent and child, and the NHI is not a parent of the hotplug bridges, but rather a niece. So far we've open coded this requirement in a PCI quirk, which has the following disadvantages: - The code for the NHI resides in drivers/thunderbolt/, whereas the code for the hotplug bridges resides in drivers/pci/quirks.c, which may be surprising and non-obvious in particular for new contributors. - Whenever support for an additional Thunderbolt controller is added, its PCI device ID needs to be amended in both places, which invites mistakes. E.g. commit a42fb351ca1f ("thunderbolt: Allow loading of module on recent Apple MacBooks with thunderbolt 2 controller") relaxed the subvendor and subdevice ID in the NHI code but forgot to also change the hotplug bridge code. - Since the PCI quirk cannot keep any state, it has to search for the NHI
Re: [PATCH v4 0/5] Functional dependencies between devices
[+cc Andreas Noever] On Thu, Sep 29, 2016 at 02:24:58AM +0200, Rafael J. Wysocki wrote: > On Thursday, September 08, 2016 11:25:44 PM Rafael J. Wysocki wrote: > > > This is a refresh of the functional dependencies series that I posted > > > last year and which has been picked up by Marek quite recently. I've cooked up a patch to replace quirk_apple_wait_for_thunderbolt() in drivers/pci/quirks.c with the "device links" functionality added by Rafael's series quoted above. The patch is included below. I've also pushed a branch to GitHub which comprises Rafael's series plus the patch on top: https://github.com/l1k/linux/commits/device_links One issue that cropped up is that the API does not provide public functions to lock a device's link lists for traversal. Thus when iterating over the links and deleting them in the thunderbolt driver's ->remove hook, the list is completely unprotected. It's not an issue for this particular use case as noone else but this driver adds or deletes links to the NHI, it just *looks* a bit fishy and there may be other use cases where locking matters. Maybe patch [2/5] should export device_links_read_lock() / device_links_read_unlock()? Apart from that, everything seems to work as it should: On driver load: [ 13.829752] thunderbolt :07:00.0: NHI initialized, starting thunderbolt [...] [ 13.853747] pcieport :06:03.0: Linked as a consumer to :07:00.0 [ 13.853749] pcieport :06:04.0: Linked as a consumer to :07:00.0 [ 13.853751] pcieport :06:05.0: Linked as a consumer to :07:00.0 [ 13.853753] pcieport :06:06.0: Linked as a consumer to :07:00.0 Those are the four hotplug ports on the controller. On driver unload: [ 89.378691] pcieport :06:03.0: Dropping the link to :07:00.0 [ 89.383346] pcieport :06:04.0: Dropping the link to :07:00.0 [ 89.387977] pcieport :06:05.0: Dropping the link to :07:00.0 [ 89.392589] pcieport :06:06.0: Dropping the link to :07:00.0 [...] [ 89.424511] thunderbolt :07:00.0: shutdown On resume from system sleep: [ 282.537470] ACPI: Waking up from system sleep state S3 [...] [ 282.625378] pcieport :06:04.0: start waiting for :07:00.0 [ 282.625380] pcieport :06:03.0: start waiting for :07:00.0 [ 282.625382] pcieport :06:05.0: start waiting for :07:00.0 [ 282.625383] pcieport :06:06.0: start waiting for :07:00.0 [ 282.656789] thunderbolt :07:00.0: resuming... [...] [ 283.500660] thunderbolt :07:00.0: resume finished [ 283.500672] pcieport :06:04.0: done waiting for :07:00.0 [ 283.500673] pcieport :06:03.0: done waiting for :07:00.0 [ 283.500675] pcieport :06:05.0: done waiting for :07:00.0 [ 283.500677] pcieport :06:06.0: done waiting for :07:00.0 [ 283.564849] PM: noirq resume of devices complete after 971.845 msecs [ 283.564868] pciehp :06:04.0:pcie204: Slot(4-1): Card present [ 283.564873] pciehp :06:04.0:pcie204: Slot(4-1): Link Up The "start waiting for" and "done waiting for" messages are debug printk's that I had put in there. I've also rebased and tested this on my Thunderbolt runpm series and the only difference is that the dpm_wait() is only executed for port :06:04.0 (the one which actually has a device connected), the three other hotplug ports use direct_complete. So Rafael's series is now also Tested-by: Lukas Wunner though it should be noted that my patch does not make use of the optional DEVICE_LINK_PM_RUNTIME flag introduced with patch [4/5]. (But I believe Marek has tested that feature.) Thanks, Lukas -- >8 -- Subject: [PATCH] thunderbolt: Use device links instead of PCI quirk When resuming from system sleep, attached Thunderbolt devices are inaccessible until the NHI has re-established PCI tunnels to them. As a consequence, the Thunderbolt controller's hotplug bridges (below which the attached devices appear) must delay resuming until the NHI has finished. That requirement is not enforced by the PM core automatically as it only guarantees correct resume ordering between parent and child, and the NHI is not a parent of the hotplug bridges, but rather a niece. So far we've open coded this requirement in a PCI quirk, which has the following disadvantages: - The code for the NHI resides in drivers/thunderbolt/, whereas the code for the hotplug bridges resides in drivers/pci/quirks.c, which may be surprising and non-obvious in particular for new contributors. - Whenever support for an additional Thunderbolt controller is added, its PCI device ID needs to be amended in both places, which invites mistakes. E.g. commit a42fb351ca1f ("thunderbolt: Allow loading of module on recent Apple MacBooks with thunderbolt 2 controller") relaxed the subvendor and subdevice ID in the NHI code but forgot to also change the hotplug bridge code. - Since the PCI quirk cannot keep any state, it has to search for the NHI over and over
Re: [PATCH v4 0/5] Functional dependencies between devices
On Thursday, September 29, 2016 08:58:43 AM Marek Szyprowski wrote: > Hi Rafael, > > On 2016-09-29 02:24, Rafael J. Wysocki wrote: > > Hi Everyone, > > > > On Thursday, September 08, 2016 11:25:44 PM Rafael J. Wysocki wrote: > >>> Hi Everyone, > >>> > >>> This is a refresh of the functional dependencies series that I posted last > >>> year and which has picked up by Marek quite recently. For reference, > >>> appended is my introductory message sent previously (which may be > >>> slightly outdated now). > >>> > >>> As last time, the first patch rearranges the code around > >>> __device_release_driver() a bit to prepare it for the next one (it > >>> actually hasn't changed AFAICS). > >>> > >>> The second patch introduces the actual device links mechanics, but without > >>> system suspend/resume and runtime PM support which are added by the > >>> subsequent patches. > >>> > >>> Some bugs found by Marek during his work on these patches should be fixed > >>> here. In particular, the endless recursion in device_reorder_to_tail() > >>> which simply was broken before. > >>> > >>> There are two additional patches to address the issue with runtime PM > >>> support > >>> that occured when runtime PM was disabled for some suppliers due to a PM > >>> sleep transition in progress. Those patches simply make runtime PM > >>> helpers > >>> return 0 in that case which may be controversial, so please let me know if > >>> there are concerns about those. > >>> > >>> The way device_link_add() works is a bit different, as it takes an > >>> additional > >>> status argument now. That makes it possible to create a link in any > >>> state, > >>> with extra care of course, and should address the problem pointed to by > >>> Lukas > >>> during the previous discussion. > >>> > >>> Also some comments from Tomeu have been addressed. > >> An update here. > >> > >> The first patch hasn't changed, so I'm resending it. > >> > >> The majority of changes in the other patches are in order to address Lukas' > >> comments. > >> > >> First off, I added a DEVICE_LINK_STATELESS flag that will prevent the > >> driver > >> core from trying to maintain device links having it set. > >> > >> Also, the DEVICE_LINK_PERSISTENT flag was dropped (as link "persistence" is > >> the default behavior now) and there's a new one, DEVICE_LINK_AUTOREMOVE, > >> that will cause the driver core to remove the link on the consumer driver > >> unbind. > >> > >> Moreover, the code checks attempts to create a link between a parent and a > >> child device now and actively prevents that from happening. > >> > >> The changelog of the second patch has been updated as requested by Ulf. > >> > >> The third patch was updated to fix a bug related to the (previously > >> missing) > >> clearing of power.direct_complete for supplier devices having consumers > >> that > >> don't use direct_complete. > >> > >> The next two (runtime PM) patches turned out to be unnecessary, so I've > >> dropped them. > >> > >> The runtime PM patch [4/5] was reorganized somewhat to reduce the > >> indentation > >> level in there, but the code flow introduced by it is essentially the same > >> and the last patch was simply rebased on top of the new series. > > Time for another update. :-) > > > > Fewer changes this time, mostly to address issues found by Lukas and Marek. > > > > The most significant one is to make device_link_add() cope with the case > > when > > the consumer device has not been registered yet when it is called. The > > supplier device still is required to be registered and the function will > > return > > NULL if that is not the case. > > > > Another significant change is in patch [4/5] that now makes the core apply > > pm_runtime_get_sync()/pm_runtime_put() to supplier devices around the > > probing > > of a consumer one (in analogy with the parent). > > Thanks for the update! Updated version fixes all the remaining issues. > > Tested-by: Marek SzyprowskiThanks Marek!
Re: [PATCH v4 0/5] Functional dependencies between devices
On Thursday, September 29, 2016 08:58:43 AM Marek Szyprowski wrote: > Hi Rafael, > > On 2016-09-29 02:24, Rafael J. Wysocki wrote: > > Hi Everyone, > > > > On Thursday, September 08, 2016 11:25:44 PM Rafael J. Wysocki wrote: > >>> Hi Everyone, > >>> > >>> This is a refresh of the functional dependencies series that I posted last > >>> year and which has picked up by Marek quite recently. For reference, > >>> appended is my introductory message sent previously (which may be > >>> slightly outdated now). > >>> > >>> As last time, the first patch rearranges the code around > >>> __device_release_driver() a bit to prepare it for the next one (it > >>> actually hasn't changed AFAICS). > >>> > >>> The second patch introduces the actual device links mechanics, but without > >>> system suspend/resume and runtime PM support which are added by the > >>> subsequent patches. > >>> > >>> Some bugs found by Marek during his work on these patches should be fixed > >>> here. In particular, the endless recursion in device_reorder_to_tail() > >>> which simply was broken before. > >>> > >>> There are two additional patches to address the issue with runtime PM > >>> support > >>> that occured when runtime PM was disabled for some suppliers due to a PM > >>> sleep transition in progress. Those patches simply make runtime PM > >>> helpers > >>> return 0 in that case which may be controversial, so please let me know if > >>> there are concerns about those. > >>> > >>> The way device_link_add() works is a bit different, as it takes an > >>> additional > >>> status argument now. That makes it possible to create a link in any > >>> state, > >>> with extra care of course, and should address the problem pointed to by > >>> Lukas > >>> during the previous discussion. > >>> > >>> Also some comments from Tomeu have been addressed. > >> An update here. > >> > >> The first patch hasn't changed, so I'm resending it. > >> > >> The majority of changes in the other patches are in order to address Lukas' > >> comments. > >> > >> First off, I added a DEVICE_LINK_STATELESS flag that will prevent the > >> driver > >> core from trying to maintain device links having it set. > >> > >> Also, the DEVICE_LINK_PERSISTENT flag was dropped (as link "persistence" is > >> the default behavior now) and there's a new one, DEVICE_LINK_AUTOREMOVE, > >> that will cause the driver core to remove the link on the consumer driver > >> unbind. > >> > >> Moreover, the code checks attempts to create a link between a parent and a > >> child device now and actively prevents that from happening. > >> > >> The changelog of the second patch has been updated as requested by Ulf. > >> > >> The third patch was updated to fix a bug related to the (previously > >> missing) > >> clearing of power.direct_complete for supplier devices having consumers > >> that > >> don't use direct_complete. > >> > >> The next two (runtime PM) patches turned out to be unnecessary, so I've > >> dropped them. > >> > >> The runtime PM patch [4/5] was reorganized somewhat to reduce the > >> indentation > >> level in there, but the code flow introduced by it is essentially the same > >> and the last patch was simply rebased on top of the new series. > > Time for another update. :-) > > > > Fewer changes this time, mostly to address issues found by Lukas and Marek. > > > > The most significant one is to make device_link_add() cope with the case > > when > > the consumer device has not been registered yet when it is called. The > > supplier device still is required to be registered and the function will > > return > > NULL if that is not the case. > > > > Another significant change is in patch [4/5] that now makes the core apply > > pm_runtime_get_sync()/pm_runtime_put() to supplier devices around the > > probing > > of a consumer one (in analogy with the parent). > > Thanks for the update! Updated version fixes all the remaining issues. > > Tested-by: Marek Szyprowski Thanks Marek!
Re: [PATCH v4 0/5] Functional dependencies between devices
Hi Rafael, On 2016-09-29 02:24, Rafael J. Wysocki wrote: Hi Everyone, On Thursday, September 08, 2016 11:25:44 PM Rafael J. Wysocki wrote: Hi Everyone, This is a refresh of the functional dependencies series that I posted last year and which has picked up by Marek quite recently. For reference, appended is my introductory message sent previously (which may be slightly outdated now). As last time, the first patch rearranges the code around __device_release_driver() a bit to prepare it for the next one (it actually hasn't changed AFAICS). The second patch introduces the actual device links mechanics, but without system suspend/resume and runtime PM support which are added by the subsequent patches. Some bugs found by Marek during his work on these patches should be fixed here. In particular, the endless recursion in device_reorder_to_tail() which simply was broken before. There are two additional patches to address the issue with runtime PM support that occured when runtime PM was disabled for some suppliers due to a PM sleep transition in progress. Those patches simply make runtime PM helpers return 0 in that case which may be controversial, so please let me know if there are concerns about those. The way device_link_add() works is a bit different, as it takes an additional status argument now. That makes it possible to create a link in any state, with extra care of course, and should address the problem pointed to by Lukas during the previous discussion. Also some comments from Tomeu have been addressed. An update here. The first patch hasn't changed, so I'm resending it. The majority of changes in the other patches are in order to address Lukas' comments. First off, I added a DEVICE_LINK_STATELESS flag that will prevent the driver core from trying to maintain device links having it set. Also, the DEVICE_LINK_PERSISTENT flag was dropped (as link "persistence" is the default behavior now) and there's a new one, DEVICE_LINK_AUTOREMOVE, that will cause the driver core to remove the link on the consumer driver unbind. Moreover, the code checks attempts to create a link between a parent and a child device now and actively prevents that from happening. The changelog of the second patch has been updated as requested by Ulf. The third patch was updated to fix a bug related to the (previously missing) clearing of power.direct_complete for supplier devices having consumers that don't use direct_complete. The next two (runtime PM) patches turned out to be unnecessary, so I've dropped them. The runtime PM patch [4/5] was reorganized somewhat to reduce the indentation level in there, but the code flow introduced by it is essentially the same and the last patch was simply rebased on top of the new series. Time for another update. :-) Fewer changes this time, mostly to address issues found by Lukas and Marek. The most significant one is to make device_link_add() cope with the case when the consumer device has not been registered yet when it is called. The supplier device still is required to be registered and the function will return NULL if that is not the case. Another significant change is in patch [4/5] that now makes the core apply pm_runtime_get_sync()/pm_runtime_put() to supplier devices around the probing of a consumer one (in analogy with the parent). Thanks for the update! Updated version fixes all the remaining issues. Tested-by: Marek SzyprowskiBest regards -- Marek Szyprowski, PhD Samsung R Institute Poland
Re: [PATCH v4 0/5] Functional dependencies between devices
Hi Rafael, On 2016-09-29 02:24, Rafael J. Wysocki wrote: Hi Everyone, On Thursday, September 08, 2016 11:25:44 PM Rafael J. Wysocki wrote: Hi Everyone, This is a refresh of the functional dependencies series that I posted last year and which has picked up by Marek quite recently. For reference, appended is my introductory message sent previously (which may be slightly outdated now). As last time, the first patch rearranges the code around __device_release_driver() a bit to prepare it for the next one (it actually hasn't changed AFAICS). The second patch introduces the actual device links mechanics, but without system suspend/resume and runtime PM support which are added by the subsequent patches. Some bugs found by Marek during his work on these patches should be fixed here. In particular, the endless recursion in device_reorder_to_tail() which simply was broken before. There are two additional patches to address the issue with runtime PM support that occured when runtime PM was disabled for some suppliers due to a PM sleep transition in progress. Those patches simply make runtime PM helpers return 0 in that case which may be controversial, so please let me know if there are concerns about those. The way device_link_add() works is a bit different, as it takes an additional status argument now. That makes it possible to create a link in any state, with extra care of course, and should address the problem pointed to by Lukas during the previous discussion. Also some comments from Tomeu have been addressed. An update here. The first patch hasn't changed, so I'm resending it. The majority of changes in the other patches are in order to address Lukas' comments. First off, I added a DEVICE_LINK_STATELESS flag that will prevent the driver core from trying to maintain device links having it set. Also, the DEVICE_LINK_PERSISTENT flag was dropped (as link "persistence" is the default behavior now) and there's a new one, DEVICE_LINK_AUTOREMOVE, that will cause the driver core to remove the link on the consumer driver unbind. Moreover, the code checks attempts to create a link between a parent and a child device now and actively prevents that from happening. The changelog of the second patch has been updated as requested by Ulf. The third patch was updated to fix a bug related to the (previously missing) clearing of power.direct_complete for supplier devices having consumers that don't use direct_complete. The next two (runtime PM) patches turned out to be unnecessary, so I've dropped them. The runtime PM patch [4/5] was reorganized somewhat to reduce the indentation level in there, but the code flow introduced by it is essentially the same and the last patch was simply rebased on top of the new series. Time for another update. :-) Fewer changes this time, mostly to address issues found by Lukas and Marek. The most significant one is to make device_link_add() cope with the case when the consumer device has not been registered yet when it is called. The supplier device still is required to be registered and the function will return NULL if that is not the case. Another significant change is in patch [4/5] that now makes the core apply pm_runtime_get_sync()/pm_runtime_put() to supplier devices around the probing of a consumer one (in analogy with the parent). Thanks for the update! Updated version fixes all the remaining issues. Tested-by: Marek Szyprowski Best regards -- Marek Szyprowski, PhD Samsung R Institute Poland
[PATCH v4 0/5] Functional dependencies between devices
Hi Everyone, On Thursday, September 08, 2016 11:25:44 PM Rafael J. Wysocki wrote: > > Hi Everyone, > > > > This is a refresh of the functional dependencies series that I posted last > > year and which has picked up by Marek quite recently. For reference, > > appended is my introductory message sent previously (which may be > > slightly outdated now). > > > > As last time, the first patch rearranges the code around > > __device_release_driver() a bit to prepare it for the next one (it > > actually hasn't changed AFAICS). > > > > The second patch introduces the actual device links mechanics, but without > > system suspend/resume and runtime PM support which are added by the > > subsequent patches. > > > > Some bugs found by Marek during his work on these patches should be fixed > > here. In particular, the endless recursion in device_reorder_to_tail() > > which simply was broken before. > > > > There are two additional patches to address the issue with runtime PM > > support > > that occured when runtime PM was disabled for some suppliers due to a PM > > sleep transition in progress. Those patches simply make runtime PM > > helpers > > return 0 in that case which may be controversial, so please let me know if > > there are concerns about those. > > > > The way device_link_add() works is a bit different, as it takes an > > additional > > status argument now. That makes it possible to create a link in any > > state, > > with extra care of course, and should address the problem pointed to by > > Lukas > > during the previous discussion. > > > > Also some comments from Tomeu have been addressed. > > An update here. > > The first patch hasn't changed, so I'm resending it. > > The majority of changes in the other patches are in order to address Lukas' > comments. > > First off, I added a DEVICE_LINK_STATELESS flag that will prevent the driver > core from trying to maintain device links having it set. > > Also, the DEVICE_LINK_PERSISTENT flag was dropped (as link "persistence" is > the default behavior now) and there's a new one, DEVICE_LINK_AUTOREMOVE, > that will cause the driver core to remove the link on the consumer driver > unbind. > > Moreover, the code checks attempts to create a link between a parent and a > child device now and actively prevents that from happening. > > The changelog of the second patch has been updated as requested by Ulf. > > The third patch was updated to fix a bug related to the (previously missing) > clearing of power.direct_complete for supplier devices having consumers that > don't use direct_complete. > > The next two (runtime PM) patches turned out to be unnecessary, so I've > dropped them. > > The runtime PM patch [4/5] was reorganized somewhat to reduce the > indentation > level in there, but the code flow introduced by it is essentially the same > and the last patch was simply rebased on top of the new series. Time for another update. :-) Fewer changes this time, mostly to address issues found by Lukas and Marek. The most significant one is to make device_link_add() cope with the case when the consumer device has not been registered yet when it is called. The supplier device still is required to be registered and the function will return NULL if that is not the case. Another significant change is in patch [4/5] that now makes the core apply pm_runtime_get_sync()/pm_runtime_put() to supplier devices around the probing of a consumer one (in analogy with the parent). Thanks, Rafael
[PATCH v4 0/5] Functional dependencies between devices
Hi Everyone, On Thursday, September 08, 2016 11:25:44 PM Rafael J. Wysocki wrote: > > Hi Everyone, > > > > This is a refresh of the functional dependencies series that I posted last > > year and which has picked up by Marek quite recently. For reference, > > appended is my introductory message sent previously (which may be > > slightly outdated now). > > > > As last time, the first patch rearranges the code around > > __device_release_driver() a bit to prepare it for the next one (it > > actually hasn't changed AFAICS). > > > > The second patch introduces the actual device links mechanics, but without > > system suspend/resume and runtime PM support which are added by the > > subsequent patches. > > > > Some bugs found by Marek during his work on these patches should be fixed > > here. In particular, the endless recursion in device_reorder_to_tail() > > which simply was broken before. > > > > There are two additional patches to address the issue with runtime PM > > support > > that occured when runtime PM was disabled for some suppliers due to a PM > > sleep transition in progress. Those patches simply make runtime PM > > helpers > > return 0 in that case which may be controversial, so please let me know if > > there are concerns about those. > > > > The way device_link_add() works is a bit different, as it takes an > > additional > > status argument now. That makes it possible to create a link in any > > state, > > with extra care of course, and should address the problem pointed to by > > Lukas > > during the previous discussion. > > > > Also some comments from Tomeu have been addressed. > > An update here. > > The first patch hasn't changed, so I'm resending it. > > The majority of changes in the other patches are in order to address Lukas' > comments. > > First off, I added a DEVICE_LINK_STATELESS flag that will prevent the driver > core from trying to maintain device links having it set. > > Also, the DEVICE_LINK_PERSISTENT flag was dropped (as link "persistence" is > the default behavior now) and there's a new one, DEVICE_LINK_AUTOREMOVE, > that will cause the driver core to remove the link on the consumer driver > unbind. > > Moreover, the code checks attempts to create a link between a parent and a > child device now and actively prevents that from happening. > > The changelog of the second patch has been updated as requested by Ulf. > > The third patch was updated to fix a bug related to the (previously missing) > clearing of power.direct_complete for supplier devices having consumers that > don't use direct_complete. > > The next two (runtime PM) patches turned out to be unnecessary, so I've > dropped them. > > The runtime PM patch [4/5] was reorganized somewhat to reduce the > indentation > level in there, but the code flow introduced by it is essentially the same > and the last patch was simply rebased on top of the new series. Time for another update. :-) Fewer changes this time, mostly to address issues found by Lukas and Marek. The most significant one is to make device_link_add() cope with the case when the consumer device has not been registered yet when it is called. The supplier device still is required to be registered and the function will return NULL if that is not the case. Another significant change is in patch [4/5] that now makes the core apply pm_runtime_get_sync()/pm_runtime_put() to supplier devices around the probing of a consumer one (in analogy with the parent). Thanks, Rafael