@@ -2644,7 +2644,7 @@ i915_gem_object_unbind(struct drm_i915_gem_object *obj,
trace_i915_gem_object_unbind(obj, vm);
- if (obj->has_global_gtt_mapping)
+ if (obj->has_global_gtt_mapping && is_i915_ggtt(vm))
i915_gem_gtt_unbind_object(obj);
if (obj->has_aliasing_ppgtt_mapping) {
i915_ppgtt_unbind_object(dev_priv->gtt.aliasing_ppgtt, obj);
@@ -2655,7 +2655,8 @@ i915_gem_object_unbind(struct drm_i915_gem_object *obj,
list_del(&obj->mm_list);
/* Avoid an unnecessary call to unbind on rebind. */
- obj->map_and_fenceable = true;
+ if (is_i915_ggtt(vm))
+ obj->map_and_fenceable = true;
vma = i915_gem_obj_to_vma(obj, vm);
list_del(&vma->vma_link);
@@ -3223,7 +3224,9 @@ search_free:
is_i915_ggtt(vm) &&
vma->node.start + obj->base.size <= dev_priv->gtt.mappable_end;
- obj->map_and_fenceable = mappable && fenceable;
+ /* Map and fenceable only changes if the VM is the global GGTT */
+ if (is_i915_ggtt(vm))
+ obj->map_and_fenceable = mappable && fenceable;
trace_i915_gem_object_bind(obj, vm, map_and_fenceable);
i915_gem_verify_gtt(dev);
This commit is split out because it's a bit tricky (or at least it was for me). It could very well be squashed in to the previous commits. The map_and_fenceable tracking is per object. Map_and_fenceable however only makes sense in the context of the global gtt. As such, VMAs created for any other address space should ever modify these flags. Signed-off-by: Ben Widawsky <ben@bwidawsk.net> --- drivers/gpu/drm/i915/i915_gem.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)