drm/i915: Force CPU relocations if not GTT mapped
Move the decision on whether we need to have a mappable object during execbuffer to the fore and then reuse that decision by propagating the flag through to reservation. As a corollary, before doing the actual relocation through the GTT, we can make sure that we do have a GTT mapping through which to operate. Note that the key to make this work is to ditch the obj->map_and_fenceable unbind optimization - with full ppgtt it doesn't make a lot of sense any more anyway. v2: Revamp and resend to ease future patches. v3: Refresh patch rationale References: https://bugs.freedesktop.org/show_bug.cgi?id=81094 Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Ben Widawsky <benjamin.widawsky@intel.com> Cc: Daniel Vetter <daniel.vetter@ffwll.ch> [danvet: Explain why obj->map_and_fenceable is key and split out the secure batch fix.] Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:

zatwierdzone przez
Daniel Vetter

rodzic
dc8cd1e790
commit
e6a844687c
@@ -2928,9 +2928,8 @@ int i915_vma_unbind(struct i915_vma *vma)
|
||||
vma->unbind_vma(vma);
|
||||
|
||||
list_del_init(&vma->mm_list);
|
||||
/* Avoid an unnecessary call to unbind on rebind. */
|
||||
if (i915_is_ggtt(vma->vm))
|
||||
obj->map_and_fenceable = true;
|
||||
obj->map_and_fenceable = false;
|
||||
|
||||
drm_mm_remove_node(&vma->node);
|
||||
i915_gem_vma_destroy(vma);
|
||||
@@ -3282,6 +3281,9 @@ i915_gem_object_get_fence(struct drm_i915_gem_object *obj)
|
||||
return 0;
|
||||
}
|
||||
} else if (enable) {
|
||||
if (WARN_ON(!obj->map_and_fenceable))
|
||||
return -EINVAL;
|
||||
|
||||
reg = i915_find_fence_reg(dev);
|
||||
if (IS_ERR(reg))
|
||||
return PTR_ERR(reg);
|
||||
@@ -4331,8 +4333,6 @@ void i915_gem_object_init(struct drm_i915_gem_object *obj,
|
||||
|
||||
obj->fence_reg = I915_FENCE_REG_NONE;
|
||||
obj->madv = I915_MADV_WILLNEED;
|
||||
/* Avoid an unnecessary call to unbind on the first bind. */
|
||||
obj->map_and_fenceable = true;
|
||||
|
||||
i915_gem_info_add_obj(obj->base.dev->dev_private, obj->base.size);
|
||||
}
|
||||
|
Reference in New Issue
Block a user