Module Name: src
Committed By: christos
Date: Thu May 12 14:50:39 UTC 2016
Modified Files:
src/sys/external/bsd/drm2/dist/drm/i915: i915_gpu_error.c
Log Message:
Avoid taking locks during interrupts and explain why we are doing it this way.
To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 \
src/sys/external/bsd/drm2/dist/drm/i915/i915_gpu_error.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_gpu_error.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_gpu_error.c:1.3 src/sys/external/bsd/drm2/dist/drm/i915/i915_gpu_error.c:1.4
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_gpu_error.c:1.3 Fri Jul 18 15:48:34 2014
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_gpu_error.c Thu May 12 10:50:39 2016
@@ -604,18 +604,33 @@ i915_error_object_create_sized(struct dr
memcpy_fromio(d, (void __iomem *) offset, PAGE_SIZE);
} else {
- struct page *page;
- void *s;
- page = i915_gem_object_get_page(src, i);
+ if (cpu_intr_p() || cpu_softintr_p() ||
+ (curlwp->l_pflag & LP_INTR) != 0) {
+ /*
+ * We can't take locks during interrupts
+ * and finding the page from uvm requires
+ * taking a lock. Checking for an interrupt
+ * context is bogus, but this is the least
+ * intrusive change. Zero the result, doesn't
+ * matter much, because this is only used
+ * for diagnostics.
+ */
+ memset(d, 0, PAGE_SIZE);
+ } else {
+ struct page *page;
+ void *s;
+
+ page = i915_gem_object_get_page(src, i);
+
+ drm_clflush_pages(&page, 1);
+
+ s = kmap_atomic(page);
+ memcpy(d, s, PAGE_SIZE);
+ kunmap_atomic(s);
- drm_clflush_pages(&page, 1);
-
- s = kmap_atomic(page);
- memcpy(d, s, PAGE_SIZE);
- kunmap_atomic(s);
-
- drm_clflush_pages(&page, 1);
+ drm_clflush_pages(&page, 1);
+ }
}
local_irq_restore(flags);