Re: regulator: deadlock vs memory reclaim
From: Dmitry Osipenko
Date: Tue Aug 11 2020 - 11:44:22 EST
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-linux@xxxxxxxxxxxx>
> ---
> 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.