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