[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <d6b4ec96-d81b-5025-628b-ba6c5f77a3dc@gmail.com>
Date: Tue, 11 Aug 2020 18:44:09 +0300
From: Dmitry Osipenko <digetx@...il.com>
To: Michał Mirosław <mirq-linux@...e.qmqm.pl>
Cc: Mark Brown <broonie@...nel.org>,
Liam Girdwood <lgirdwood@...il.com>,
linux-kernel@...r.kernel.org
Subject: Re: regulator: deadlock vs memory reclaim
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@...e.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.
Powered by blists - more mailing lists