Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1c25595f authored by Chris Wilson's avatar Chris Wilson
Browse files

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: default avatarChris Wilson <chris@chris-wilson.co.uk>
parent 447da187
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -2173,8 +2173,8 @@ int i915_driver_open(struct drm_device *dev, struct drm_file *file)


	file->driver_priv = file_priv;
	file->driver_priv = file_priv;


	spin_lock_init(&file_priv->mm.lock);
	INIT_LIST_HEAD(&file_priv->mm.request_list);
	INIT_LIST_HEAD(&file_priv->mm.request_list);
	mutex_init(&file_priv->mutex);


	return 0;
	return 0;
}
}
+1 −1
Original line number Original line Diff line number Diff line
@@ -851,8 +851,8 @@ struct drm_i915_gem_request {
};
};


struct drm_i915_file_private {
struct drm_i915_file_private {
	struct mutex mutex;
	struct {
	struct {
		struct spinlock lock;
		struct list_head request_list;
		struct list_head request_list;
	} mm;
	} mm;
};
};
+15 −13
Original line number Original line Diff line number Diff line
@@ -1694,11 +1694,11 @@ i915_add_request(struct drm_device *dev,
	list_add_tail(&request->list, &ring->request_list);
	list_add_tail(&request->list, &ring->request_list);


	if (file_priv) {
	if (file_priv) {
		mutex_lock(&file_priv->mutex);
		spin_lock(&file_priv->mm.lock);
		request->file_priv = file_priv;
		request->file_priv = file_priv;
		list_add_tail(&request->client_list,
		list_add_tail(&request->client_list,
			      &file_priv->mm.request_list);
			      &file_priv->mm.request_list);
		mutex_unlock(&file_priv->mutex);
		spin_unlock(&file_priv->mm.lock);
	}
	}


	if (!dev_priv->mm.suspended) {
	if (!dev_priv->mm.suspended) {
@@ -1733,11 +1733,15 @@ i915_retire_commands(struct drm_device *dev, struct intel_ring_buffer *ring)
static inline void
static inline void
i915_gem_request_remove_from_client(struct drm_i915_gem_request *request)
i915_gem_request_remove_from_client(struct drm_i915_gem_request *request)
{
{
	if (request->file_priv) {
	struct drm_i915_file_private *file_priv = request->file_priv;
		mutex_lock(&request->file_priv->mutex);

	if (!file_priv)
		return;

	spin_lock(&file_priv->mm.lock);
	list_del(&request->client_list);
	list_del(&request->client_list);
		mutex_unlock(&request->file_priv->mutex);
	request->file_priv = NULL;
	}
	spin_unlock(&file_priv->mm.lock);
}
}


static void i915_gem_reset_ring_lists(struct drm_i915_private *dev_priv,
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;
	u32 seqno = 0;
	int ret;
	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) {
	list_for_each_entry(request, &file_priv->mm.request_list, client_list) {
		if (time_after_eq(request->emitted_jiffies, recent_enough))
		if (time_after_eq(request->emitted_jiffies, recent_enough))
			break;
			break;
@@ -3472,7 +3476,7 @@ i915_gem_ring_throttle(struct drm_device *dev, struct drm_file *file)
		ring = request->ring;
		ring = request->ring;
		seqno = request->seqno;
		seqno = request->seqno;
	}
	}
	mutex_unlock(&file_priv->mutex);
	spin_unlock(&file_priv->mm.lock);


	if (seqno == 0)
	if (seqno == 0)
		return 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
	 * later retire_requests won't dereference our soon-to-be-gone
	 * file_priv.
	 * file_priv.
	 */
	 */
	mutex_lock(&dev->struct_mutex);
	spin_lock(&file_priv->mm.lock);
	mutex_lock(&file_priv->mutex);
	while (!list_empty(&file_priv->mm.request_list)) {
	while (!list_empty(&file_priv->mm.request_list)) {
		struct drm_i915_gem_request *request;
		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);
		list_del(&request->client_list);
		request->file_priv = NULL;
		request->file_priv = NULL;
	}
	}
	mutex_unlock(&file_priv->mutex);
	spin_unlock(&file_priv->mm.lock);
	mutex_unlock(&dev->struct_mutex);
}
}


static int
static int