drm/radeon: make lockup timeout a module param
[firefly-linux-kernel-4.4.55.git] / drivers / gpu / drm / drm_gem.c
index 0ef358e5324542a6be54751527e889c8eb8f3eca..fc6ded8f318b6d6242ce3ebe2a30dec71dc6e627 100644 (file)
@@ -35,6 +35,7 @@
 #include <linux/mman.h>
 #include <linux/pagemap.h>
 #include <linux/shmem_fs.h>
+#include <linux/dma-buf.h>
 #include "drmP.h"
 
 /** @file drm_gem.c
@@ -232,6 +233,10 @@ drm_gem_handle_delete(struct drm_file *filp, u32 handle)
        idr_remove(&filp->object_idr, handle);
        spin_unlock(&filp->table_lock);
 
+       if (obj->import_attach)
+               drm_prime_remove_imported_buf_handle(&filp->prime,
+                               obj->import_attach->dmabuf);
+
        if (dev->driver->gem_close_object)
                dev->driver->gem_close_object(obj, filp);
        drm_gem_object_handle_unreference_unlocked(obj);
@@ -267,8 +272,7 @@ again:
        spin_unlock(&file_priv->table_lock);
        if (ret == -EAGAIN)
                goto again;
-
-       if (ret != 0)
+       else if (ret)
                return ret;
 
        drm_gem_object_handle_reference(obj);
@@ -451,8 +455,7 @@ again:
 
                if (ret == -EAGAIN)
                        goto again;
-
-               if (ret != 0)
+               else if (ret)
                        goto err;
 
                /* Allocate a reference for the name table.  */
@@ -527,6 +530,10 @@ drm_gem_object_release_handle(int id, void *ptr, void *data)
        struct drm_gem_object *obj = ptr;
        struct drm_device *dev = obj->dev;
 
+       if (obj->import_attach)
+               drm_prime_remove_imported_buf_handle(&file_priv->prime,
+                               obj->import_attach->dmabuf);
+
        if (dev->driver->gem_close_object)
                dev->driver->gem_close_object(obj, file_priv);