Re: [PATCH] regulator: core: regulator_lock_two() should test for EDEADLK not EDEADLOCK

From: Doug Anderson

Date: Wed Jul 08 2026 - 22:42:48 EST


Hi,

On Wed, Jul 8, 2026 at 4:58 PM Timur Tabi <ttabi@xxxxxxxxxx> wrote:
>
> Compare against -EDEADLK, which is what ww_mutex_lock() actually
> returns and what every other deadlock check in this file already uses.
>
> Function regulator_lock_two() acquires two regulators via
> regulator_lock_nested() -> ww_mutex_lock(). On contention,
> ww_mutex_lock() returns -EDEADLK, which is the caller's signal to drop
> the lock it holds and retry the acquisition in the canonical order.
>
> However, regulator_lock_two() tests the return value against -EDEADLOCK
> rather than -EDEADLK. On most architectures, EDEADLK and EDEADLOCK are
> the same value, so the comparison happens to be correct and the bug is
> invisible. But on MIPS, SPARC, and PowerPC, those two errors have
> different values. The test is wrong: a genuine -EDEADLK backoff no
> longer matches -EDEADLOCK, so instead of unlocking and retrying, the
> code falls into WARN_ON(ret) and returns with only one of the two
> regulators locked.
>
> In practice, this is a bug only on MIPS, because the regulator core is
> not built or used on the other two platforms.
>
> In general, EDEADLK is preferred over EDEADLOCK for new code.
>
> Fixes: cba6cfdc7c3f ("regulator: core: Avoid lockdep reports when resolving supplies")
> Signed-off-by: Timur Tabi <ttabi@xxxxxxxxxx>
> ---
> drivers/regulator/core.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)

Well, crud. Thanks for the fix.

Reviewed-by: Douglas Anderson <dianders@xxxxxxxxxxxx>