aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2017-12-12 13:06:51 -0500
committerChris Wilson <chris@chris-wilson.co.uk>2017-12-13 08:17:44 -0500
commit2abe2f844645402e5d47012a04839d1c5cbffd0d (patch)
tree5d36295e28ae863e1e6cd3a014cb953d971a3fb3
parente30a7581bfc2d5619fed03ec7321c9e4ffb7e36f (diff)
drm/i915: Allow fence allocations to fail
If a fence allocation fails in a blocking context, we will sleep on the fence as a last resort. We can therefore allow ourselves to fail and sleep on the fence instead of triggering a system-wide oom. This allows us to throttle malicious clients that are consuming lots of system resources by capping the amount of memory used by fences. Testcase: igt/gem_shrink/execbufX Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20171212180652.22061-2-chris@chris-wilson.co.uk
-rw-r--r--drivers/gpu/drm/i915/i915_gem_clflush.c2
-rw-r--r--drivers/gpu/drm/i915/i915_gem_context.c2
-rw-r--r--drivers/gpu/drm/i915/i915_gem_request.c6
-rw-r--r--drivers/gpu/drm/i915/i915_gem_request.h2
4 files changed, 7 insertions, 5 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem_clflush.c b/drivers/gpu/drm/i915/i915_gem_clflush.c
index f663cd919795..b9b53ac14176 100644
--- a/drivers/gpu/drm/i915/i915_gem_clflush.c
+++ b/drivers/gpu/drm/i915/i915_gem_clflush.c
@@ -167,7 +167,7 @@ bool i915_gem_clflush_object(struct drm_i915_gem_object *obj,
167 i915_sw_fence_await_reservation(&clflush->wait, 167 i915_sw_fence_await_reservation(&clflush->wait,
168 obj->resv, NULL, 168 obj->resv, NULL,
169 true, I915_FENCE_TIMEOUT, 169 true, I915_FENCE_TIMEOUT,
170 GFP_KERNEL); 170 I915_FENCE_GFP);
171 171
172 reservation_object_lock(obj->resv, NULL); 172 reservation_object_lock(obj->resv, NULL);
173 reservation_object_add_excl_fence(obj->resv, &clflush->dma); 173 reservation_object_add_excl_fence(obj->resv, &clflush->dma);
diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c
index 21ce374d9924..648e7536ff51 100644
--- a/drivers/gpu/drm/i915/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/i915_gem_context.c
@@ -617,7 +617,7 @@ int i915_gem_switch_to_kernel_context(struct drm_i915_private *dev_priv)
617 if (prev) 617 if (prev)
618 i915_sw_fence_await_sw_fence_gfp(&req->submit, 618 i915_sw_fence_await_sw_fence_gfp(&req->submit,
619 &prev->submit, 619 &prev->submit,
620 GFP_KERNEL); 620 I915_FENCE_GFP);
621 } 621 }
622 622
623 /* 623 /*
diff --git a/drivers/gpu/drm/i915/i915_gem_request.c b/drivers/gpu/drm/i915/i915_gem_request.c
index c28a4ceb016d..4d5e2b714382 100644
--- a/drivers/gpu/drm/i915/i915_gem_request.c
+++ b/drivers/gpu/drm/i915/i915_gem_request.c
@@ -782,7 +782,7 @@ i915_gem_request_await_request(struct drm_i915_gem_request *to,
782 if (to->engine == from->engine) { 782 if (to->engine == from->engine) {
783 ret = i915_sw_fence_await_sw_fence_gfp(&to->submit, 783 ret = i915_sw_fence_await_sw_fence_gfp(&to->submit,
784 &from->submit, 784 &from->submit,
785 GFP_KERNEL); 785 I915_FENCE_GFP);
786 return ret < 0 ? ret : 0; 786 return ret < 0 ? ret : 0;
787 } 787 }
788 788
@@ -810,7 +810,7 @@ i915_gem_request_await_request(struct drm_i915_gem_request *to,
810await_dma_fence: 810await_dma_fence:
811 ret = i915_sw_fence_await_dma_fence(&to->submit, 811 ret = i915_sw_fence_await_dma_fence(&to->submit,
812 &from->fence, 0, 812 &from->fence, 0,
813 GFP_KERNEL); 813 I915_FENCE_GFP);
814 return ret < 0 ? ret : 0; 814 return ret < 0 ? ret : 0;
815} 815}
816 816
@@ -861,7 +861,7 @@ i915_gem_request_await_dma_fence(struct drm_i915_gem_request *req,
861 else 861 else
862 ret = i915_sw_fence_await_dma_fence(&req->submit, fence, 862 ret = i915_sw_fence_await_dma_fence(&req->submit, fence,
863 I915_FENCE_TIMEOUT, 863 I915_FENCE_TIMEOUT,
864 GFP_KERNEL); 864 I915_FENCE_GFP);
865 if (ret < 0) 865 if (ret < 0)
866 return ret; 866 return ret;
867 867
diff --git a/drivers/gpu/drm/i915/i915_gem_request.h b/drivers/gpu/drm/i915/i915_gem_request.h
index 26249f39de67..0d6d39f19506 100644
--- a/drivers/gpu/drm/i915/i915_gem_request.h
+++ b/drivers/gpu/drm/i915/i915_gem_request.h
@@ -204,6 +204,8 @@ struct drm_i915_gem_request {
204 struct list_head client_link; 204 struct list_head client_link;
205}; 205};
206 206
207#define I915_FENCE_GFP (GFP_KERNEL | __GFP_RETRY_MAYFAIL | __GFP_NOWARN)
208
207extern const struct dma_fence_ops i915_fence_ops; 209extern const struct dma_fence_ops i915_fence_ops;
208 210
209static inline bool dma_fence_is_i915(const struct dma_fence *fence) 211static inline bool dma_fence_is_i915(const struct dma_fence *fence)