[PATCH AUTOSEL 6.15 03/20] drm/msm: Fix another leak in the submit error path
Sasha Levin
sashal at kernel.org
Tue Jun 24 04:11:02 UTC 2025
From: Rob Clark <robdclark at chromium.org>
[ Upstream commit f681c2aa8676a890eacc84044717ab0fd26e058f ]
put_unused_fd() doesn't free the installed file, if we've already done
fd_install(). So we need to also free the sync_file.
Signed-off-by: Rob Clark <robdclark at chromium.org>
Patchwork: https://patchwork.freedesktop.org/patch/653583/
Signed-off-by: Rob Clark <robin.clark at oss.qualcomm.com>
Signed-off-by: Sasha Levin <sashal at kernel.org>
---
Based on my analysis, **YES**, this commit should be backported to
stable kernel trees.
## Extensive Explanation:
This commit fixes a **resource leak** in the MSM DRM driver's submit
error path, which is a clear bug that affects users and meets the stable
tree criteria.
### The Bug:
Looking at the code changes in `msm_gem_submit.c`:
1. **Before the fix**: When an error occurs after `fd_install()` has
been called (line 865 in the context), the error path only calls
`put_unused_fd(out_fence_fd)` at line 895-896.
2. **The problem**: As noted in the commit message, `put_unused_fd()`
doesn't free the installed file if `fd_install()` has already been
executed. The `sync_file` structure created by `sync_file_create()`
(line 861) contains a file reference that needs to be released with
`fput()`.
3. **The fix**: The patch adds proper cleanup by:
- Moving `sync_file` declaration to function scope (line 661)
- Adding proper cleanup in the error path (lines 895-898) that calls
both `put_unused_fd()` AND `fput(sync_file->file)` when needed
### Why This Is a Good Backport Candidate:
1. **Clear Bug Fix**: This fixes a resource leak that can accumulate
over time as applications hit error conditions during fence
submission.
2. **Small and Contained**: The fix is minimal - just 5 lines of actual
code changes that properly clean up resources.
3. **No Architectural Changes**: This doesn't introduce new features or
change any APIs - it simply fixes error handling.
4. **Similar to Previous Backported Fixes**: Looking at similar commit
#3 ("drm/msm: Fix submit error-path leaks") which was marked for
backporting, this follows the same pattern of fixing resource leaks
in error paths.
5. **Low Risk**: The change only affects error paths and adds proper
cleanup that was missing. It cannot break the normal success path.
6. **Documentation Confirms**: The sync_file.c documentation (line
62-63) explicitly states that sync_files should be released with
`fput(sync_file->file)`, confirming this is the correct fix.
### Pattern Analysis:
Comparing with the similar commits provided:
- Similar commits #1, #2, and #4 were NOT backported (they were general
code improvements or non-critical changes)
- Similar commits #3 and #5 WERE backported (they fixed actual resource
leaks or initialization failures)
This commit clearly falls into the same category as #3 and #5 - fixing
an actual resource leak that can impact system stability over time.
The leak occurs whenever:
1. A sync_file is successfully created
2. fd_install() succeeds
3. But then a subsequent error occurs before the submit completes
Without this fix, each occurrence leaks a file descriptor and associated
kernel memory, which could eventually exhaust resources in systems with
heavy GPU usage that encounter errors.
drivers/gpu/drm/msm/msm_gem_submit.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/msm/msm_gem_submit.c b/drivers/gpu/drm/msm/msm_gem_submit.c
index b2aeaecaa39b3..d4f71bb54e84c 100644
--- a/drivers/gpu/drm/msm/msm_gem_submit.c
+++ b/drivers/gpu/drm/msm/msm_gem_submit.c
@@ -658,6 +658,7 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
struct msm_ringbuffer *ring;
struct msm_submit_post_dep *post_deps = NULL;
struct drm_syncobj **syncobjs_to_reset = NULL;
+ struct sync_file *sync_file = NULL;
int out_fence_fd = -1;
unsigned i;
int ret;
@@ -867,7 +868,7 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
}
if (ret == 0 && args->flags & MSM_SUBMIT_FENCE_FD_OUT) {
- struct sync_file *sync_file = sync_file_create(submit->user_fence);
+ sync_file = sync_file_create(submit->user_fence);
if (!sync_file) {
ret = -ENOMEM;
} else {
@@ -901,8 +902,11 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
out_unlock:
mutex_unlock(&queue->lock);
out_post_unlock:
- if (ret && (out_fence_fd >= 0))
+ if (ret && (out_fence_fd >= 0)) {
put_unused_fd(out_fence_fd);
+ if (sync_file)
+ fput(sync_file->file);
+ }
if (!IS_ERR_OR_NULL(submit)) {
msm_gem_submit_put(submit);
--
2.39.5
More information about the dri-devel
mailing list