Commit 2abe2f84 authored by Chris Wilson's avatar Chris Wilson

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: default avatarChris Wilson <chris@chris-wilson.co.uk>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Reviewed-by: default avatarJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20171212180652.22061-2-chris@chris-wilson.co.uk
parent e30a7581
...@@ -167,7 +167,7 @@ bool i915_gem_clflush_object(struct drm_i915_gem_object *obj, ...@@ -167,7 +167,7 @@ bool i915_gem_clflush_object(struct drm_i915_gem_object *obj,
i915_sw_fence_await_reservation(&clflush->wait, i915_sw_fence_await_reservation(&clflush->wait,
obj->resv, NULL, obj->resv, NULL,
true, I915_FENCE_TIMEOUT, true, I915_FENCE_TIMEOUT,
GFP_KERNEL); I915_FENCE_GFP);
reservation_object_lock(obj->resv, NULL); reservation_object_lock(obj->resv, NULL);
reservation_object_add_excl_fence(obj->resv, &clflush->dma); reservation_object_add_excl_fence(obj->resv, &clflush->dma);
......
...@@ -617,7 +617,7 @@ int i915_gem_switch_to_kernel_context(struct drm_i915_private *dev_priv) ...@@ -617,7 +617,7 @@ int i915_gem_switch_to_kernel_context(struct drm_i915_private *dev_priv)
if (prev) if (prev)
i915_sw_fence_await_sw_fence_gfp(&req->submit, i915_sw_fence_await_sw_fence_gfp(&req->submit,
&prev->submit, &prev->submit,
GFP_KERNEL); I915_FENCE_GFP);
} }
/* /*
......
...@@ -782,7 +782,7 @@ i915_gem_request_await_request(struct drm_i915_gem_request *to, ...@@ -782,7 +782,7 @@ i915_gem_request_await_request(struct drm_i915_gem_request *to,
if (to->engine == from->engine) { if (to->engine == from->engine) {
ret = i915_sw_fence_await_sw_fence_gfp(&to->submit, ret = i915_sw_fence_await_sw_fence_gfp(&to->submit,
&from->submit, &from->submit,
GFP_KERNEL); I915_FENCE_GFP);
return ret < 0 ? ret : 0; return ret < 0 ? ret : 0;
} }
...@@ -810,7 +810,7 @@ i915_gem_request_await_request(struct drm_i915_gem_request *to, ...@@ -810,7 +810,7 @@ i915_gem_request_await_request(struct drm_i915_gem_request *to,
await_dma_fence: await_dma_fence:
ret = i915_sw_fence_await_dma_fence(&to->submit, ret = i915_sw_fence_await_dma_fence(&to->submit,
&from->fence, 0, &from->fence, 0,
GFP_KERNEL); I915_FENCE_GFP);
return ret < 0 ? ret : 0; return ret < 0 ? ret : 0;
} }
...@@ -861,7 +861,7 @@ i915_gem_request_await_dma_fence(struct drm_i915_gem_request *req, ...@@ -861,7 +861,7 @@ i915_gem_request_await_dma_fence(struct drm_i915_gem_request *req,
else else
ret = i915_sw_fence_await_dma_fence(&req->submit, fence, ret = i915_sw_fence_await_dma_fence(&req->submit, fence,
I915_FENCE_TIMEOUT, I915_FENCE_TIMEOUT,
GFP_KERNEL); I915_FENCE_GFP);
if (ret < 0) if (ret < 0)
return ret; return ret;
......
...@@ -204,6 +204,8 @@ struct drm_i915_gem_request { ...@@ -204,6 +204,8 @@ struct drm_i915_gem_request {
struct list_head client_link; struct list_head client_link;
}; };
#define I915_FENCE_GFP (GFP_KERNEL | __GFP_RETRY_MAYFAIL | __GFP_NOWARN)
extern const struct dma_fence_ops i915_fence_ops; extern const struct dma_fence_ops i915_fence_ops;
static inline bool dma_fence_is_i915(const struct dma_fence *fence) static inline bool dma_fence_is_i915(const struct dma_fence *fence)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment