drm/i915: Fix a lockdep warning at error capture
authorNirmoy Das <nirmoy.das@intel.com>
Fri, 24 Jun 2022 11:08:21 +0000 (13:08 +0200)
committerRamalingam C <ramalingam.c@intel.com>
Wed, 29 Jun 2022 09:22:50 +0000 (14:52 +0530)
For some platfroms we use stop_machine version of
gen8_ggtt_insert_page/gen8_ggtt_insert_entries to avoid a
concurrent GGTT access bug but this causes a circular locking
dependency warning:

  Possible unsafe locking scenario:
        CPU0                    CPU1
        ----                    ----
   lock(&ggtt->error_mutex);
                                lock(dma_fence_map);
                                lock(&ggtt->error_mutex);
   lock(cpu_hotplug_lock);

Fix this by calling gen8_ggtt_insert_page/gen8_ggtt_insert_entries
directly at error capture which is concurrent GGTT access safe because
reset path make sure of that.

v2: Fix rebase conflict and added a comment.

Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/5595
Reviewed-by: Gwan-gyeong Mun <gwan-gyeong.mun@intel.com>
Suggested-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Nirmoy Das <nirmoy.das@intel.com>
Reviewed-by: Andrzej Hajda <andrzej.hajda@intel.com>
Signed-off-by: Ramalingam C <ramalingam.c@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220624110821.29190-1-nirmoy.das@intel.com
drivers/gpu/drm/i915/gt/intel_ggtt.c
drivers/gpu/drm/i915/gt/intel_gtt.h
drivers/gpu/drm/i915/gt/uc/intel_uc_fw.c
drivers/gpu/drm/i915/i915_gpu_error.c

index ffff9618031379d658dc7c2e441ca67e7eee6024..15a915bb4088e9e7e5601688791c8c0043e84049 100644 (file)
@@ -960,6 +960,16 @@ static int gen8_gmch_probe(struct i915_ggtt *ggtt)
        if (intel_vm_no_concurrent_access_wa(i915)) {
                ggtt->vm.insert_entries = bxt_vtd_ggtt_insert_entries__BKL;
                ggtt->vm.insert_page    = bxt_vtd_ggtt_insert_page__BKL;
+
+               /*
+                * Calling stop_machine() version of GGTT update function
+                * at error capture/reset path will raise lockdep warning.
+                * Allow calling gen8_ggtt_insert_* directly at reset path
+                * which is safe from parallel GGTT updates.
+                */
+               ggtt->vm.raw_insert_page = gen8_ggtt_insert_page;
+               ggtt->vm.raw_insert_entries = gen8_ggtt_insert_entries;
+
                ggtt->vm.bind_async_flags =
                        I915_VMA_GLOBAL_BIND | I915_VMA_LOCAL_BIND;
        }
index 29fd3a9e8b2e8595142f39be6702dd8e92dabe1d..e639434e97fdb40dcfa2af0b0bb84d2de9ff5617 100644 (file)
@@ -306,6 +306,15 @@ struct i915_address_space {
                               struct i915_vma_resource *vma_res,
                               enum i915_cache_level cache_level,
                               u32 flags);
+       void (*raw_insert_page)(struct i915_address_space *vm,
+                               dma_addr_t addr,
+                               u64 offset,
+                               enum i915_cache_level cache_level,
+                               u32 flags);
+       void (*raw_insert_entries)(struct i915_address_space *vm,
+                                  struct i915_vma_resource *vma_res,
+                                  enum i915_cache_level cache_level,
+                                  u32 flags);
        void (*cleanup)(struct i915_address_space *vm);
 
        void (*foreach)(struct i915_address_space *vm,
index d2c5c9367cc4ff95506c1ebd839a41e7f8288140..c06e83872c34d07d79b1d643a5ea7dc91777c251 100644 (file)
@@ -493,7 +493,10 @@ static void uc_fw_bind_ggtt(struct intel_uc_fw *uc_fw)
        if (i915_gem_object_is_lmem(obj))
                pte_flags |= PTE_LM;
 
-       ggtt->vm.insert_entries(&ggtt->vm, dummy, I915_CACHE_NONE, pte_flags);
+       if (ggtt->vm.raw_insert_entries)
+               ggtt->vm.raw_insert_entries(&ggtt->vm, dummy, I915_CACHE_NONE, pte_flags);
+       else
+               ggtt->vm.insert_entries(&ggtt->vm, dummy, I915_CACHE_NONE, pte_flags);
 }
 
 static void uc_fw_unbind_ggtt(struct intel_uc_fw *uc_fw)
index bff8a111424a2201f54948d5337c68cca25d4437..f9b1969ed7ed28727912cfa283297584a5f332f0 100644 (file)
@@ -1104,8 +1104,12 @@ i915_vma_coredump_create(const struct intel_gt *gt,
 
                for_each_sgt_daddr(dma, iter, vma_res->bi.pages) {
                        mutex_lock(&ggtt->error_mutex);
-                       ggtt->vm.insert_page(&ggtt->vm, dma, slot,
-                                            I915_CACHE_NONE, 0);
+                       if (ggtt->vm.raw_insert_page)
+                               ggtt->vm.raw_insert_page(&ggtt->vm, dma, slot,
+                                                        I915_CACHE_NONE, 0);
+                       else
+                               ggtt->vm.insert_page(&ggtt->vm, dma, slot,
+                                                    I915_CACHE_NONE, 0);
                        mb();
 
                        s = io_mapping_map_wc(&ggtt->iomap, slot, PAGE_SIZE);