diff mbox series

iio: accel: kxsd9: Fix alignment of local buffer.

Message ID 20200503172235.207632-1-jic23@kernel.org (mailing list archive)
State New, archived
Headers show
Series iio: accel: kxsd9: Fix alignment of local buffer. | expand

Commit Message

Jonathan Cameron May 3, 2020, 5:22 p.m. UTC
From: Jonathan Cameron <Jonathan.Cameron@huawei.com>

iio_push_to_buffers_with_timestamp assumes 8 byte alignment which
is not guaranteed by an array of 8 __be16.

Reported-by: Lars-Peter Clausen <lars@metafoo.de>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
---
 drivers/iio/accel/kxsd9.c | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

Comments

Nuno Sá May 3, 2020, 6:01 p.m. UTC | #1
On Sun, 2020-05-03 at 18:22 +0100, jic23@kernel.org wrote:
> From: Jonathan Cameron <Jonathan.Cameron@huawei.com>
> 
> iio_push_to_buffers_with_timestamp assumes 8 byte alignment which
> is not guaranteed by an array of 8 __be16.
> 
> Reported-by: Lars-Peter Clausen <lars@metafoo.de>
> Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
> ---
>  drivers/iio/accel/kxsd9.c | 12 +++++++-----
>  1 file changed, 7 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/iio/accel/kxsd9.c b/drivers/iio/accel/kxsd9.c
> index 0b876b2dc5bd..4c42d1200914 100644
> --- a/drivers/iio/accel/kxsd9.c
> +++ b/drivers/iio/accel/kxsd9.c
> @@ -209,14 +209,16 @@ static irqreturn_t kxsd9_trigger_handler(int
> irq, void *p)
>  	const struct iio_poll_func *pf = p;
>  	struct iio_dev *indio_dev = pf->indio_dev;
>  	struct kxsd9_state *st = iio_priv(indio_dev);
> +	struct {
> +		__be16 chan[4];
> +		u64 ts;
> +	} hw_values;

A nitpick from my side. Maybe a comment woudn't be that noisy. It might
be not that obvious for some people why this construct is needed and it
might prevent new driver's from doing the same mistake.

- Nuno Sá
Jonathan Cameron May 4, 2020, 9:47 a.m. UTC | #2
On Sun, 3 May 2020 20:01:56 +0200
Nuno Sá <noname.nuno@gmail.com> wrote:

> On Sun, 2020-05-03 at 18:22 +0100, jic23@kernel.org wrote:
> > From: Jonathan Cameron <Jonathan.Cameron@huawei.com>
> > 
> > iio_push_to_buffers_with_timestamp assumes 8 byte alignment which
> > is not guaranteed by an array of 8 __be16.
> > 
> > Reported-by: Lars-Peter Clausen <lars@metafoo.de>
> > Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
> > ---
> >  drivers/iio/accel/kxsd9.c | 12 +++++++-----
> >  1 file changed, 7 insertions(+), 5 deletions(-)
> > 
> > diff --git a/drivers/iio/accel/kxsd9.c b/drivers/iio/accel/kxsd9.c
> > index 0b876b2dc5bd..4c42d1200914 100644
> > --- a/drivers/iio/accel/kxsd9.c
> > +++ b/drivers/iio/accel/kxsd9.c
> > @@ -209,14 +209,16 @@ static irqreturn_t kxsd9_trigger_handler(int
> > irq, void *p)
> >  	const struct iio_poll_func *pf = p;
> >  	struct iio_dev *indio_dev = pf->indio_dev;
> >  	struct kxsd9_state *st = iio_priv(indio_dev);
> > +	struct {
> > +		__be16 chan[4];
> > +		u64 ts;
> > +	} hw_values;  
> 
> A nitpick from my side. Maybe a comment woudn't be that noisy. It might
> be not that obvious for some people why this construct is needed and it
> might prevent new driver's from doing the same mistake.

Good point. I'll add something like

/* Ensure correct positioning and alignment of timestamp */

above the struct definition.


> 
> - Nuno Sá
> 
>
diff mbox series

Patch

diff --git a/drivers/iio/accel/kxsd9.c b/drivers/iio/accel/kxsd9.c
index 0b876b2dc5bd..4c42d1200914 100644
--- a/drivers/iio/accel/kxsd9.c
+++ b/drivers/iio/accel/kxsd9.c
@@ -209,14 +209,16 @@  static irqreturn_t kxsd9_trigger_handler(int irq, void *p)
 	const struct iio_poll_func *pf = p;
 	struct iio_dev *indio_dev = pf->indio_dev;
 	struct kxsd9_state *st = iio_priv(indio_dev);
+	struct {
+		__be16 chan[4];
+		u64 ts;
+	} hw_values;
 	int ret;
-	/* 4 * 16bit values AND timestamp */
-	__be16 hw_values[8];
 
 	ret = regmap_bulk_read(st->map,
 			       KXSD9_REG_X,
-			       &hw_values,
-			       8);
+			       hw_values.chan,
+			       sizeof(hw_values.chan));
 	if (ret) {
 		dev_err(st->dev,
 			"error reading data\n");
@@ -224,7 +226,7 @@  static irqreturn_t kxsd9_trigger_handler(int irq, void *p)
 	}
 
 	iio_push_to_buffers_with_timestamp(indio_dev,
-					   hw_values,
+					   &hw_values,
 					   iio_get_time_ns(indio_dev));
 	iio_trigger_notify_done(indio_dev->trig);