All of lore.kernel.org
 help / color / mirror / Atom feed
From: Lee Jones <lee@kernel.org>
To: Diogo Ivo <diogo.ivo@tecnico.ulisboa.pt>, broonie@kernel.org
Cc: Dmitry Osipenko <digetx@gmail.com>,
	linux-kernel@vger.kernel.org, stable@vger.kernel.org
Subject: Re: [PATCH] mfd: max77620: Avoid regmap mutex deadlock in power-off handler
Date: Wed, 20 May 2026 17:19:00 +0100	[thread overview]
Message-ID: <20260520161900.GM2767592@google.com> (raw)
In-Reply-To: <38f5201a-6b52-4f18-bbbe-775171a3f147@tecnico.ulisboa.pt>

Mark,

On Wed, 20 May 2026, Diogo Ivo wrote:
> On 5/20/26 16:42, Dmitry Osipenko wrote:
> > 20.05.2026 17:28, Diogo Ivo пишет:
> > > max77620_pm_power_off() is called via the sys-off framework as a
> > > SYS_OFF_MODE_POWER_OFF handler, which runs in an atomic notifier chain
> > > with IRQs disabled after smp_send_stop(). regmap_update_bits() acquires
> > > the regmap mutex in this path; if another CPU held that mutex when it
> > > was stopped, the power-off sequence deadlocks.
> > > 
> > > Replace regmap_update_bits() with i2c_smbus_write_byte_data(), which
> > > bypasses the regmap lock entirely. The I2C core detects the atomic
> > > context via i2c_in_atomic_xfer_mode() and uses i2c_trylock_bus() rather
> > > than a blocking acquisition, avoiding the deadlock.
> > > 
> > > Tested on Pixel C, powers off correctly.
> > > 
> > > Assisted-by: Claude:claude-sonnet-4-6
> > > Fixes: 744b13107d0d ("mfd: max77620: Provide system power-off functionality")
> > > Cc: stable@vger.kernel.org
> > > Signed-off-by: Diogo Ivo <diogo.ivo@tecnico.ulisboa.pt>
> > > ---
> > > This patch was tested on a local branch that sets pm_power_off =
> > > max77620_pm_power_off() unconditionally so that the function runs.
> > > I haven't checked whether the other bits in ONOFFCNFG1 are safe to
> > > discard at power-off time as I don't have access to the datasheet.
> > > If someone with access to the datasheet confirms they're not I'll
> > > respin the patch taking that into account.
> > > ---
> > >   drivers/mfd/max77620.c | 10 +++++++---
> > >   1 file changed, 7 insertions(+), 3 deletions(-)
> > > 
> > > diff --git a/drivers/mfd/max77620.c b/drivers/mfd/max77620.c
> > > index 3af2974b3023..8c768968a317 100644
> > > --- a/drivers/mfd/max77620.c
> > > +++ b/drivers/mfd/max77620.c
> > > @@ -487,10 +487,14 @@ static int max77620_read_es_version(struct max77620_chip *chip)
> > >   static void max77620_pm_power_off(void)
> > >   {
> > >   	struct max77620_chip *chip = max77620_scratch;
> > > +	struct i2c_client *client = to_i2c_client(chip->dev);
> > > -	regmap_update_bits(chip->rmap, MAX77620_REG_ONOFFCNFG1,
> > > -			   MAX77620_ONOFFCNFG1_SFT_RST,
> > > -			   MAX77620_ONOFFCNFG1_SFT_RST);
> > > +	/*
> > > +	 * Atomic context: IRQs disabled. Use raw I2C write, bypassing
> > > +	 * regmap locking entirely.
> > > +	 */
> > > +	i2c_smbus_write_byte_data(client, MAX77620_REG_ONOFFCNFG1,
> > > +				  MAX77620_ONOFFCNFG1_SFT_RST);
> > >   }
> > >   static int max77620_probe(struct i2c_client *client)
> > > 
> > > ---
> > > base-commit: 27fa82620cbaa89a7fc11ac3057701d598813e87
> > > change-id: 20260520-max77620_poweroff-08e39429835f
> > > 
> > > Best regards,
> > > --
> > > Diogo Ivo <diogo.ivo@tecnico.ulisboa.pt>
> > 
> > Kernel parks secondary CPUs before powering off system, hence there
> > shouldn't be a locking contention.
> 
> This patch was motivated by the Sashiko review I got in [1]. Its point
> here is that there is a possibility for a deadlock scenario in which
> a secondary CPU obtains the mutex for the regmap and then smp_send_stop()
> is called before this secondary CPU gets a chance to release the mutex,
> making it so that when the primary CPU tries to acquire it to issue the
> write it hangs. Is there something that I am misunderstanding here?
> 
> > Have you checked whether regmap_write_bits() works?
> 
> Now, in case this is all true this problem is still not something that
> will usually happen, only when this specific situation holds so
> generally even regmap_update_bits() was working, and in [1] I sent it
> out exactly like that. Changing it to regmap_write_bits() would not make
> any difference.
> 
> [1]: https://lore.kernel.org/linux-tegra/20260514-smaug-poweroff-v1-0-30f9a4688966@tecnico.ulisboa.pt/

It's my understanding that using the Regmap wrappers _prevents_ locking
issues, rather than causes them.

I'm deferring to Mark.

-- 
Lee Jones

  reply	other threads:[~2026-05-20 16:19 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-05-20 14:28 [PATCH] mfd: max77620: Avoid regmap mutex deadlock in power-off handler Diogo Ivo
2026-05-20 14:42 ` Dmitry Osipenko
2026-05-20 14:59   ` Diogo Ivo
2026-05-20 16:19     ` Lee Jones [this message]
2026-05-20 16:23       ` Mark Brown
2026-05-20 16:44         ` Dmitry Osipenko
2026-05-21  9:19           ` Diogo Ivo
2026-05-27  7:32             ` Dmitry Osipenko
2026-05-21  9:14         ` Diogo Ivo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260520161900.GM2767592@google.com \
    --to=lee@kernel.org \
    --cc=broonie@kernel.org \
    --cc=digetx@gmail.com \
    --cc=diogo.ivo@tecnico.ulisboa.pt \
    --cc=linux-kernel@vger.kernel.org \
    --cc=stable@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.