... other mutation of the handle idr is still serialised using spin
locks.

Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>
---
 drivers/gpu/drm/drm_gem.c |   20 ++++++++------------
 1 files changed, 8 insertions(+), 12 deletions(-)

diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c
index ea1c4b0..ce63a14 100644
--- a/drivers/gpu/drm/drm_gem.c
+++ b/drivers/gpu/drm/drm_gem.c
@@ -184,7 +184,6 @@ EXPORT_SYMBOL(drm_gem_object_alloc);
 static int
 drm_gem_handle_delete(struct drm_file *filp, u32 handle)
 {
-       struct drm_device *dev;
        struct drm_gem_object *obj;
 
        /* This is gross. The idr system doesn't let us try a delete and
@@ -204,12 +203,13 @@ drm_gem_handle_delete(struct drm_file *filp, u32 handle)
                spin_unlock(&filp->table_lock);
                return -EINVAL;
        }
-       dev = obj->dev;
 
        /* Release reference and decrement refcount. */
        idr_remove(&filp->object_idr, handle);
        spin_unlock(&filp->table_lock);
 
+       synchronize_rcu();
+
        drm_gem_object_handle_unreference_unlocked(obj);
 
        return 0;
@@ -257,18 +257,14 @@ drm_gem_object_lookup(struct drm_device *dev, struct 
drm_file *filp,
 {
        struct drm_gem_object *obj;
 
-       spin_lock(&filp->table_lock);
+       rcu_read_lock();
 
        /* Check if we currently have a reference on the object */
        obj = idr_find(&filp->object_idr, handle);
-       if (obj == NULL) {
-               spin_unlock(&filp->table_lock);
-               return NULL;
-       }
-
-       drm_gem_object_reference(obj);
+       if (obj)
+               drm_gem_object_reference(obj);
 
-       spin_unlock(&filp->table_lock);
+       rcu_read_unlock();
 
        return obj;
 }
@@ -363,11 +359,11 @@ drm_gem_open_ioctl(struct drm_device *dev, void *data,
        if (!(dev->driver->driver_features & DRIVER_GEM))
                return -ENODEV;
 
-       spin_lock(&dev->object_name_lock);
+       rcu_read_lock();
        obj = idr_find(&dev->object_name_idr, (int) args->name);
        if (obj)
                drm_gem_object_reference(obj);
-       spin_unlock(&dev->object_name_lock);
+       rcu_read_unlock();
        if (!obj)
                return -ENOENT;
 
-- 
1.7.2.3

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to