Linux IIO development
 help / color / mirror / Atom feed
From: Jonathan Cameron <Jonathan.Cameron@huawei.com>
To: Andy Shevchenko <andy.shevchenko@gmail.com>
Cc: "Jonathan Cameron" <jic23@kernel.org>,
	linux-iio@vger.kernel.org,
	"Mudit Sharma" <muditsharma.info@gmail.com>,
	"Julien Stephan" <jstephan@baylibre.com>,
	"Mariel Tinaco" <Mariel.Tinaco@analog.com>,
	"Angelo Dureghello" <adureghello@baylibre.com>,
	"Gustavo Silva" <gustavograzs@gmail.com>,
	"Nuno Sa" <nuno.sa@analog.com>,
	"João Paulo Gonçalves" <joao.goncalves@toradex.com>,
	"ChiYuan Huang" <cy_huang@richtek.com>,
	"Ramona Alexandra Nechita" <ramona.nechita@analog.com>,
	"Trevor Gamblin" <tgamblin@baylibre.com>,
	"Guillaume Stols" <gstols@baylibre.com>,
	"David Lechner" <dlechner@baylibre.com>,
	"Cosmin Tanislav" <demonsingur@gmail.com>,
	"Marcelo Schmitt" <marcelo.schmitt@analog.com>,
	"Gwendal Grignou" <gwendal@chromium.org>,
	"Antoni Pokusinski" <apokusinski01@gmail.com>
Subject: Re: [PATCH v2 01/27] iio: core: Rework claim and release of direct mode to work with sparse.
Date: Tue, 25 Feb 2025 06:25:32 +0000	[thread overview]
Message-ID: <20250225062532.0000475e@huawei.com> (raw)
In-Reply-To: <CAHp75Vf_XPSvTOH_zvfndghjy+bM_6hr=z2JAcE8AYh415SPWw@mail.gmail.com>

On Sat, 22 Feb 2025 22:58:00 +0200
Andy Shevchenko <andy.shevchenko@gmail.com> wrote:

> On Sat, Feb 22, 2025 at 7:24 PM Jonathan Cameron <jic23@kernel.org> wrote:
> > On Sat, 22 Feb 2025 17:51:02 +0200
> > Andy Shevchenko <andy.shevchenko@gmail.com> wrote:  
> > > Sun, Feb 09, 2025 at 06:05:58PM +0000, Jonathan Cameron kirjoitti:  
> > > > From: Jonathan Cameron <Jonathan.Cameron@huawei.com>
> > > >
> > > > Initial thought was to do something similar to __cond_lock()
> > > >
> > > >     do_iio_device_claim_direct_mode(iio_dev) ? : ({ __acquire(iio_dev); 0; })
> > > > + Appropriate static inline iio_device_release_direct_mode()
> > > >
> > > > However with that, sparse generates false positives. E.g.
> > > >
> > > > drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c:1811:17: warning: context imbalance in 'st_lsm6dsx_read_raw' - unexpected unlock
> > > >
> > > > So instead, this patch rethinks the return type and makes it more
> > > > 'conditional lock like' (which is part of what is going on under the hood
> > > > anyway) and return a boolean - true for successfully acquired, false for
> > > > did not acquire.
> > > >
> > > > To allow a migration path given the rework is now non trivial, take a leaf
> > > > out of the naming of the conditional guard we currently have for IIO
> > > > device direct mode and drop the _mode postfix from the new functions giving
> > > > iio_device_claim_direct() and iio_device_release_direct()
> > > >
> > > > Whilst the kernel supports __cond_acquires() upstream sparse does not
> > > > yet do so.  Hence rely on sparse expanding a static inline wrapper
> > > > to explicitly see whether __acquire() is called.
> > > >
> > > > Note that even with the solution here, sparse sometimes gives false
> > > > positives. However in the few cases seen they were complex code
> > > > structures that benefited from simplification anyway.  
> 
> ...
> 
> > > > +/*
> > > > + * Helper functions that allow claim and release of direct mode
> > > > + * in a fashion that doesn't generate many false positives from sparse.
> > > > + * Note this must remain static inline in the header so that sparse
> > > > + * can see the __acquire() marking. Revisit when sparse supports
> > > > + * __cond_acquires()
> > > > + */
> > > > +static inline bool iio_device_claim_direct(struct iio_dev *indio_dev)
> > > > +{
> > > > +   int ret = iio_device_claim_direct_mode(indio_dev);
> > > > +
> > > > +   if (ret)
> > > > +           return false;
> > > > +
> > > > +   __acquire(iio_dev);
> > > > +
> > > > +   return true;  
> > >
> > > While I understand the intention, I dislike the function return boolean and
> > > hide the actual error code, it calls user to misuse and replace boolean false
> > > by arbitrary error codes.
> > >
> > > Can we rather return an error code, please?
> > > (as a side effect it reduces the churn in the followup changes)
> > >  
> > Hi Andy,
> >
> > I tried - see above.  It plays badly with sparse which is the whole point of
> > this exercise. Note that iio_device_claim_direct_mode() only ever returns one
> > error code -EBUSY. So reality is it's a boolean and this is a lot close
> > to mutex_trylock() than anything else hence the switch to a boolean return.  
> 
> Hmm... You mean that the following (still as a macro)
> 
> static inline int ...
> {
>   int ret;
>   ...
>   if (ret)
>     return ret;
> 
>   __acquire_lock(...);
>   return 0;
> }
> 
> triggers the sparse warning?

Doing it in the ternary form of the same thing did trigger issues on fairly
simple cases. I don't recall if I tried this precise combination. The motivation
for this form originally being the __cond_acquires() markings (See later).
However, I 'think' based on other false positives including the smaller
set that required refactors to avoid triggering in this series, is that
sparse isn't coping well with more complex control flows.  So if we
assign a local integer variable and then check it, it seems to loose
track of what is going on in more cases than if we can do

	if (!trylock())
		return;

I'm not sure on what is going wrong.  However it seems sparse is effectively
unmaintained at the moment so even if we could rectify things without the
code upstream it gets us nowhere.  Hence my motivation to make this 'look
like' existing stuff sparse is checking. The nearest being trylock.
It makes me have more warm fuzzy feelings to be the same style of code
as the other cases using the same infrastructure, than doing something new.

Ideally sparse will eventually wake up again and we can have the __cond_acquires()
markings that we had in v1 and not have to have the implementation in the
header. That currently requires trylock type boolean returns.

So overall I think this direction makes sense.  Also can't complain that it
saves 1 line of code for every instance and removes false pretense that
this thing returned a useful error code.

Jonathan
> 
> > At the end of the full series (not yet posted) is a patch that gets rid
> > of their being any pretence this isn't a yes / no question and can
> > return other error values. This intermediate step does leave it looking
> > more confusing.
> >
> > Churn wise if we'd been able to do keep the error return and make sparse
> > work I could have just applied this to the original functions and made
> > no changes at all to the vast majority of drivers.  Sadly that wasn't
> > to be. End result of ending up with a trylock type approach is cleaner
> > and more compact even if it's not what we have gotten used to for this
> > particular function.  
> 
> > > > +}  
> 


  reply	other threads:[~2025-02-25  6:25 UTC|newest]

Thread overview: 54+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-02-09 18:05 [PATCH v2 00/27] iio: improve handling of direct mode claim and release Jonathan Cameron
2025-02-09 18:05 ` [PATCH v2 01/27] iio: core: Rework claim and release of direct mode to work with sparse Jonathan Cameron
2025-02-17 10:38   ` Nuno Sá
2025-02-17 12:57     ` Jonathan Cameron
2025-02-22 15:51   ` Andy Shevchenko
2025-02-22 17:23     ` Jonathan Cameron
2025-02-22 20:58       ` Andy Shevchenko
2025-02-25  6:25         ` Jonathan Cameron [this message]
2025-02-25  7:09           ` Andy Shevchenko
2025-02-09 18:05 ` [PATCH v2 02/27] iio: chemical: scd30: Use guard(mutex) to allow early returns Jonathan Cameron
2025-02-17 10:56   ` Nuno Sá
2025-02-09 18:06 ` [PATCH v2 03/27] iio: chemical: scd30: Switch to sparse friendly claim/release_direct() Jonathan Cameron
2025-02-09 18:06 ` [PATCH v2 04/27] iio: temperature: tmp006: Stop using iio_device_claim_direct_scoped() Jonathan Cameron
2025-02-09 18:06 ` [PATCH v2 05/27] iio: proximity: sx9310: " Jonathan Cameron
2025-02-09 18:06 ` [PATCH v2 06/27] iio: proximity: sx9324: " Jonathan Cameron
2025-02-09 18:06 ` [PATCH v2 07/27] iio: proximity: sx9360: " Jonathan Cameron
2025-02-09 18:06 ` [PATCH v2 08/27] iio: accel: adxl367: " Jonathan Cameron
2025-02-17 10:44   ` Nuno Sá
2025-02-09 18:06 ` [PATCH v2 09/27] iio: adc: ad4000: " Jonathan Cameron
2025-02-17 10:45   ` Nuno Sá
2025-02-09 18:06 ` [PATCH v2 10/27] iio: adc: ad4130: " Jonathan Cameron
2025-02-17 10:45   ` Nuno Sá
2025-02-09 18:06 ` [PATCH v2 11/27] iio: adc: ad4695: " Jonathan Cameron
2025-02-16 18:19   ` Jonathan Cameron
2025-02-16 19:00     ` David Lechner
2025-02-17 10:48       ` Nuno Sá
2025-02-17 13:04         ` Jonathan Cameron
2025-02-17 10:48   ` Nuno Sá
2025-02-09 18:06 ` [PATCH v2 12/27] iio: adc: ad7606: " Jonathan Cameron
2025-02-17 10:49   ` Nuno Sá
2025-02-09 18:06 ` [PATCH v2 13/27] iio: adc: ad7625: " Jonathan Cameron
2025-02-17 10:49   ` Nuno Sá
2025-02-09 18:06 ` [PATCH v2 14/27] iio: adc: ad7779: " Jonathan Cameron
2025-02-17 10:50   ` Nuno Sá
2025-02-09 18:06 ` [PATCH v2 15/27] iio: adc: ad9467: " Jonathan Cameron
2025-02-17 10:50   ` Nuno Sá
2025-02-09 18:06 ` [PATCH v2 16/27] iio: adc: max1363: " Jonathan Cameron
2025-02-17 10:51   ` Nuno Sá
2025-02-09 18:06 ` [PATCH v2 17/27] iio: adc: rtq6056: " Jonathan Cameron
2025-02-09 18:06 ` [PATCH v2 18/27] iio: adc: ti-adc161s626: " Jonathan Cameron
2025-02-09 18:06 ` [PATCH v2 19/27] iio: adc: ti-ads1119: " Jonathan Cameron
2025-02-09 18:06 ` [PATCH v2 20/27] iio: addac: ad74413r: " Jonathan Cameron
2025-02-17 10:52   ` Nuno Sá
2025-02-09 18:06 ` [PATCH v2 21/27] iio: chemical: ens160: " Jonathan Cameron
2025-02-09 18:06 ` [PATCH v2 22/27] iio: dac: ad3552r-hs: " Jonathan Cameron
2025-02-17 10:53   ` Nuno Sá
2025-02-09 18:06 ` [PATCH v2 23/27] iio: dac: ad8460: " Jonathan Cameron
2025-02-17 10:52   ` Nuno Sá
2025-02-09 18:06 ` [PATCH v2 24/27] iio: dummy: " Jonathan Cameron
2025-02-17 10:55   ` Nuno Sá
2025-02-09 18:06 ` [PATCH v2 25/27] iio: imu: bmi323: " Jonathan Cameron
2025-02-09 18:06 ` [PATCH v2 26/27] iio: light: bh1745: " Jonathan Cameron
2025-02-09 18:06 ` [PATCH v2 27/27] iio: Drop iio_device_claim_direct_scoped() and related infrastructure Jonathan Cameron
2025-02-17 10:57   ` Nuno Sá

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=20250225062532.0000475e@huawei.com \
    --to=jonathan.cameron@huawei.com \
    --cc=Mariel.Tinaco@analog.com \
    --cc=adureghello@baylibre.com \
    --cc=andy.shevchenko@gmail.com \
    --cc=apokusinski01@gmail.com \
    --cc=cy_huang@richtek.com \
    --cc=demonsingur@gmail.com \
    --cc=dlechner@baylibre.com \
    --cc=gstols@baylibre.com \
    --cc=gustavograzs@gmail.com \
    --cc=gwendal@chromium.org \
    --cc=jic23@kernel.org \
    --cc=joao.goncalves@toradex.com \
    --cc=jstephan@baylibre.com \
    --cc=linux-iio@vger.kernel.org \
    --cc=marcelo.schmitt@analog.com \
    --cc=muditsharma.info@gmail.com \
    --cc=nuno.sa@analog.com \
    --cc=ramona.nechita@analog.com \
    --cc=tgamblin@baylibre.com \
    /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