Commit f2acf740 authored by Chris Wilson's avatar Chris Wilson

drm/i915: Reduce GPU error capture mutex hold time

Shrink the hold time for the error capture mutex to just around the
acquire/release of the PTE used for reading back the object via the
Global GTT. For platforms that do not need the GGTT read back, we can
skip the mutex entirely and allow concurrent error capture. Where we do
use the GGTT, by restricting the hold time around the slow readback and
compression, we are more resilient against softlockups (khungtaskd) as
the heartbeat may well also trigger an error while the first is on
going, and this allows the heartbeat reset to skip past the capture and
not be stalled.

Testcase: igt/gem_exec_capture/many-*
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Reviewed-by: default avatarMatthew Auld <matthew.auld@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200916090059.3189-3-chris@chris-wilson.co.uk
parent 293f43c8
...@@ -1026,6 +1026,7 @@ i915_vma_coredump_create(const struct intel_gt *gt, ...@@ -1026,6 +1026,7 @@ i915_vma_coredump_create(const struct intel_gt *gt,
dma_addr_t dma; dma_addr_t dma;
for_each_sgt_daddr(dma, iter, vma->pages) { for_each_sgt_daddr(dma, iter, vma->pages) {
mutex_lock(&ggtt->error_mutex);
ggtt->vm.insert_page(&ggtt->vm, dma, slot, ggtt->vm.insert_page(&ggtt->vm, dma, slot,
I915_CACHE_NONE, 0); I915_CACHE_NONE, 0);
mb(); mb();
...@@ -1035,6 +1036,10 @@ i915_vma_coredump_create(const struct intel_gt *gt, ...@@ -1035,6 +1036,10 @@ i915_vma_coredump_create(const struct intel_gt *gt,
(void __force *)s, dst, (void __force *)s, dst,
true); true);
io_mapping_unmap(s); io_mapping_unmap(s);
mb();
ggtt->vm.clear_range(&ggtt->vm, slot, PAGE_SIZE);
mutex_unlock(&ggtt->error_mutex);
if (ret) if (ret)
break; break;
} }
...@@ -1506,25 +1511,6 @@ gt_record_uc(struct intel_gt_coredump *gt, ...@@ -1506,25 +1511,6 @@ gt_record_uc(struct intel_gt_coredump *gt,
return error_uc; return error_uc;
} }
static void gt_capture_prepare(struct intel_gt_coredump *gt)
{
struct i915_ggtt *ggtt = gt->_gt->ggtt;
mutex_lock(&ggtt->error_mutex);
}
static void gt_capture_finish(struct intel_gt_coredump *gt)
{
struct i915_ggtt *ggtt = gt->_gt->ggtt;
if (drm_mm_node_allocated(&ggtt->error_capture))
ggtt->vm.clear_range(&ggtt->vm,
ggtt->error_capture.start,
PAGE_SIZE);
mutex_unlock(&ggtt->error_mutex);
}
/* Capture all registers which don't fit into another category. */ /* Capture all registers which don't fit into another category. */
static void gt_record_regs(struct intel_gt_coredump *gt) static void gt_record_regs(struct intel_gt_coredump *gt)
{ {
...@@ -1783,8 +1769,6 @@ i915_vma_capture_prepare(struct intel_gt_coredump *gt) ...@@ -1783,8 +1769,6 @@ i915_vma_capture_prepare(struct intel_gt_coredump *gt)
return NULL; return NULL;
} }
gt_capture_prepare(gt);
return compress; return compress;
} }
...@@ -1794,8 +1778,6 @@ void i915_vma_capture_finish(struct intel_gt_coredump *gt, ...@@ -1794,8 +1778,6 @@ void i915_vma_capture_finish(struct intel_gt_coredump *gt,
if (!compress) if (!compress)
return; return;
gt_capture_finish(gt);
compress_fini(compress); compress_fini(compress);
kfree(compress); kfree(compress);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment