CHROMIUM: drm/rockchip: Call drm_gem_object_release() to destroy GEM base
authorTomasz Figa <tfiga@chromium.org>
Wed, 14 Sep 2016 11:50:29 +0000 (20:50 +0900)
committerHuang, Tao <huangtao@rock-chips.com>
Wed, 7 Dec 2016 06:32:20 +0000 (14:32 +0800)
When converting the driver to use shmem-backed GEMs for IOMMU-enabled
systems, we forgot to add calls to drm_gem_object_release(), which gave
us a quite nice memory leak. This patch adds the missing calls.

Fixes: f11d5f0 ("FROMLIST: drm/rockchip: Do not use DMA mapping API if
attached to IOMMU domain")

BUG=chrome-os-partner:57158
TEST=while true; do backlight_dbus_tool --set --percent=0 && sleep 8 &&
 backlight_dbus_tool --set --percent=100 && sleep 3 ; done

Signed-off-by: Tomasz Figa <tfiga@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/385456
Reviewed-by: Douglas Anderson <dianders@chromium.org>
Reviewed-by: Daniel Kurtz <djkurtz@chromium.org>
Conflicts:
drivers/gpu/drm/rockchip/rockchip_drm_gem.c

Change-Id: I3c7b21ed22cfb38f512150f76fced3b0cc2b296d
Signed-off-by: Randy Li <randy.li@rock-chips.com>
drivers/gpu/drm/rockchip/rockchip_drm_gem.c

index 9d544d1ba547e8a2fe324df010b72e535c2543c1..c1cf3dff8e24b3391de9438470cbc163ff070526 100644 (file)
@@ -313,6 +313,12 @@ rockchip_gem_alloc_object(struct drm_device *drm, unsigned int size)
        return rk_obj;
 }
 
+static void rockchip_gem_release_object(struct rockchip_gem_object *rk_obj)
+{
+       drm_gem_object_release(&rk_obj->base);
+       kfree(rk_obj);
+}
+
 struct rockchip_gem_object *
 rockchip_gem_create_object(struct drm_device *drm, unsigned int size,
                           bool alloc_kmap)
@@ -331,7 +337,7 @@ rockchip_gem_create_object(struct drm_device *drm, unsigned int size,
        return rk_obj;
 
 err_free_rk_obj:
-       kfree(rk_obj);
+       rockchip_gem_release_object(rk_obj);
        return ERR_PTR(ret);
 }
 
@@ -345,8 +351,6 @@ void rockchip_gem_free_object(struct drm_gem_object *obj)
        struct rockchip_drm_private *private = drm->dev_private;
        struct rockchip_gem_object *rk_obj = to_rockchip_obj(obj);
 
-       drm_gem_free_mmap_offset(obj);
-
        if (obj->import_attach) {
                if (private->domain) {
                        rockchip_gem_iommu_unmap(rk_obj);
@@ -363,7 +367,7 @@ void rockchip_gem_free_object(struct drm_gem_object *obj)
        drm_fence_signal_and_put(&rk_obj->acquire_fence);
 #endif
 
-       kfree(rk_obj);
+       rockchip_gem_release_object(rk_obj);
 }
 
 /*
@@ -806,7 +810,7 @@ rockchip_gem_prime_import_sg_table(struct drm_device *drm,
        return &rk_obj->base;
 
 err_free_rk_obj:
-       kfree(rk_obj);
+       rockchip_gem_release_object(rk_obj);
        return ERR_PTR(ret);
 }