drm/i915: Convert the file mutex into a spinlock
authorChris Wilson <chris@chris-wilson.co.uk>
Sun, 26 Sep 2010 10:03:27 +0000 (11:03 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Sun, 26 Sep 2010 10:03:27 +0000 (11:03 +0100)
Daniel Vetter pointed out that in this case is would be clearer and
cleaner to use a spinlock instead of a mutex to protect the per-file
request list manipulation. Make it so.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
drivers/gpu/drm/i915/i915_dma.c
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/i915_gem.c

index ba050ed..b752c31 100644 (file)
@@ -2173,8 +2173,8 @@ int i915_driver_open(struct drm_device *dev, struct drm_file *file)
 
        file->driver_priv = file_priv;
 
+       spin_lock_init(&file_priv->mm.lock);
        INIT_LIST_HEAD(&file_priv->mm.request_list);
-       mutex_init(&file_priv->mutex);
 
        return 0;
 }
index f2ff258..710d59e 100644 (file)
@@ -851,8 +851,8 @@ struct drm_i915_gem_request {
 };
 
 struct drm_i915_file_private {
-       struct mutex mutex;
        struct {
+               struct spinlock lock;
                struct list_head request_list;
        } mm;
 };
index ac5bff8..78282ed 100644 (file)
@@ -1694,11 +1694,11 @@ i915_add_request(struct drm_device *dev,
        list_add_tail(&request->list, &ring->request_list);
 
        if (file_priv) {
-               mutex_lock(&file_priv->mutex);
+               spin_lock(&file_priv->mm.lock);
                request->file_priv = file_priv;
                list_add_tail(&request->client_list,
                              &file_priv->mm.request_list);
-               mutex_unlock(&file_priv->mutex);
+               spin_unlock(&file_priv->mm.lock);
        }
 
        if (!dev_priv->mm.suspended) {
@@ -1733,11 +1733,15 @@ i915_retire_commands(struct drm_device *dev, struct intel_ring_buffer *ring)
 static inline void
 i915_gem_request_remove_from_client(struct drm_i915_gem_request *request)
 {
-       if (request->file_priv) {
-               mutex_lock(&request->file_priv->mutex);
-               list_del(&request->client_list);
-               mutex_unlock(&request->file_priv->mutex);
-       }
+       struct drm_i915_file_private *file_priv = request->file_priv;
+
+       if (!file_priv)
+               return;
+
+       spin_lock(&file_priv->mm.lock);
+       list_del(&request->client_list);
+       request->file_priv = NULL;
+       spin_unlock(&file_priv->mm.lock);
 }
 
 static void i915_gem_reset_ring_lists(struct drm_i915_private *dev_priv,
@@ -3464,7 +3468,7 @@ i915_gem_ring_throttle(struct drm_device *dev, struct drm_file *file)
        u32 seqno = 0;
        int ret;
 
-       mutex_lock(&file_priv->mutex);
+       spin_lock(&file_priv->mm.lock);
        list_for_each_entry(request, &file_priv->mm.request_list, client_list) {
                if (time_after_eq(request->emitted_jiffies, recent_enough))
                        break;
@@ -3472,7 +3476,7 @@ i915_gem_ring_throttle(struct drm_device *dev, struct drm_file *file)
                ring = request->ring;
                seqno = request->seqno;
        }
-       mutex_unlock(&file_priv->mutex);
+       spin_unlock(&file_priv->mm.lock);
 
        if (seqno == 0)
                return 0;
@@ -4974,8 +4978,7 @@ void i915_gem_release(struct drm_device *dev, struct drm_file *file)
         * later retire_requests won't dereference our soon-to-be-gone
         * file_priv.
         */
-       mutex_lock(&dev->struct_mutex);
-       mutex_lock(&file_priv->mutex);
+       spin_lock(&file_priv->mm.lock);
        while (!list_empty(&file_priv->mm.request_list)) {
                struct drm_i915_gem_request *request;
 
@@ -4985,8 +4988,7 @@ void i915_gem_release(struct drm_device *dev, struct drm_file *file)
                list_del(&request->client_list);
                request->file_priv = NULL;
        }
-       mutex_unlock(&file_priv->mutex);
-       mutex_unlock(&dev->struct_mutex);
+       spin_unlock(&file_priv->mm.lock);
 }
 
 static int