Skip to content

Commit 789e46f

Browse files
jnikularodrigovivi
authored andcommitted
drm/i915/panic: fix panic structure allocation memory leak
Separating the panic allocation from framebuffer allocation in commit 729c5f7 ("drm/{i915,xe}/panic: move framebuffer allocation where it belongs") failed to deallocate the panic structure anywhere. The fix is two-fold. First, free the panic structure in intel_user_framebuffer_destroy() in the general case. Second, move the panic allocation later to intel_framebuffer_init() to not leak the panic structure in error paths (if any, now or later) between intel_framebuffer_alloc() and intel_framebuffer_init(). v2: Rebase Fixes: 729c5f7 ("drm/{i915,xe}/panic: move framebuffer allocation where it belongs") Cc: Jocelyn Falempe <[email protected]> Cc: Maarten Lankhorst <[email protected]> Reported-by: Michał Grzelak <[email protected]> Suggested-by: Ville Syrjälä <[email protected]> Tested-by: Michał Grzelak <[email protected]> # v1 Reviewed-by: Jocelyn Falempe <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jani Nikula <[email protected]> (cherry picked from commit 8f8ef09fcf6a3b00369bfc704e8f68d7474eca94) Signed-off-by: Rodrigo Vivi <[email protected]>
1 parent 211ddde commit 789e46f

File tree

1 file changed

+13
-12
lines changed

1 file changed

+13
-12
lines changed

drivers/gpu/drm/i915/display/intel_fb.c

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2117,6 +2117,7 @@ static void intel_user_framebuffer_destroy(struct drm_framebuffer *fb)
21172117

21182118
intel_frontbuffer_put(intel_fb->frontbuffer);
21192119

2120+
kfree(intel_fb->panic);
21202121
kfree(intel_fb);
21212122
}
21222123

@@ -2215,16 +2216,22 @@ int intel_framebuffer_init(struct intel_framebuffer *intel_fb,
22152216
struct intel_display *display = to_intel_display(obj->dev);
22162217
struct drm_framebuffer *fb = &intel_fb->base;
22172218
u32 max_stride;
2218-
int ret = -EINVAL;
2219+
int ret;
22192220
int i;
22202221

2222+
intel_fb->panic = intel_panic_alloc();
2223+
if (!intel_fb->panic)
2224+
return -ENOMEM;
2225+
22212226
/*
22222227
* intel_frontbuffer_get() must be done before
22232228
* intel_fb_bo_framebuffer_init() to avoid set_tiling vs. addfb race.
22242229
*/
22252230
intel_fb->frontbuffer = intel_frontbuffer_get(obj);
2226-
if (!intel_fb->frontbuffer)
2227-
return -ENOMEM;
2231+
if (!intel_fb->frontbuffer) {
2232+
ret = -ENOMEM;
2233+
goto err_free_panic;
2234+
}
22282235

22292236
ret = intel_fb_bo_framebuffer_init(fb, obj, mode_cmd);
22302237
if (ret)
@@ -2323,6 +2330,9 @@ int intel_framebuffer_init(struct intel_framebuffer *intel_fb,
23232330
intel_fb_bo_framebuffer_fini(obj);
23242331
err_frontbuffer_put:
23252332
intel_frontbuffer_put(intel_fb->frontbuffer);
2333+
err_free_panic:
2334+
kfree(intel_fb->panic);
2335+
23262336
return ret;
23272337
}
23282338

@@ -2349,20 +2359,11 @@ intel_user_framebuffer_create(struct drm_device *dev,
23492359
struct intel_framebuffer *intel_framebuffer_alloc(void)
23502360
{
23512361
struct intel_framebuffer *intel_fb;
2352-
struct intel_panic *panic;
23532362

23542363
intel_fb = kzalloc(sizeof(*intel_fb), GFP_KERNEL);
23552364
if (!intel_fb)
23562365
return NULL;
23572366

2358-
panic = intel_panic_alloc();
2359-
if (!panic) {
2360-
kfree(intel_fb);
2361-
return NULL;
2362-
}
2363-
2364-
intel_fb->panic = panic;
2365-
23662367
return intel_fb;
23672368
}
23682369

0 commit comments

Comments
 (0)