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);
 

Reply via email to