Skip to content

Commit 945657b

Browse files
committed
drm/i915/evict: Always switch away from the current context
Currently execlists is exempt from emitting a request to switch each ring away from the current context over to the dev_priv->kernel_context (for whatever reason, just under execlists the GGTT is unlikely to be as fragmented, however the switch may help in some extreme cases). Extract the switcher and enable it for execlsts as well, as we need to do so in a later patch to force the context switch before suspend. (And since for that switch we explicitly require the disposable kernel context, rename the extracted function.) Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Mika Kuoppala <mika.kuoppala@intel.com> Reviewed-by: Mika Kuoppala <mika.kuoppala@intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/1468590980-6186-1-git-send-email-chris@chris-wilson.co.uk
1 parent 6bc2654 commit 945657b

File tree

3 files changed

+32
-33
lines changed

3 files changed

+32
-33
lines changed

drivers/gpu/drm/i915/i915_drv.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3525,6 +3525,7 @@ void i915_gem_context_reset(struct drm_device *dev);
35253525
int i915_gem_context_open(struct drm_device *dev, struct drm_file *file);
35263526
void i915_gem_context_close(struct drm_device *dev, struct drm_file *file);
35273527
int i915_switch_context(struct drm_i915_gem_request *req);
3528+
int i915_gem_switch_to_kernel_context(struct drm_i915_private *dev_priv);
35283529
void i915_gem_context_free(struct kref *ctx_ref);
35293530
struct drm_i915_gem_object *
35303531
i915_gem_alloc_context_obj(struct drm_device *dev, size_t size);

drivers/gpu/drm/i915/i915_gem_context.c

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -926,6 +926,35 @@ int i915_switch_context(struct drm_i915_gem_request *req)
926926
return do_rcs_switch(req);
927927
}
928928

929+
int i915_gem_switch_to_kernel_context(struct drm_i915_private *dev_priv)
930+
{
931+
struct intel_engine_cs *engine;
932+
933+
for_each_engine(engine, dev_priv) {
934+
struct drm_i915_gem_request *req;
935+
int ret;
936+
937+
if (engine->last_context == NULL)
938+
continue;
939+
940+
if (engine->last_context == dev_priv->kernel_context)
941+
continue;
942+
943+
req = i915_gem_request_alloc(engine, dev_priv->kernel_context);
944+
if (IS_ERR(req))
945+
return PTR_ERR(req);
946+
947+
ret = 0;
948+
if (!i915.enable_execlists)
949+
ret = i915_switch_context(req);
950+
i915_add_request_no_flush(req);
951+
if (ret)
952+
return ret;
953+
}
954+
955+
return 0;
956+
}
957+
929958
static bool contexts_enabled(struct drm_device *dev)
930959
{
931960
return i915.enable_execlists || to_i915(dev)->hw_context_size;

drivers/gpu/drm/i915/i915_gem_evict.c

Lines changed: 2 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -33,37 +33,6 @@
3333
#include "intel_drv.h"
3434
#include "i915_trace.h"
3535

36-
static int switch_to_pinned_context(struct drm_i915_private *dev_priv)
37-
{
38-
struct intel_engine_cs *engine;
39-
40-
if (i915.enable_execlists)
41-
return 0;
42-
43-
for_each_engine(engine, dev_priv) {
44-
struct drm_i915_gem_request *req;
45-
int ret;
46-
47-
if (engine->last_context == NULL)
48-
continue;
49-
50-
if (engine->last_context == dev_priv->kernel_context)
51-
continue;
52-
53-
req = i915_gem_request_alloc(engine, dev_priv->kernel_context);
54-
if (IS_ERR(req))
55-
return PTR_ERR(req);
56-
57-
ret = i915_switch_context(req);
58-
i915_add_request_no_flush(req);
59-
if (ret)
60-
return ret;
61-
}
62-
63-
return 0;
64-
}
65-
66-
6736
static bool
6837
mark_free(struct i915_vma *vma, struct list_head *unwind)
6938
{
@@ -184,7 +153,7 @@ i915_gem_evict_something(struct drm_device *dev, struct i915_address_space *vm,
184153
struct drm_i915_private *dev_priv = to_i915(dev);
185154

186155
if (i915_is_ggtt(vm)) {
187-
ret = switch_to_pinned_context(dev_priv);
156+
ret = i915_gem_switch_to_kernel_context(dev_priv);
188157
if (ret)
189158
return ret;
190159
}
@@ -303,7 +272,7 @@ int i915_gem_evict_vm(struct i915_address_space *vm, bool do_idle)
303272
struct drm_i915_private *dev_priv = to_i915(vm->dev);
304273

305274
if (i915_is_ggtt(vm)) {
306-
ret = switch_to_pinned_context(dev_priv);
275+
ret = i915_gem_switch_to_kernel_context(dev_priv);
307276
if (ret)
308277
return ret;
309278
}

0 commit comments

Comments
 (0)