dma-mapping: clear dev->dma_mem to NULL after freeing it
authorJoakim Zhang <joakim.zhang@cixtech.com>
Thu, 14 Dec 2023 08:25:26 +0000 (16:25 +0800)
committerChristoph Hellwig <hch@lst.de>
Fri, 15 Dec 2023 11:32:45 +0000 (12:32 +0100)
Reproduced with below sequence:
dma_declare_coherent_memory()->dma_release_coherent_memory()
->dma_declare_coherent_memory()->"return -EBUSY" error

It will return -EBUSY from the dma_assign_coherent_memory()
in dma_declare_coherent_memory(), the reason is that dev->dma_mem
pointer has not been set to NULL after it's freed.

Fixes: cf65a0f6f6ff ("dma-mapping: move all DMA mapping code to kernel/dma")
Signed-off-by: Joakim Zhang <joakim.zhang@cixtech.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
kernel/dma/coherent.c

index c21abc77c53e9a95d9749ff6fcb38f919cb08cee..ff5683a57f77126dd25ee2f2949fc4d45ce2fa05 100644 (file)
@@ -132,8 +132,10 @@ int dma_declare_coherent_memory(struct device *dev, phys_addr_t phys_addr,
 
 void dma_release_coherent_memory(struct device *dev)
 {
-       if (dev)
+       if (dev) {
                _dma_release_coherent_memory(dev->dma_mem);
+               dev->dma_mem = NULL;
+       }
 }
 
 static void *__dma_alloc_from_coherent(struct device *dev,