Mar 15, 2020 12:44:02 AM Vladimir Oltean <olteanv@xxxxxxxxx>: > From: Vladimir Oltean <vladimir.oltean@xxxxxxx> > > dspi->words_in_flight is a variable populated in the *_write functions > and used in the dspi_fifo_read function. It is also used in > dspi_fifo_write, immediately after transmission, to update the > message->actual_length variable used by higher layers such as spi-mem > for integrity checking. > > But it may happen that the IRQ which calls dspi_fifo_read to be > triggered before the updating of message->actual_length takes place. In > that case, dspi_fifo_read will decrement dspi->words_in_flight to -1, > and that will cause an invalid modification of message->actual_length. > > Make the simplest fix possible: don't decrement the actual shared > variable in dspi->words_in_flight from dspi_fifo_read, but actually a > copy of it which is on stack. > > Suggested-by: Michael Walle <michael@xxxxxxxx> > Signed-off-by: Vladimir Oltean <vladimir.oltean@xxxxxxx> > --- > Changes in v4: > Patch is new. > > drivers/spi/spi-fsl-dspi.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > diff --git a/drivers/spi/spi-fsl-dspi.c b/drivers/spi/spi-fsl-dspi.c > index 51224b772680..3ac004aa2abd 100644 > --- a/drivers/spi/spi-fsl-dspi.c > +++ b/drivers/spi/spi-fsl-dspi.c > @@ -765,8 +765,10 @@ static u32 dspi_popr_read(struct fsl_dspi *dspi) > > static void dspi_fifo_read(struct fsl_dspi *dspi) > { > + int num_fifo_entries = dspi->words_in_flight; > + > /* Read one FIFO entry and push to rx buffer */ > - while (dspi->words_in_flight--) > + while (num_fifo_entries--) > dspi_push_rx(dspi, dspi_popr_read(dspi)); > } > > -- > 2.17.1 > > Fixes: d59c90a2400f ("spi: spi-fsl-dspi: Convert TCFQ users to XSPI FIFO mode") Patchwork should know to pick up this tag. Thanks, -Vladimir