]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/atmel-hlcdc: fix memory leak from the atomic_destroy_state callback
authorLudovic Desroches <ludovic.desroches@microchip.com>
Fri, 24 Oct 2025 16:14:52 +0000 (18:14 +0200)
committerManikandan Muralidharan <manikandan.m@microchip.com>
Wed, 21 Jan 2026 03:04:12 +0000 (08:34 +0530)
After several commits, the slab memory increases. Some drm_crtc_commit
objects are not freed. The atomic_destroy_state callback only put the
framebuffer. Use the __drm_atomic_helper_plane_destroy_state() function
to put all the objects that are no longer needed.

It has been seen after hours of usage of a graphics application or using
kmemleak:

unreferenced object 0xc63a6580 (size 64):
  comm "egt_basic", pid 171, jiffies 4294940784
  hex dump (first 32 bytes):
    40 50 34 c5 01 00 00 00 ff ff ff ff 8c 65 3a c6  @P4..........e:.
    8c 65 3a c6 ff ff ff ff 98 65 3a c6 98 65 3a c6  .e:......e:..e:.
  backtrace (crc c25aa925):
    kmemleak_alloc+0x34/0x3c
    __kmalloc_cache_noprof+0x150/0x1a4
    drm_atomic_helper_setup_commit+0x1e8/0x7bc
    drm_atomic_helper_commit+0x3c/0x15c
    drm_atomic_commit+0xc0/0xf4
    drm_atomic_helper_set_config+0x84/0xb8
    drm_mode_setcrtc+0x32c/0x810
    drm_ioctl+0x20c/0x488
    sys_ioctl+0x14c/0xc20
    ret_fast_syscall+0x0/0x54

Signed-off-by: Ludovic Desroches <ludovic.desroches@microchip.com>
Reviewed-by: Manikandan Muralidharan <manikandan.m@microchip.com>
Link: https://patch.msgid.link/20251024-lcd_fixes_mainlining-v1-1-79b615130dc3@microchip.com
Signed-off-by: Manikandan Muralidharan <manikandan.m@microchip.com>
drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c

index 81dc730362322a4bae9b48dca97b06baa1e331e7..1ac4587702ab098dbd84f8d5502f44ce56e613cf 100644 (file)
@@ -1190,8 +1190,7 @@ static void atmel_hlcdc_plane_atomic_destroy_state(struct drm_plane *p,
                              state->dscrs[i]->self);
        }
 
-       if (s->fb)
-               drm_framebuffer_put(s->fb);
+       __drm_atomic_helper_plane_destroy_state(s);
 
        kfree(state);
 }