Le lundi 04 mars 2024 à 15:07 +0100, Christian König a écrit : > Am 04.03.24 um 14:59 schrieb Paul Cercueil: > > > [SNIP] > > > > > > > > > > > > > + dma_to_ram = buffer->direction == > > > > IIO_BUFFER_DIRECTION_IN; > > > > + > > > > + if (dma_to_ram) { > > > > + /* > > > > + * If we're writing to the DMABUF, make sure > > > > we > > > > don't have > > > > + * readers > > > > + */ > > > > + retl = dma_resv_wait_timeout(dmabuf->resv, > > > > + > > > > DMA_RESV_USAGE_READ, > > > > true, > > > > + timeout); > > > > + if (retl == 0) > > > > + retl = -EBUSY; > > > > + if (retl < 0) { > > > > + ret = (int)retl; > > > > + goto err_resv_unlock; > > > > + } > > > > + } > > > > + > > > > + if (buffer->access->lock_queue) > > > > + buffer->access->lock_queue(buffer); > > > > + > > > > + ret = dma_resv_reserve_fences(dmabuf->resv, 1); > > > > + if (ret) > > > > + goto err_queue_unlock; > > > > + > > > > + dma_resv_add_fence(dmabuf->resv, &fence->base, > > > > + dma_resv_usage_rw(dma_to_ram)); > > > > > > > > > > That is incorrect use of the function dma_resv_usage_rw(). That > > > function > > > is for retrieving fences and not adding them. > > > > > > See the function implementation and comments, when you use it > > > like > > > this > > > you get exactly what you don't want. > > > > > > > No, I get exactly what I want. If "dma_to_ram", I get > > DMA_RESV_USAGE_READ, otherwise I get DMA_RESV_USAGE_WRITE. > > > > Ah, so basically !dma_to_ram means that you have a write access to > the buffer? > "dma_to_ram" means the data flows from the DMA to the RAM. ... Which means that it writes the buffer, so you are right, this is wrong. > > > > If you really don't like the macro, I can inline things here. > > Yeah, that would still be incorrect use. > > The dma__resv_usage_rw() is for retrieving the fences to sync to for > read and write operations and should never be used together with > dma_fence_resv_add(). > Ok, I'll inline it (and fix it) then. Cheers, -Paul