drm/i915/ttm: fix uaf with lmem_userfault_list handling
authorMatthew Auld <matthew.auld@intel.com>
Mon, 7 Nov 2022 16:54:13 +0000 (16:54 +0000)
committerTvrtko Ursulin <tvrtko.ursulin@intel.com>
Mon, 14 Nov 2022 09:46:06 +0000 (09:46 +0000)
In the fault handler, make sure we check if the BO maps lmem after
we schedule the migration, since the current resource might change from
lmem to smem, if the pages are in the non-cpu visible portion of lmem.
This then leads to adding the object to the lmem_userfault_list even
though the current resource is no longer lmem. If we then destroy the
object, the list might still contain a link to the now free object, since
we only remove it if the object is still in lmem.

Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/7469
Fixes: ad74457a6b5a ("drm/i915/dgfx: Release mmap on rpm suspend")
Signed-off-by: Matthew Auld <matthew.auld@intel.com>
Cc: Anshuman Gupta <anshuman.gupta@intel.com>
Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Cc: Andrzej Hajda <andrzej.hajda@intel.com>
Cc: Nirmoy Das <nirmoy.das@intel.com>
Reviewed-by: Andrzej Hajda <andrzej.hajda@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20221107165414.56970-1-matthew.auld@intel.com
(cherry picked from commit 625b74460ec0978979f883fbee117e1b97e6e35e)
Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
drivers/gpu/drm/i915/gem/i915_gem_ttm.c

index a4aa9500fa179f2c8ff9cf857703e085aea54ba1..3d4305eea1aa29a21ac7140889ede5c3e510770d 100644 (file)
@@ -1013,9 +1013,6 @@ static vm_fault_t vm_fault_ttm(struct vm_fault *vmf)
                return VM_FAULT_SIGBUS;
        }
 
-       if (i915_ttm_cpu_maps_iomem(bo->resource))
-               wakeref = intel_runtime_pm_get(&to_i915(obj->base.dev)->runtime_pm);
-
        if (!i915_ttm_resource_mappable(bo->resource)) {
                int err = -ENODEV;
                int i;
@@ -1042,6 +1039,9 @@ static vm_fault_t vm_fault_ttm(struct vm_fault *vmf)
                }
        }
 
+       if (i915_ttm_cpu_maps_iomem(bo->resource))
+               wakeref = intel_runtime_pm_get(&to_i915(obj->base.dev)->runtime_pm);
+
        if (drm_dev_enter(dev, &idx)) {
                ret = ttm_bo_vm_fault_reserved(vmf, vmf->vma->vm_page_prot,
                                               TTM_BO_VM_NUM_PREFAULT);