diff mbox series

iio: core: WARN in case sample bits do not fit storage bits

Message ID 20220320181542.168147-1-marex@denx.de (mailing list archive)
State Superseded
Headers show
Series iio: core: WARN in case sample bits do not fit storage bits | expand

Commit Message

Marek Vasut March 20, 2022, 6:15 p.m. UTC
Add runtime check to verify whether storagebits are at least as big
as shifted realbits. This should help spot broken drivers which may
set realbits + shift above storagebits.

Signed-off-by: Marek Vasut <marex@denx.de>
Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Cc: Andy Shevchenko <andy.shevchenko@gmail.com>
Cc: Daniel Baluta <daniel.baluta@nxp.com>
Cc: Jonathan Cameron <Jonathan.Cameron@huawei.com>
---
 drivers/iio/industrialio-buffer.c | 5 +++++
 1 file changed, 5 insertions(+)

Comments

Nuno Sa March 21, 2022, 9:08 a.m. UTC | #1
> -----Original Message-----
> From: Marek Vasut <marex@denx.de>
> Sent: Sunday, March 20, 2022 7:16 PM
> To: linux-iio@vger.kernel.org
> Cc: Marek Vasut <marex@denx.de>; Andy Shevchenko
> <andriy.shevchenko@linux.intel.com>; Andy Shevchenko
> <andy.shevchenko@gmail.com>; Daniel Baluta
> <daniel.baluta@nxp.com>; Jonathan Cameron
> <Jonathan.Cameron@huawei.com>
> Subject: [PATCH] iio: core: WARN in case sample bits do not fit storage
> bits
> 
> [External]
> 
> Add runtime check to verify whether storagebits are at least as big
> as shifted realbits. This should help spot broken drivers which may
> set realbits + shift above storagebits.
> 
> Signed-off-by: Marek Vasut <marex@denx.de>
> Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> Cc: Andy Shevchenko <andy.shevchenko@gmail.com>
> Cc: Daniel Baluta <daniel.baluta@nxp.com>
> Cc: Jonathan Cameron <Jonathan.Cameron@huawei.com>
> ---

Acked-by: Nuno Sá <nuno.sa@analog.com>

>  drivers/iio/industrialio-buffer.c | 5 +++++
>  1 file changed, 5 insertions(+)
> 
> diff --git a/drivers/iio/industrialio-buffer.c b/drivers/iio/industrialio-
> buffer.c
> index b078eb2f3c9de..bac1e994e7bef 100644
> --- a/drivers/iio/industrialio-buffer.c
> +++ b/drivers/iio/industrialio-buffer.c
> @@ -1629,6 +1629,11 @@ static int
> __iio_buffer_alloc_sysfs_and_mask(struct iio_buffer *buffer,
>  			if (channels[i].scan_index < 0)
>  				continue;
> 
> +			/* Verify that sample bits fit into storage */
> +			WARN_ON(channels[i].scan_type.storagebits <
> +				channels[i].scan_type.realbits +
> +				channels[i].scan_type.shift);
> +
>  			ret = iio_buffer_add_channel_sysfs(indio_dev,
> buffer,
>  							 &channels[i]);
>  			if (ret < 0)
> --
> 2.35.1
Andy Shevchenko March 21, 2022, 10:40 a.m. UTC | #2
On Sun, Mar 20, 2022 at 07:15:42PM +0100, Marek Vasut wrote:
> Add runtime check to verify whether storagebits are at least as big
> as shifted realbits. This should help spot broken drivers which may
> set realbits + shift above storagebits.

Thanks!

...

>  
> +			/* Verify that sample bits fit into storage */
> +			WARN_ON(channels[i].scan_type.storagebits <
> +				channels[i].scan_type.realbits +
> +				channels[i].scan_type.shift);

Not sure WARN is a good level (it might be fatal on some setups and we won't that),
besides the fact that we may use dev_WARN(). Perhaps dev_warn() would suffice?
Marek Vasut March 21, 2022, 2:46 p.m. UTC | #3
On 3/21/22 11:40, Andy Shevchenko wrote:
> On Sun, Mar 20, 2022 at 07:15:42PM +0100, Marek Vasut wrote:
>> Add runtime check to verify whether storagebits are at least as big
>> as shifted realbits. This should help spot broken drivers which may
>> set realbits + shift above storagebits.
> 
> Thanks!
> 
> ...
> 
>>   
>> +			/* Verify that sample bits fit into storage */
>> +			WARN_ON(channels[i].scan_type.storagebits <
>> +				channels[i].scan_type.realbits +
>> +				channels[i].scan_type.shift);
> 
> Not sure WARN is a good level (it might be fatal on some setups and we won't that),
> besides the fact that we may use dev_WARN(). Perhaps dev_warn() would suffice?

I was actually thinking about BUG(), but that might crash existing 
systems. I think we want a strong indicator that something wrong is 
going on which must be fixed and the splat produced by WARN_ON() is a 
good indicator of that. It also does not crash existing systems, so even 
if existing users get a warning now, they won't get an unbootable system 
and can report that warning.
Andy Shevchenko March 21, 2022, 4:10 p.m. UTC | #4
On Mon, Mar 21, 2022 at 03:46:51PM +0100, Marek Vasut wrote:
> On 3/21/22 11:40, Andy Shevchenko wrote:
> > On Sun, Mar 20, 2022 at 07:15:42PM +0100, Marek Vasut wrote:
> > > Add runtime check to verify whether storagebits are at least as big
> > > as shifted realbits. This should help spot broken drivers which may
> > > set realbits + shift above storagebits.
> > 
> > Thanks!
> > 
> > ...
> > 
> > > +			/* Verify that sample bits fit into storage */
> > > +			WARN_ON(channels[i].scan_type.storagebits <
> > > +				channels[i].scan_type.realbits +
> > > +				channels[i].scan_type.shift);
> > 
> > Not sure WARN is a good level (it might be fatal on some setups and we won't that),
> > besides the fact that we may use dev_WARN(). Perhaps dev_warn() would suffice?
> 
> I was actually thinking about BUG(), but that might crash existing systems.
> I think we want a strong indicator that something wrong is going on which
> must be fixed and the splat produced by WARN_ON() is a good indicator of
> that. It also does not crash existing systems,

It does crash _some_ of them, unfortunately.

> so even if existing users get
> a warning now, they won't get an unbootable system and can report that
> warning.
Marek Vasut March 21, 2022, 7:46 p.m. UTC | #5
On 3/21/22 17:10, Andy Shevchenko wrote:
> On Mon, Mar 21, 2022 at 03:46:51PM +0100, Marek Vasut wrote:
>> On 3/21/22 11:40, Andy Shevchenko wrote:
>>> On Sun, Mar 20, 2022 at 07:15:42PM +0100, Marek Vasut wrote:
>>>> Add runtime check to verify whether storagebits are at least as big
>>>> as shifted realbits. This should help spot broken drivers which may
>>>> set realbits + shift above storagebits.
>>>
>>> Thanks!
>>>
>>> ...
>>>
>>>> +			/* Verify that sample bits fit into storage */
>>>> +			WARN_ON(channels[i].scan_type.storagebits <
>>>> +				channels[i].scan_type.realbits +
>>>> +				channels[i].scan_type.shift);
>>>
>>> Not sure WARN is a good level (it might be fatal on some setups and we won't that),
>>> besides the fact that we may use dev_WARN(). Perhaps dev_warn() would suffice?
>>
>> I was actually thinking about BUG(), but that might crash existing systems.
>> I think we want a strong indicator that something wrong is going on which
>> must be fixed and the splat produced by WARN_ON() is a good indicator of
>> that. It also does not crash existing systems,
> 
> It does crash _some_ of them, unfortunately.

Details please ?

WARN_ON() shouldn't cause crash outright, or do I miss something ?
Nuno Sá March 22, 2022, 7:43 a.m. UTC | #6
On Mon, 2022-03-21 at 20:46 +0100, Marek Vasut wrote:
> On 3/21/22 17:10, Andy Shevchenko wrote:
> > On Mon, Mar 21, 2022 at 03:46:51PM +0100, Marek Vasut wrote:
> > > On 3/21/22 11:40, Andy Shevchenko wrote:
> > > > On Sun, Mar 20, 2022 at 07:15:42PM +0100, Marek Vasut wrote:
> > > > > Add runtime check to verify whether storagebits are at least
> > > > > as big
> > > > > as shifted realbits. This should help spot broken drivers
> > > > > which may
> > > > > set realbits + shift above storagebits.
> > > > 
> > > > Thanks!
> > > > 
> > > > ...
> > > > 
> > > > > +                       /* Verify that sample bits fit into
> > > > > storage */
> > > > > +                       WARN_ON(channels[i].scan_type.storage
> > > > > bits <
> > > > > +                               channels[i].scan_type.realbit
> > > > > s +
> > > > > +                               channels[i].scan_type.shift);
> > > > 
> > > > Not sure WARN is a good level (it might be fatal on some setups
> > > > and we won't that),
> > > > besides the fact that we may use dev_WARN(). Perhaps dev_warn()
> > > > would suffice?
> > > 
> > > I was actually thinking about BUG(), but that might crash
> > > existing systems.
> > > I think we want a strong indicator that something wrong is going
> > > on which
> > > must be fixed and the splat produced by WARN_ON() is a good
> > > indicator of
> > > that. It also does not crash existing systems,
> > 
> > It does crash _some_ of them, unfortunately.
> 
> Details please ?
> 
> WARN_ON() shouldn't cause crash outright, or do I miss something ?

Arghh, completely forgot about this... Andy is right, maybe there are
other cases (in which case, it would be nice to share :D), but this one
is definitely one of them:

https://elixir.bootlin.com/linux/latest/source/kernel/panic.c#L579

You can have a cmdline parameter to panic on _WARN() and some systems
may have it.

That said, the "nice" stack_dump using WARN is way more explicit about
saying that something is seriously wrong and must be fixed. dev_warn()
is easier to ignore... But surely it is not nice to brick existing
systems.  

Not really sure here...

- Nuno Sá
Andy Shevchenko March 22, 2022, 9:49 a.m. UTC | #7
On Tue, Mar 22, 2022 at 08:43:10AM +0100, Nuno Sá wrote:
> On Mon, 2022-03-21 at 20:46 +0100, Marek Vasut wrote:
> > On 3/21/22 17:10, Andy Shevchenko wrote:
> > > On Mon, Mar 21, 2022 at 03:46:51PM +0100, Marek Vasut wrote:
> > > > On 3/21/22 11:40, Andy Shevchenko wrote:
> > > > > On Sun, Mar 20, 2022 at 07:15:42PM +0100, Marek Vasut wrote:
> > > > > > Add runtime check to verify whether storagebits are at least
> > > > > > as big
> > > > > > as shifted realbits. This should help spot broken drivers
> > > > > > which may
> > > > > > set realbits + shift above storagebits.
> > > > > 
> > > > > Thanks!
> > > > > 
> > > > > ...
> > > > > 
> > > > > > +                       /* Verify that sample bits fit into
> > > > > > storage */
> > > > > > +                       WARN_ON(channels[i].scan_type.storage
> > > > > > bits <
> > > > > > +                               channels[i].scan_type.realbit
> > > > > > s +
> > > > > > +                               channels[i].scan_type.shift);
> > > > > 
> > > > > Not sure WARN is a good level (it might be fatal on some setups
> > > > > and we won't that),
> > > > > besides the fact that we may use dev_WARN(). Perhaps dev_warn()
> > > > > would suffice?
> > > > 
> > > > I was actually thinking about BUG(), but that might crash
> > > > existing systems.
> > > > I think we want a strong indicator that something wrong is going
> > > > on which
> > > > must be fixed and the splat produced by WARN_ON() is a good
> > > > indicator of
> > > > that. It also does not crash existing systems,
> > > 
> > > It does crash _some_ of them, unfortunately.
> > 
> > Details please ?
> > 
> > WARN_ON() shouldn't cause crash outright, or do I miss something ?
> 
> Arghh, completely forgot about this... Andy is right, maybe there are
> other cases (in which case, it would be nice to share :D), but this one
> is definitely one of them:
> 
> https://elixir.bootlin.com/linux/latest/source/kernel/panic.c#L579
> 
> You can have a cmdline parameter to panic on _WARN() and some systems
> may have it.

Yes, I meant panic on warning.

And I can't imagine that this driver can be system critical to the extent
that we have to crash the system.

> That said, the "nice" stack_dump using WARN is way more explicit about
> saying that something is seriously wrong and must be fixed. dev_warn()
> is easier to ignore... But surely it is not nice to brick existing
> systems.  
> 
> Not really sure here...
Marek Vasut March 22, 2022, 9:57 a.m. UTC | #8
On 3/22/22 10:49, Andy Shevchenko wrote:
> On Tue, Mar 22, 2022 at 08:43:10AM +0100, Nuno Sá wrote:
>> On Mon, 2022-03-21 at 20:46 +0100, Marek Vasut wrote:
>>> On 3/21/22 17:10, Andy Shevchenko wrote:
>>>> On Mon, Mar 21, 2022 at 03:46:51PM +0100, Marek Vasut wrote:
>>>>> On 3/21/22 11:40, Andy Shevchenko wrote:
>>>>>> On Sun, Mar 20, 2022 at 07:15:42PM +0100, Marek Vasut wrote:
>>>>>>> Add runtime check to verify whether storagebits are at least
>>>>>>> as big
>>>>>>> as shifted realbits. This should help spot broken drivers
>>>>>>> which may
>>>>>>> set realbits + shift above storagebits.
>>>>>>
>>>>>> Thanks!
>>>>>>
>>>>>> ...
>>>>>>
>>>>>>> +                       /* Verify that sample bits fit into
>>>>>>> storage */
>>>>>>> +                       WARN_ON(channels[i].scan_type.storage
>>>>>>> bits <
>>>>>>> +                               channels[i].scan_type.realbit
>>>>>>> s +
>>>>>>> +                               channels[i].scan_type.shift);
>>>>>>
>>>>>> Not sure WARN is a good level (it might be fatal on some setups
>>>>>> and we won't that),
>>>>>> besides the fact that we may use dev_WARN(). Perhaps dev_warn()
>>>>>> would suffice?
>>>>>
>>>>> I was actually thinking about BUG(), but that might crash
>>>>> existing systems.
>>>>> I think we want a strong indicator that something wrong is going
>>>>> on which
>>>>> must be fixed and the splat produced by WARN_ON() is a good
>>>>> indicator of
>>>>> that. It also does not crash existing systems,
>>>>
>>>> It does crash _some_ of them, unfortunately.
>>>
>>> Details please ?
>>>
>>> WARN_ON() shouldn't cause crash outright, or do I miss something ?
>>
>> Arghh, completely forgot about this... Andy is right, maybe there are
>> other cases (in which case, it would be nice to share :D), but this one
>> is definitely one of them:
>>
>> https://elixir.bootlin.com/linux/latest/source/kernel/panic.c#L579
>>
>> You can have a cmdline parameter to panic on _WARN() and some systems
>> may have it.
> 
> Yes, I meant panic on warning.
> 
> And I can't imagine that this driver can be system critical to the extent
> that we have to crash the system.

Is there something which does trigger a backtrace, but without 
panic()ing the system ?
Nuno Sá March 22, 2022, 10:10 a.m. UTC | #9
On Tue, 2022-03-22 at 10:57 +0100, Marek Vasut wrote:
> On 3/22/22 10:49, Andy Shevchenko wrote:
> > On Tue, Mar 22, 2022 at 08:43:10AM +0100, Nuno Sá wrote:
> > > On Mon, 2022-03-21 at 20:46 +0100, Marek Vasut wrote:
> > > > On 3/21/22 17:10, Andy Shevchenko wrote:
> > > > > On Mon, Mar 21, 2022 at 03:46:51PM +0100, Marek Vasut wrote:
> > > > > > On 3/21/22 11:40, Andy Shevchenko wrote:
> > > > > > > On Sun, Mar 20, 2022 at 07:15:42PM +0100, Marek Vasut
> > > > > > > wrote:
> > > > > > > > Add runtime check to verify whether storagebits are at
> > > > > > > > least
> > > > > > > > as big
> > > > > > > > as shifted realbits. This should help spot broken
> > > > > > > > drivers
> > > > > > > > which may
> > > > > > > > set realbits + shift above storagebits.
> > > > > > > 
> > > > > > > Thanks!
> > > > > > > 
> > > > > > > ...
> > > > > > > 
> > > > > > > > +                       /* Verify that sample bits fit
> > > > > > > > into
> > > > > > > > storage */
> > > > > > > > +                       WARN_ON(channels[i].scan_type.s
> > > > > > > > torage
> > > > > > > > bits <
> > > > > > > > +                               channels[i].scan_type.r
> > > > > > > > ealbit
> > > > > > > > s +
> > > > > > > > +                               channels[i].scan_type.s
> > > > > > > > hift);
> > > > > > > 
> > > > > > > Not sure WARN is a good level (it might be fatal on some
> > > > > > > setups
> > > > > > > and we won't that),
> > > > > > > besides the fact that we may use dev_WARN(). Perhaps
> > > > > > > dev_warn()
> > > > > > > would suffice?
> > > > > > 
> > > > > > I was actually thinking about BUG(), but that might crash
> > > > > > existing systems.
> > > > > > I think we want a strong indicator that something wrong is
> > > > > > going
> > > > > > on which
> > > > > > must be fixed and the splat produced by WARN_ON() is a good
> > > > > > indicator of
> > > > > > that. It also does not crash existing systems,
> > > > > 
> > > > > It does crash _some_ of them, unfortunately.
> > > > 
> > > > Details please ?
> > > > 
> > > > WARN_ON() shouldn't cause crash outright, or do I miss
> > > > something ?
> > > 
> > > Arghh, completely forgot about this... Andy is right, maybe there
> > > are
> > > other cases (in which case, it would be nice to share :D), but
> > > this one
> > > is definitely one of them:
> > > 
> > > https://elixir.bootlin.com/linux/latest/source/kernel/panic.c#L579
> > > 
> > > You can have a cmdline parameter to panic on _WARN() and some
> > > systems
> > > may have it.
> > 
> > Yes, I meant panic on warning.
> > 
> > And I can't imagine that this driver can be system critical to the
> > extent
> > that we have to crash the system.
> 
> Is there something which does trigger a backtrace, but without 
> panic()ing the system ?

Nothing I'm aware... Other than directly call 'dump_stack()'

- Nuno Sá
Marek Vasut March 22, 2022, 11:17 a.m. UTC | #10
On 3/22/22 11:10, Nuno Sá wrote:

Hi,

[...]

>>>> Arghh, completely forgot about this... Andy is right, maybe there
>>>> are
>>>> other cases (in which case, it would be nice to share :D), but
>>>> this one
>>>> is definitely one of them:
>>>>
>>>> https://elixir.bootlin.com/linux/latest/source/kernel/panic.c#L579
>>>>
>>>> You can have a cmdline parameter to panic on _WARN() and some
>>>> systems
>>>> may have it.
>>>
>>> Yes, I meant panic on warning.
>>>
>>> And I can't imagine that this driver can be system critical to the
>>> extent
>>> that we have to crash the system.
>>
>> Is there something which does trigger a backtrace, but without
>> panic()ing the system ?
> 
> Nothing I'm aware... Other than directly call 'dump_stack()'

All right, dev_err() it is then. I sent V2.
diff mbox series

Patch

diff --git a/drivers/iio/industrialio-buffer.c b/drivers/iio/industrialio-buffer.c
index b078eb2f3c9de..bac1e994e7bef 100644
--- a/drivers/iio/industrialio-buffer.c
+++ b/drivers/iio/industrialio-buffer.c
@@ -1629,6 +1629,11 @@  static int __iio_buffer_alloc_sysfs_and_mask(struct iio_buffer *buffer,
 			if (channels[i].scan_index < 0)
 				continue;
 
+			/* Verify that sample bits fit into storage */
+			WARN_ON(channels[i].scan_type.storagebits <
+				channels[i].scan_type.realbits +
+				channels[i].scan_type.shift);
+
 			ret = iio_buffer_add_channel_sysfs(indio_dev, buffer,
 							 &channels[i]);
 			if (ret < 0)