drm/vc4: Fix OOPSes from trying to cache a partially constructed BO.
authorEric Anholt <eric@anholt.net>
Thu, 9 Feb 2017 17:23:34 +0000 (09:23 -0800)
committerRaspbian kernel package updater <root@raspbian.org>
Sat, 31 Mar 2018 14:45:35 +0000 (15:45 +0100)
If a CMA allocation failed, the partially constructed BO would be
unreferenced through the normal path, and we might choose to put it in
the BO cache.  If we then reused it before it expired from the cache,
the kernel would OOPS.

Signed-off-by: Eric Anholt <eric@anholt.net>
Fixes: c826a6e10644 ("drm/vc4: Add a BO cache.")
drivers/gpu/drm/vc4/vc4_bo.c

index fd83a28076564b9ea5cf0f2ba29b884ee3c5af43..b5802f7acf6e4a2e084ca9a4f19fee9f77c8df13 100644 (file)
@@ -322,6 +322,14 @@ void vc4_free_object(struct drm_gem_object *gem_bo)
                goto out;
        }
 
+       /* If this object was partially constructed but CMA allocation
+        * had failed, just free it.
+        */
+       if (!bo->base.vaddr) {
+               vc4_bo_destroy(bo);
+               goto out;
+       }
+
        cache_list = vc4_get_cache_list_for_size(dev, gem_bo->size);
        if (!cache_list) {
                vc4_bo_destroy(bo);