• C
    drm: Free the idr layers before calling idr_destroy() · ddd3d069
    Chris Wilson 提交于
    /* A typical clean-up sequence for objects stored in an idr tree, will
     * use idr_for_each() to free all objects, if necessary, then
     * idr_remove_all() to remove all ids, and idr_destroy() to free
     * up the cached idr_layers.
     */
    
    We were missing the vital idr_rmove_all() step and so were leaking
    the used layers for every dri client:
    
    unreferenced object 0xf32133c0 (size 148):
      comm "plymouthd", pid 131, jiffies 4294678490 (age 2308.030s)
      hex dump (first 32 bytes):
        04 00 00 00 00 00 00 00 00 00 00 00 00 40 19 f3  .............@..
        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
      backtrace:
        [<c04e5657>] create_object+0x124/0x1f1
        [<c07cf100>] kmemleak_alloc+0x4c/0x90
        [<c04db6a9>] kmem_cache_alloc+0xee/0x13c
        [<c05c3d25>] idr_pre_get+0x24/0x61
        [<f8315c9c>] drm_gem_handle_create+0x27/0x7f [drm]
        [<f89925b2>] i915_gem_create_ioctl+0x4f/0x71 [i915]
        [<f83148ac>] drm_ioctl+0x272/0x356 [drm]
        [<c04f27c4>] vfs_ioctl+0x33/0x91
        [<c04f31cf>] do_vfs_ioctl+0x46b/0x496
        [<c04f3240>] sys_ioctl+0x46/0x66
        [<c040325f>] sysenter_do_call+0x12/0x38
        [<ffffffff>] 0xffffffff
    
    Fixes https://bugzilla.kernel.org/show_bug.cgi?id=15803Signed-off-by: NChris Wilson <chris@chris-wilson.co.uk>
    Signed-off-by: NDave Airlie <airlied@redhat.com>
    ddd3d069
drm_drv.c 16.7 KB