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

Commit fbdda6fb authored by Chris Wilson's avatar Chris Wilson Committed by Daniel Vetter
Browse files

drm/i915: Guard pages being reaped by OOM whilst binding-to-GTT



In the circumstances that the shrinker is allowed to steal the mutex
in order to reap pages, we need to be careful to prevent it operating on
the current object and shooting ourselves in the foot.

Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent be7cb634
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -2925,6 +2925,8 @@ i915_gem_object_bind_to_gtt(struct drm_i915_gem_object *obj,
	if (ret)
		return ret;

	i915_gem_object_pin_pages(obj);

 search_free:
	if (map_and_fenceable)
		free_space =
@@ -2955,14 +2957,17 @@ i915_gem_object_bind_to_gtt(struct drm_i915_gem_object *obj,
					       obj->cache_level,
					       map_and_fenceable,
					       nonblocking);
		if (ret)
		if (ret) {
			i915_gem_object_unpin_pages(obj);
			return ret;
		}

		goto search_free;
	}
	if (WARN_ON(!i915_gem_valid_gtt_space(dev,
					      obj->gtt_space,
					      obj->cache_level))) {
		i915_gem_object_unpin_pages(obj);
		drm_mm_put_block(obj->gtt_space);
		obj->gtt_space = NULL;
		return -EINVAL;
@@ -2971,6 +2976,7 @@ i915_gem_object_bind_to_gtt(struct drm_i915_gem_object *obj,

	ret = i915_gem_gtt_prepare_object(obj);
	if (ret) {
		i915_gem_object_unpin_pages(obj);
		drm_mm_put_block(obj->gtt_space);
		obj->gtt_space = NULL;
		return ret;
@@ -2993,6 +2999,7 @@ i915_gem_object_bind_to_gtt(struct drm_i915_gem_object *obj,

	obj->map_and_fenceable = mappable && fenceable;

	i915_gem_object_unpin_pages(obj);
	trace_i915_gem_object_bind(obj, map_and_fenceable);
	i915_gem_verify_gtt(dev);
	return 0;