summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCharan Teja Reddy <charante@codeaurora.org>2021-07-23 18:01:08 +0530
committerChristian König <christian.koenig@amd.com>2021-08-16 14:07:56 +0200
commitf492283b157053e9555787262f058ae33096f568 (patch)
treedec4d9318c3411c6bb67537f6b65ed983e0caa3b
parent992c238188a83befa0094a8c00bfead31aa302ed (diff)
downloadlinux-stable-f492283b157053e9555787262f058ae33096f568.tar.gz
linux-stable-f492283b157053e9555787262f058ae33096f568.tar.bz2
linux-stable-f492283b157053e9555787262f058ae33096f568.zip
dma-buf: WARN on dmabuf release with pending attachments
It is expected from the clients to follow the below steps on an imported dmabuf fd: a) dmabuf = dma_buf_get(fd) // Get the dmabuf from fd b) dma_buf_attach(dmabuf); // Clients attach to the dmabuf o Here the kernel does some slab allocations, say for dma_buf_attachment and may be some other slab allocation in the dmabuf->ops->attach(). c) Client may need to do dma_buf_map_attachment(). d) Accordingly dma_buf_unmap_attachment() should be called. e) dma_buf_detach () // Clients detach to the dmabuf. o Here the slab allocations made in b) are freed. f) dma_buf_put(dmabuf) // Can free the dmabuf if it is the last reference. Now say an erroneous client failed at step c) above thus it directly called dma_buf_put(), step f) above. Considering that it may be the last reference to the dmabuf, buffer will be freed with pending attachments left to the dmabuf which can show up as the 'memory leak'. This should at least be reported as the WARN(). Signed-off-by: Charan Teja Reddy <charante@codeaurora.org> Reviewed-by: Christian König <christian.koenig@amd.com> Link: https://patchwork.freedesktop.org/patch/msgid/1627043468-16381-1-git-send-email-charante@codeaurora.org Signed-off-by: Christian König <christian.koenig@amd.com>
-rw-r--r--drivers/dma-buf/dma-buf.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c
index 63d32261b63f..474de2d988ca 100644
--- a/drivers/dma-buf/dma-buf.c
+++ b/drivers/dma-buf/dma-buf.c
@@ -82,6 +82,7 @@ static void dma_buf_release(struct dentry *dentry)
if (dmabuf->resv == (struct dma_resv *)&dmabuf[1])
dma_resv_fini(dmabuf->resv);
+ WARN_ON(!list_empty(&dmabuf->attachments));
module_put(dmabuf->owner);
kfree(dmabuf->name);
kfree(dmabuf);