diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2012-07-15 07:34:22 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2012-07-25 04:39:57 -0400 |
commit | d3373a241bbf034a1ef43e6417e3d0029c8a8145 (patch) | |
tree | 8e35bc0fb55b1ef69f53ed3f110fbaab4786b72e /drivers/gpu | |
parent | 79158103bf20c9ff55204ceb78a5773f422b03be (diff) |
drm/i915: Flush the context object from the CPU caches upon switching
The issue is that we stale data in the CPU caches, when we come to
swap-out the object, the CPU may short-circuit the reads from those
cacheline and so corrupt the context object.
Secondary, leaving the context object as being marked in the CPU write
domain whilst on the GPU active list is a bad idea and will throw
warnings later.
Note: Thanks to calling set_to_gtt_domain with write = false and not
setting any gpu write domain when putting a context object onto the
active list (when we switch away from it) the set_to_gtt_domain call
won't block.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Ben Widawsky <ben@bwidawsk.net>
[danvet: Added a note to the commit message and a comment in the code
to explain the clever non-blocking trick.]
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu')
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem_context.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c index 18eee8d2522d..65639ad72808 100644 --- a/drivers/gpu/drm/i915/i915_gem_context.c +++ b/drivers/gpu/drm/i915/i915_gem_context.c | |||
@@ -374,6 +374,17 @@ static int do_switch(struct drm_i915_gem_object *from_obj, | |||
374 | if (ret) | 374 | if (ret) |
375 | return ret; | 375 | return ret; |
376 | 376 | ||
377 | /* Clear this page out of any CPU caches for coherent swap-in/out. Note | ||
378 | * that thanks to write = false in this call and us not setting any gpu | ||
379 | * write domains when putting a context object onto the active list | ||
380 | * (when switching away from it), this won't block. | ||
381 | * XXX: We need a real interface to do this instead of trickery. */ | ||
382 | ret = i915_gem_object_set_to_gtt_domain(to->obj, false); | ||
383 | if (ret) { | ||
384 | i915_gem_object_unpin(to->obj); | ||
385 | return ret; | ||
386 | } | ||
387 | |||
377 | if (!to->obj->has_global_gtt_mapping) | 388 | if (!to->obj->has_global_gtt_mapping) |
378 | i915_gem_gtt_bind_object(to->obj, to->obj->cache_level); | 389 | i915_gem_gtt_bind_object(to->obj, to->obj->cache_level); |
379 | 390 | ||