diff options
Diffstat (limited to 'target/linux/bcm27xx/patches-5.15/950-0378-staging-vcsm-cma-Fix-memory-leak-from-not-detaching-.patch')
-rw-r--r-- | target/linux/bcm27xx/patches-5.15/950-0378-staging-vcsm-cma-Fix-memory-leak-from-not-detaching-.patch | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/target/linux/bcm27xx/patches-5.15/950-0378-staging-vcsm-cma-Fix-memory-leak-from-not-detaching-.patch b/target/linux/bcm27xx/patches-5.15/950-0378-staging-vcsm-cma-Fix-memory-leak-from-not-detaching-.patch new file mode 100644 index 0000000000..f67723676b --- /dev/null +++ b/target/linux/bcm27xx/patches-5.15/950-0378-staging-vcsm-cma-Fix-memory-leak-from-not-detaching-.patch @@ -0,0 +1,77 @@ +From 8c5dbd19e5182253e5f6b1deff6441599e01132d Mon Sep 17 00:00:00 2001 +From: Dave Stevenson <dave.stevenson@raspberrypi.com> +Date: Wed, 4 Nov 2020 18:54:20 +0000 +Subject: [PATCH] staging: vcsm-cma: Fix memory leak from not detaching + dmabuf + +When importing there was a missing call to detach the buffer, +so each import leaked the sg table entry. + +Actually the release process for both locally allocated and +imported buffers is identical, so fix them to both use the same +function. + +Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com> +--- + .../staging/vc04_services/vc-sm-cma/vc_sm.c | 22 ++----------------- + 1 file changed, 2 insertions(+), 20 deletions(-) + +--- a/drivers/staging/vc04_services/vc-sm-cma/vc_sm.c ++++ b/drivers/staging/vc04_services/vc-sm-cma/vc_sm.c +@@ -237,6 +237,7 @@ static void vc_sm_add_resource(struct vc + + /* + * Cleans up imported dmabuf. ++ * Should be called with mutex held. + */ + static void vc_sm_clean_up_dmabuf(struct vc_sm_buffer *buffer) + { +@@ -244,7 +245,6 @@ static void vc_sm_clean_up_dmabuf(struct + return; + + /* Handle cleaning up imported dmabufs */ +- mutex_lock(&buffer->lock); + if (buffer->import.sgt) { + dma_buf_unmap_attachment(buffer->import.attach, + buffer->import.sgt, +@@ -255,7 +255,6 @@ static void vc_sm_clean_up_dmabuf(struct + dma_buf_detach(buffer->dma_buf, buffer->import.attach); + buffer->import.attach = NULL; + } +- mutex_unlock(&buffer->lock); + } + + /* +@@ -673,23 +672,6 @@ int vc_sm_import_dmabuf_mmap(struct dma_ + } + + static +-void vc_sm_import_dma_buf_release(struct dma_buf *dmabuf) +-{ +- struct vc_sm_buffer *buf = dmabuf->priv; +- +- pr_debug("%s: Relasing dma_buf %p\n", __func__, dmabuf); +- mutex_lock(&buf->lock); +- if (!buf->imported) +- return; +- +- buf->in_use = 0; +- +- vc_sm_vpu_free(buf); +- +- vc_sm_release_resource(buf); +-} +- +-static + int vc_sm_import_dma_buf_begin_cpu_access(struct dma_buf *dmabuf, + enum dma_data_direction direction) + { +@@ -717,7 +699,7 @@ static const struct dma_buf_ops dma_buf_ + .map_dma_buf = vc_sm_import_map_dma_buf, + .unmap_dma_buf = vc_sm_import_unmap_dma_buf, + .mmap = vc_sm_import_dmabuf_mmap, +- .release = vc_sm_import_dma_buf_release, ++ .release = vc_sm_dma_buf_release, + .attach = vc_sm_import_dma_buf_attach, + .detach = vc_sm_import_dma_buf_detatch, + .begin_cpu_access = vc_sm_import_dma_buf_begin_cpu_access, |