mirror of
https://github.com/torvalds/linux
synced 2024-11-05 18:23:50 +00:00
drm/i915: Pin the object whilst faulting it in
In order to prevent reaping of the object whilst setting it up to handle the pagefault, we need to mark it as pinned. This has the nice side-effect of eliminating some special cases from the pagefault handler as well! Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
parent
fbdda6fb5e
commit
c9839303d1
1 changed files with 10 additions and 21 deletions
|
@ -1345,30 +1345,17 @@ int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
|
|||
trace_i915_gem_object_fault(obj, page_offset, true, write);
|
||||
|
||||
/* Now bind it into the GTT if needed */
|
||||
if (!obj->map_and_fenceable) {
|
||||
ret = i915_gem_object_unbind(obj);
|
||||
if (ret)
|
||||
goto unlock;
|
||||
}
|
||||
if (!obj->gtt_space) {
|
||||
ret = i915_gem_object_bind_to_gtt(obj, 0, true, false);
|
||||
if (ret)
|
||||
goto unlock;
|
||||
|
||||
ret = i915_gem_object_set_to_gtt_domain(obj, write);
|
||||
if (ret)
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
if (!obj->has_global_gtt_mapping)
|
||||
i915_gem_gtt_bind_object(obj, obj->cache_level);
|
||||
|
||||
ret = i915_gem_object_get_fence(obj);
|
||||
ret = i915_gem_object_pin(obj, 0, true, false);
|
||||
if (ret)
|
||||
goto unlock;
|
||||
|
||||
if (i915_gem_object_is_inactive(obj))
|
||||
list_move_tail(&obj->mm_list, &dev_priv->mm.inactive_list);
|
||||
ret = i915_gem_object_set_to_gtt_domain(obj, write);
|
||||
if (ret)
|
||||
goto unpin;
|
||||
|
||||
ret = i915_gem_object_get_fence(obj);
|
||||
if (ret)
|
||||
goto unpin;
|
||||
|
||||
obj->fault_mappable = true;
|
||||
|
||||
|
@ -1377,6 +1364,8 @@ int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
|
|||
|
||||
/* Finally, remap it using the new GTT offset */
|
||||
ret = vm_insert_pfn(vma, (unsigned long)vmf->virtual_address, pfn);
|
||||
unpin:
|
||||
i915_gem_object_unpin(obj);
|
||||
unlock:
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
out:
|
||||
|
|
Loading…
Reference in a new issue