11.08.2020 03:07, Michał Mirosław пишет: ... > I just noticed that locking in regulator_resolve_coupling() is bogus. > This all holds up because regulator_list_mutex is held during the call. > Feel free to test a patch below. > > I'm working my way to push allocations outside of the locks, but the > coupling-related locking will need to be fixed regardless. > > Best Regards, > Michał Mirosław > > ---->8<---- > > [PATCH] regulator: remove superfluous lock in regulator_resolve_coupling() > > The code modifies rdev, but locks c_rdev instead. The bug remains: > stored c_rdev could be freed just after unlock anyway. This doesn't blow > up because regulator_list_mutex taken outside holds it together. > > Signed-off-by: Michał Mirosław <mirq-li...@rere.qmqm.pl> > --- > drivers/regulator/core.c | 4 ---- > 1 file changed, 4 deletions(-) > > diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c > index 94f9225869da..e519bc9a860d 100644 > --- a/drivers/regulator/core.c > +++ b/drivers/regulator/core.c > @@ -4859,13 +4859,9 @@ static void regulator_resolve_coupling(struct > regulator_dev *rdev) > return; > } > > - regulator_lock(c_rdev); > - > c_desc->coupled_rdevs[i] = c_rdev; > c_desc->n_resolved++; > > - regulator_unlock(c_rdev); > - > regulator_resolve_coupling(c_rdev); > } > } >
The change looks like a good cleanup to me, thanks. I think that c_rdev locking was accidentally left from some older version of the patch that introduced the coupling support. There shouldn't be any real bug in this code. IIRC, at some point I changed the code to disallow consumers to get a partially coupled regulator and then protected the resolve_coupling() with list_mutex, but seems missed to remove that c_rdev locking. Hence there shouldn't be a need to lock regulators individually during the resolve because nothing should touch the coupled regulators until all the coupling has been resolved.