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

Commit ea746f36 authored by Chris Wilson's avatar Chris Wilson
Browse files

drm/i915: Expand bool interruptible to pass flags to i915_wait_request()



We need finer control over wakeup behaviour during i915_wait_request(),
so expand the current bool interruptible to a bitmask.

Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: default avatarJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20160909131201.16673-9-chris@chris-wilson.co.uk
parent 2c7487a5
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -4794,7 +4794,7 @@ i915_drop_caches_set(void *data, u64 val)
		return ret;

	if (val & DROP_ACTIVE) {
		ret = i915_gem_wait_for_idle(dev_priv, true);
		ret = i915_gem_wait_for_idle(dev_priv, I915_WAIT_INTERRUPTIBLE);
		if (ret)
			goto unlock;
	}
+1 −1
Original line number Diff line number Diff line
@@ -3270,7 +3270,7 @@ int __must_check i915_gem_init_hw(struct drm_device *dev);
void i915_gem_init_swizzling(struct drm_device *dev);
void i915_gem_cleanup_engines(struct drm_device *dev);
int __must_check i915_gem_wait_for_idle(struct drm_i915_private *dev_priv,
					bool interruptible);
					unsigned int flags);
int __must_check i915_gem_suspend(struct drm_device *dev);
void i915_gem_resume(struct drm_device *dev);
int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf);
+9 −7
Original line number Diff line number Diff line
@@ -386,7 +386,8 @@ __unsafe_wait_rendering(struct drm_i915_gem_object *obj,
		int ret;

		ret = i915_gem_active_wait_unlocked(&active[idx],
						    true, NULL, rps);
						    I915_WAIT_INTERRUPTIBLE,
						    NULL, rps);
		if (ret)
			return ret;
	}
@@ -2026,7 +2027,7 @@ static int i915_gem_object_create_mmap_offset(struct drm_i915_gem_object *obj)
	 * to claim that space for ourselves, we need to take the big
	 * struct_mutex to free the requests+objects and allocate our slot.
	 */
	err = i915_gem_wait_for_idle(dev_priv, true);
	err = i915_gem_wait_for_idle(dev_priv, I915_WAIT_INTERRUPTIBLE);
	if (err)
		return err;

@@ -2779,7 +2780,8 @@ i915_gem_wait_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
	active = __I915_BO_ACTIVE(obj);
	for_each_active(active, idx) {
		s64 *timeout = args->timeout_ns >= 0 ? &args->timeout_ns : NULL;
		ret = i915_gem_active_wait_unlocked(&obj->last_read[idx], true,
		ret = i915_gem_active_wait_unlocked(&obj->last_read[idx],
						    I915_WAIT_INTERRUPTIBLE,
						    timeout, rps);
		if (ret)
			break;
@@ -2982,7 +2984,7 @@ int i915_vma_unbind(struct i915_vma *vma)
}

int i915_gem_wait_for_idle(struct drm_i915_private *dev_priv,
			   bool interruptible)
			   unsigned int flags)
{
	struct intel_engine_cs *engine;
	int ret;
@@ -2991,7 +2993,7 @@ int i915_gem_wait_for_idle(struct drm_i915_private *dev_priv,
		if (engine->last_context == NULL)
			continue;

		ret = intel_engine_idle(engine, interruptible);
		ret = intel_engine_idle(engine, flags);
		if (ret)
			return ret;
	}
@@ -3746,7 +3748,7 @@ i915_gem_ring_throttle(struct drm_device *dev, struct drm_file *file)
	if (target == NULL)
		return 0;

	ret = i915_wait_request(target, true, NULL, NULL);
	ret = i915_wait_request(target, I915_WAIT_INTERRUPTIBLE, NULL, NULL);
	i915_gem_request_put(target);

	return ret;
@@ -4302,7 +4304,7 @@ int i915_gem_suspend(struct drm_device *dev)
	if (ret)
		goto err;

	ret = i915_gem_wait_for_idle(dev_priv, true);
	ret = i915_gem_wait_for_idle(dev_priv, I915_WAIT_INTERRUPTIBLE);
	if (ret)
		goto err;

+2 −2
Original line number Diff line number Diff line
@@ -170,7 +170,7 @@ i915_gem_evict_something(struct i915_address_space *vm,
	if (ret)
		return ret;

	ret = i915_gem_wait_for_idle(dev_priv, true);
	ret = i915_gem_wait_for_idle(dev_priv, I915_WAIT_INTERRUPTIBLE);
	if (ret)
		return ret;

@@ -275,7 +275,7 @@ int i915_gem_evict_vm(struct i915_address_space *vm, bool do_idle)
				return ret;
		}

		ret = i915_gem_wait_for_idle(dev_priv, true);
		ret = i915_gem_wait_for_idle(dev_priv, I915_WAIT_INTERRUPTIBLE);
		if (ret)
			return ret;

+1 −1
Original line number Diff line number Diff line
@@ -2683,7 +2683,7 @@ void i915_gem_gtt_finish_object(struct drm_i915_gem_object *obj)
	struct i915_ggtt *ggtt = &dev_priv->ggtt;

	if (unlikely(ggtt->do_idle_maps)) {
		if (i915_gem_wait_for_idle(dev_priv, false)) {
		if (i915_gem_wait_for_idle(dev_priv, 0)) {
			DRM_ERROR("Failed to wait for idle; VT'd may hang.\n");
			/* Wait a bit, in hopes it avoids the hang */
			udelay(10);
Loading