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 at bwidawsk.net> --- drivers/gpu/drm/i915/i915_gem.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 8fe5f4e..83e2eb3 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -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); -- 1.8.3.1