From: Jonathan Cameron <jic23@kernel.org>
To: Brian Norris <briannorris@chromium.org>
Cc: "Rafael J. Wysocki" <rafael@kernel.org>,
linux-pm@vger.kernel.org, "Ulf Hansson" <ulfh@kernel.org>,
linux-kernel@vger.kernel.org, "Nuno Sá" <nuno.sa@analog.com>,
"Andy Shevchenko" <andy@kernel.org>,
"David Lechner" <dlechner@baylibre.com>,
"Geert Uytterhoeven" <geert+renesas@glider.be>,
"Magnus Damm" <magnus.damm@gmail.com>,
"Marek Vasut" <marek.vasut+renesas@mailbox.org>,
"Rui Miguel Silva" <rmfrfs@gmail.com>,
linux-iio@vger.kernel.org, linux-renesas-soc@vger.kernel.org
Subject: Re: [PATCH 03/13] iio: Discard pm_runtime_put_autosuspend() return values
Date: Wed, 21 Oct 2026 19:49:51 +0100 [thread overview]
Message-ID: <20261021194951.7b65c2eb@jic23-hlaptop> (raw)
In-Reply-To: <ataTYER7XM_MEYKL@google.com>
On Mon, 19 Oct 2026 15:02:08 -0700
Brian Norris <briannorris@chromium.org> wrote:
> Hi Jonathan,
>
> On Sun, Oct 18, 2026 at 09:18:07PM +0100, Jonathan Cameron wrote:
> > On Tue, 6 Oct 2026 16:13:31 -0700
> > Brian Norris <briannorris@chromium.org> wrote:
> >
> > > Multiple IIO drivers inspect or propagate the return value of
> > > pm_runtime_put_autosuspend(), which is not particularly useful.
> > >
> > > Returning an error code from pm_runtime_put_autosuspend() merely means
> > > that it has not queued up a timer or work item to check whether or not
> > > the device can be suspended and there are many perfectly valid
> > > situations in which that can happen, like after writing "on" to the
> > > device's runtime PM "control" attribute in sysfs for one example.
> > >
> > > For this reason, modify these drivers to simply discard the
> > > pm_runtime_put_autosuspend() return value, and change the return types
> > > of fxls8962af_power_off() and fxas21002c_pm_put() to void.
> > >
> > > This will facilitate a planned change of the
> > > pm_runtime_put_autosuspend() return type to void in the future, similar
> > > to commit 3afd8df02433 ("PM: runtime: Change pm_runtime_put() return
> > > type to void").
> > >
> > > Signed-off-by: Brian Norris <briannorris@chromium.org>
> > > ---
> > > This patch is independent of the rest of the series, except for the end
> > > (changing the return type). I expect it can be applied by individual
> > > maintainers, and we pick up the end once the dust is settled.
> > >
> > > I couldn't decide if I should split this up by individual driver, or
> > > just 1 for the whole drivers/iio/ subsystem. Many of these drivers have
> > > borrowed the same patterns, so I chose to just send 1. Let me know if I
> > > should split it up.
> >
> > Hi Brian,
> >
> > Great that you are doing this, but sadly it opens the can of worms that
> > are the helpers a lot of these drivers have. They just about made
> > sense before various recent runtime_pm useability improvements.
> > Now they make very little sense at all. Dropping the return value
> > here also removes the reason for a bunch of odd defensive ifdefs.
> >
> > As such, I'm requesting some slightly more involved changes. Some of
> > them I think are coupled tightly to what you are doing here so should
> > be in this series, others can be left for later.
>
> Thanks for the notes. I'll handle the ones that are at least
> approximately related to the code I'm touching. I think there are a few
> bugs that get resolved along the way too.
>
> I may not get the more tangential ones though.
>
> Also, unless you'd prefer otherwise, I plan to wait a bit more to send
> v2, since the merge window only just opened, and some of this series
> will just be a RESEND. I'd prefer maximizing the chance that the
> recipients will actually notice the patches, by submitting outside that
> window.
>
> (OTOH, the bulk of these changes are in IIO, so I can just make IIO its
> own series if that helps things along.)
I'd split out an IIO series but take your time as no particular rush
given these won't merge until next time around.
> > > diff --git a/drivers/iio/gyro/bmg160_core.c b/drivers/iio/gyro/bmg160_core.c
> > > index d611341a0e2a..e8e511daa7c4 100644
> > > --- a/drivers/iio/gyro/bmg160_core.c
> > > +++ b/drivers/iio/gyro/bmg160_core.c
> > > @@ -319,18 +319,15 @@ static int bmg160_set_power_state(struct bmg160_data *data, bool on)
> > > struct device *dev = regmap_get_device(data->regmap);
> > > int ret;
> > >
> > > - if (on)
> > > + if (on) {
> > > ret = pm_runtime_get_sync(dev);
> >
> > gah. Please just change this to use pm_runtime_resume_and_get() whilst you
> > are here.
> >
> > Ideally squash the helper in favour of direct calls to the runtime
> > pm. Yet another pace that the recent improvements in runtime pm useability
> > have made what was of minor benefit entirely pointless.
> >
> > The ifdef can go away as well as I think the only thing that helped with
> > was the return value of the put you are removing.
>
> One thing I found while looking through this driver:
>
> bmg160_write_event_config() and bmg160_data_rdy_trigger_set_state() do
> some ghastly things w.r.t. runtime PM. In particular, they seem to
> perform put_autosuspend() *before* they're done touching the hardware,
> and then rely on the (very large) autosuspend delay to defer the
> runtime_suspend() operation. It even has a bunch of comments about the
> incorrect ordering.
>
> That's one giant race condition. And the autosuspend delay is
> configurable via user space, so it's extra dangerous.
>
> Anyway, that's to say: I plan to refactor/reorder the put_autosuspend()
> ordering there while I'm at it.
Excellent!
>
> (There's also some strange error handling that potentially leads to
> runtime PM underflow. I'll fix that one while I'm here.)
>
> I think this one is imitated in another few drivers as well.
yeah. We do seem to cut and paste bad practice and bugs around :(
>
> > > - else
> > > - ret = pm_runtime_put_autosuspend(dev);
> > > -
> > > - if (ret < 0) {
> > > - dev_err(dev, "Failed: bmg160_set_power_state for %d\n", on);
> > > -
> > > - if (on)
> > > + if (ret < 0) {
> > > + dev_err(dev, "%s: failed to resume: %d\n", __func__, ret);
> > > pm_runtime_put_noidle(dev);
> > > -
> > > - return ret;
> > > + return ret;
> > > + }
> > > + } else {
> > > + pm_runtime_put_autosuspend(dev);
> > > }
> > > #endif
> > >
> > > diff --git a/drivers/iio/light/pa12203001.c b/drivers/iio/light/pa12203001.c
> > > index c0f4db8d95f7..d4e197e05d26 100644
> > > --- a/drivers/iio/light/pa12203001.c
> > > +++ b/drivers/iio/light/pa12203001.c
> > > @@ -188,7 +188,8 @@ static int pa12203001_set_power_state(struct pa12203001_data *data, bool on,
> > > if (on)
> > > return pm_runtime_resume_and_get(&data->client->dev);
> > >
> > > - return pm_runtime_put_autosuspend(&data->client->dev);
> > > + pm_runtime_put_autosuspend(&data->client->dev);
> > > + return 0;
> >
> > This function has evolved to the point of silliness.
> > Given how minor your change is, feel free to ignore the following however!
> >
> > There is zero shared code in here between the on and off paths so
> > rename the function pa12203001_runtime_enable() and cover only the
> > 'on' case. Then just put the pm_runtime_put_autosuspend() in wherever
> > on was previously false.
>
> Ack. But because "runtime_enable()" has a specific runtime PM meaning
> that is very different than the usage here, I've chosen the name
> "pa12203001_runtime_resume_and_get()" instead, which I think makes for
> more API symmetry.
Good point on naming.
>
> > Given that presumably one of the things is being turned on whenever
> > we enable it, also pull the mutex out of the if blocks and use
> > guard() to simplify that.
>
> guard() is tricky, since it produces a deadlock if you hold the lock
> across pm_runtime_resume_and_get(). So I'll skip that part and leave it
> to someone (or no one) who is more particularly interested in this
> driver.
Ah indeed. Should be scoped_guard() but can wait for someone else
who cares enough to do that and maybe not worth it anyway. I got
lost in imagining what the other refactors would look like.
Thanks,
Jonathan
>
> > >
> > > err:
> > > mutex_unlock(&data->lock);
next prev parent reply other threads:[~2026-10-21 18:49 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-06 23:13 [PATCH 00/13] PM: runtime: Convert pm_runtime_put_autosuspend() and friends to a void function Brian Norris
2026-10-06 23:13 ` [PATCH 01/13] hwrng: cctrng: Discard pm_runtime_put_autosuspend() return value Brian Norris
2026-10-06 23:13 ` [PATCH 02/13] drm: Discard pm_runtime_put_autosuspend() return values Brian Norris
2026-10-13 13:55 ` Maíra Canal
2026-10-06 23:13 ` [PATCH 03/13] iio: " Brian Norris
2026-10-12 20:39 ` Andy Shevchenko
2026-10-18 20:18 ` Jonathan Cameron
2026-10-19 22:02 ` Brian Norris
2026-10-21 18:49 ` Jonathan Cameron [this message]
2026-10-22 0:01 ` Brian Norris
2026-10-06 23:13 ` [PATCH 04/13] media: venus: " Brian Norris
2026-10-06 23:13 ` [PATCH 05/13] pinctrl: qcom: lpass-lpi: " Brian Norris
2026-10-07 11:44 ` Linus Walleij
2026-10-06 23:13 ` [PATCH 06/13] spi: ti-qspi: Discard pm_runtime_put_autosuspend() return value Brian Norris
2026-10-06 23:13 ` [PATCH 07/13] greybus: " Brian Norris
2026-10-07 14:28 ` Alex Elder
2026-10-07 15:19 ` Brian Norris
2026-10-06 23:13 ` [PATCH 08/13] ALSA: hda: " Brian Norris
2026-10-07 9:45 ` Takashi Iwai
2026-10-06 23:13 ` [PATCH 09/13] ASoC: codecs: lpass: Discard pm_runtime_put_autosuspend() return values Brian Norris
2026-10-06 23:13 ` [PATCH 10/13] ASoC: intel: atom: Discard pm_runtime_put_autosuspend() return value Brian Norris
2026-10-10 9:34 ` Cezary Rojewski
2026-10-06 23:13 ` [PATCH 11/13] ASoC: SOF: Discard pm_runtime_put_autosuspend() return values Brian Norris
2026-10-06 23:13 ` [PATCH 12/13] PM: runtime: Drop pm_runtime_put_autosuspend() return code Brian Norris
2026-10-06 23:13 ` [PATCH 13/13] PM: runtime: Drop pm_request_{idle,autosuspend}() return codes Brian Norris
2026-10-10 8:42 ` (subset) [PATCH 00/13] PM: runtime: Convert pm_runtime_put_autosuspend() and friends to a void function Bartosz Golaszewski
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=20261021194951.7b65c2eb@jic23-hlaptop \
--to=jic23@kernel.org \
--cc=andy@kernel.org \
--cc=briannorris@chromium.org \
--cc=dlechner@baylibre.com \
--cc=geert+renesas@glider.be \
--cc=linux-iio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=linux-renesas-soc@vger.kernel.org \
--cc=magnus.damm@gmail.com \
--cc=marek.vasut+renesas@mailbox.org \
--cc=nuno.sa@analog.com \
--cc=rafael@kernel.org \
--cc=rmfrfs@gmail.com \
--cc=ulfh@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®