spi: bcm2835: Fix race on DMA termination
authorLukas Wunner <lukas@wunner.de>
Thu, 8 Nov 2018 07:06:10 +0000 (08:06 +0100)
committerMark Brown <broonie@kernel.org>
Wed, 28 Nov 2018 15:42:50 +0000 (15:42 +0000)
commite82b0b3828451c1cd331d9f304c6078fcd43b62e
treeebf9a84125a4407096f6c2298fac764626f40356
parentdbc944115eed48af110646992893dc43321368d8
spi: bcm2835: Fix race on DMA termination

If a DMA transfer finishes orderly right when spi_transfer_one_message()
determines that it has timed out, the callbacks bcm2835_spi_dma_done()
and bcm2835_spi_handle_err() race to call dmaengine_terminate_all(),
potentially leading to double termination.

Prevent by atomically changing the dma_pending flag before calling
dmaengine_terminate_all().

Signed-off-by: Lukas Wunner <lukas@wunner.de>
Fixes: 3ecd37edaa2a ("spi: bcm2835: enable dma modes for transfers meeting certain conditions")
Cc: stable@vger.kernel.org # v4.2+
Cc: Mathias Duckeck <m.duckeck@kunbus.de>
Cc: Frank Pavlic <f.pavlic@kunbus.de>
Cc: Martin Sperl <kernel@martin.sperl.org>
Cc: Noralf Trønnes <noralf@tronnes.org>
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi-bcm2835.c