On Wed, Jul 6, 2022 at 8:54 AM Abel Vesa <abel.vesa@xxxxxxxxxx> wrote: > > In case of a cyclic dependency, if the supplier is not yet available, > the parent of the supplier is checked for dependency. But if there are > more than one suppliers with the same parent, the first check returns > true while the next ones skip that specific link entirely because of > having DL_FLAG_MANAGED and DL_FLAG_SYNC_STATE_ONLY set, which is what > the relaxing of the link does. But if we check for the target being > a consumer before the check for those flags, we can check as many > times as needed the same link and it will always return true, This is > safe to do, since the relaxing of the link will be done only once > because those flags will be set and it will bail early. > > Signed-off-by: Abel Vesa <abel.vesa@xxxxxxxxxx> > --- > drivers/base/core.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/drivers/base/core.c b/drivers/base/core.c > index 753e7cca0f40..2c3b860dfe80 100644 > --- a/drivers/base/core.c > +++ b/drivers/base/core.c > @@ -297,13 +297,13 @@ int device_is_dependent(struct device *dev, void *target) > return ret; > > list_for_each_entry(link, &dev->links.consumers, s_node) { > + if (link->consumer == target) > + return 1; > + > if ((link->flags & ~DL_FLAG_INFERRED) == > (DL_FLAG_SYNC_STATE_ONLY | DL_FLAG_MANAGED)) > continue; Thanks for trying to fix this issue, but I'll have to Nack this patch. The whole point of the SYNC_STATE_ONLY flag is to allow cycles. It's needed to maintain correctness of sync_state(). I think I described those in the commit text that added the SYNC_STATE_ONLY flag. Check it out if you are interested. So this change of yours will break sync_state() functionality. There's a bunch of nuance to fixing the dual cycle issue and I don't mind fixing this myself in a week or two if you can wait. Thanks, Saravana > > - if (link->consumer == target) > - return 1; > - > ret = device_is_dependent(link->consumer, target); > if (ret) > break; > -- > 2.34.3 >