On Tue, Feb 24, 2015 at 03:00:03PM +0200, Stanimir Varbanov wrote: > +static void spi_qup_dma_done(void *data) > +{ > + struct spi_qup *qup = data; > + > + if (atomic_dec_and_test(&qup->dma_outstanding)) > + complete(&qup->done); > +} I'm finding it hard to be thrilled about the use of atomics for synchronization (they're just generally hard to work with) and... > + cookie = dmaengine_submit(desc); > + ret = dma_submit_error(cookie); > + if (ret) > + return ret; > + atomic_inc(&qup->dma_outstanding); ..don't we have two potential races here: one if somehow the DMA manages to complete prior to the atomic_inc() (unlikely but that's what race conditions are all about really) and one if we are issuing multiple DMAs and the early ones complete before the later ones are issued?
Attachment:
signature.asc
Description: Digital signature