On Thu, Jun 11, 2020 at 11:07:11AM +0100, Laurence Tratt wrote:
> The recent DRM update has fixed one long-ish-standing bug for me where Xorg
> sometimes would get stuck while executing Xsession (I could never work out
> why) which is really good!
> 
> However I've now had the following kernel panic several times:
> 
>   kernel: page fault trap, code=0
>   Stopped at intel_partial_pages+0xf4:    moq 0x58,%rsi
> 
> Unfortunately that also seems to take out my keyboard at ddb so I have no
> further information beyond my dmesg :/

Try this, the code in question does

sg_set_page(sg, NULL, I915_GTT_PAGE_SIZE, 0);
sg_dma_address(sg) =
        i915_gem_object_get_dma_address(obj, src_idx);
sg_dma_len(sg) = I915_GTT_PAGE_SIZE;

VM_PAGE_TO_PHYS() will attempt to deref NULL.

Index: sys/dev/pci/drm/include/linux/scatterlist.h
===================================================================
RCS file: /cvs/src/sys/dev/pci/drm/include/linux/scatterlist.h,v
retrieving revision 1.2
diff -u -p -r1.2 scatterlist.h
--- sys/dev/pci/drm/include/linux/scatterlist.h 8 Jun 2020 04:48:15 -0000       
1.2
+++ sys/dev/pci/drm/include/linux/scatterlist.h 11 Jun 2020 10:54:05 -0000
@@ -115,7 +115,8 @@ sg_set_page(struct scatterlist *sgl, str
     unsigned int length, unsigned int offset)
 {
        sgl->__page = page;
-       sgl->dma_address = VM_PAGE_TO_PHYS(page);
+       if (page != NULL)
+               sgl->dma_address = VM_PAGE_TO_PHYS(page);
        sgl->offset = offset;
        sgl->length = length;
        sgl->end = false;

Reply via email to