drivers: base: Fix device link removal
When device_link_free() drops references to the supplier and consumer devices of the device link going away and the reference being dropped turns out to be the last one for any of those device objects, its ->release callback will be invoked and it may sleep which goes against the SRCU callback execution requirements. To address this issue, make the device link removal code carry out the device_link_free() actions preceded by SRCU synchronization from a separate work item (the "long" workqueue is used for that, because it does not matter when the device link memory is released and it may take time to get to that point) instead of using SRCU callbacks. While at it, make the code work analogously when SRCU is not enabled to reduce the differences between the SRCU and non-SRCU cases. Fixes: 843e600b ("driver core: Fix sleeping in invalid context during device link deletion") Cc: stable <stable@vger.kernel.org> Reported-by:chenxiang (M) <chenxiang66@hisilicon.com> Tested-by:
chenxiang (M) <chenxiang66@hisilicon.com> Reviewed-by:
Saravana Kannan <saravanak@google.com> Signed-off-by:
Rafael J. Wysocki <rafael.j.wysocki@intel.com> Link: https://lore.kernel.org/r/5722787.lOV4Wx5bFT@kreacher Signed-off-by:
Greg Kroah-Hartman <gregkh@linuxfoundation.org>
parent
5881fa8d
-
mentioned in commit 3ee24241
-
mentioned in commit 03c35686
-
mentioned in commit 7b6df050
-
mentioned in commit 9406d598
-
mentioned in commit dfa65572
-
mentioned in commit 801c8b8e
-
mentioned in commit ae6d76e4
-
mentioned in commit 8919f7c6
-
mentioned in commit 7f62d985
-
mentioned in commit 3127b2ee
Please register or sign in to comment