drm/i915: Convert the file mutex into a spinlock
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>
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
index ba050ed..b752c31 100644
--- a/drivers/gpu/drm/i915/i915_dma.c
+++ b/drivers/gpu/drm/i915/i915_dma.c
@@ -2173,8 +2173,8 @@
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;
}
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index f2ff258..710d59e 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -851,8 +851,8 @@
};
struct drm_i915_file_private {
- struct mutex mutex;
struct {
+ struct spinlock lock;
struct list_head request_list;
} mm;
};
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index ac5bff8..78282ed 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -1694,11 +1694,11 @@
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 @@
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 @@
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 @@
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 @@
* 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 @@
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