diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2017-12-12 13:06:51 -0500 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2017-12-13 08:17:44 -0500 |
commit | 2abe2f844645402e5d47012a04839d1c5cbffd0d (patch) | |
tree | 5d36295e28ae863e1e6cd3a014cb953d971a3fb3 | |
parent | e30a7581bfc2d5619fed03ec7321c9e4ffb7e36f (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.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem_context.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem_request.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem_request.h | 2 |
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, | |||
810 | await_dma_fence: | 810 | await_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 | |||
207 | extern const struct dma_fence_ops i915_fence_ops; | 209 | extern const struct dma_fence_ops i915_fence_ops; |
208 | 210 | ||
209 | static inline bool dma_fence_is_i915(const struct dma_fence *fence) | 211 | static inline bool dma_fence_is_i915(const struct dma_fence *fence) |