Date: Tue, 30 Apr 2019 12:58:09 +0200 From: Niclas Zeising <zeising@freebsd.org> To: Andrey Fesenko <f0andrey@gmail.com>, Jakob Alvermark <jakob@alvermark.net> Cc: x11@freebsd.org, johalun@freebsd.org, tychon@freebsd.org, kostikbel@gmail.com, oleg@theweb.org.ua Subject: Re: drm-current-kmod-4.16.g20190424 hangs Message-ID: <332ccf6d-fb54-de70-2e09-22ff1f1acbac@freebsd.org> In-Reply-To: <CA%2BK5SrNn6H4uzn7jpQWJSO4D8U_9wUH4ogXtv2HsjXtMnU%2BaWg@mail.gmail.com> References: <5713985b-e97f-c7f2-2592-47a17baf8095@alvermark.net> <12e450ab-2c17-11e3-ba47-20599c38f3a3@gmail.com> <8dcf1fed-8f89-3e11-5fe1-b3a72e6971b0@alvermark.net> <5eab5bae-fd3c-0839-9d93-a8b7a4096f6d@alvermark.net> <CAECmPwsArrZwA1hN67nb28Acx=Ug9Zw9bA9XDJjPD455KPKvhw@mail.gmail.com> <15e1052f-1c96-fe2f-acdb-5730ccd8dfb5@alvermark.net> <CA%2BK5SrNn6H4uzn7jpQWJSO4D8U_9wUH4ogXtv2HsjXtMnU%2BaWg@mail.gmail.com>
next in thread | previous in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format. --------------8AAE32C461606048D3D7FDC5 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Hi! Attached is a patch from Tycho that possibly fixes the issue. Please test it and see what happens. When replying, please respect reply-to and trim down the cc list a bit. Thanks! Regards -- Niclas Zeising FreeBSD Graphics Team --------------8AAE32C461606048D3D7FDC5 Content-Type: text/x-patch; name="head.sys.lkpi.dmar.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="head.sys.lkpi.dmar.diff" Index: sys/compat/linuxkpi/common/src/linux_pci.c =================================================================== --- sys/compat/linuxkpi/common/src/linux_pci.c (revision 346957) +++ sys/compat/linuxkpi/common/src/linux_pci.c (working copy) @@ -565,10 +565,8 @@ { struct linux_dma_priv *priv; struct linux_dma_obj *obj; - struct scatterlist *dma_sg, *sg; - int dma_nents, error, nseg; - size_t seg_len; - vm_paddr_t seg_phys, prev_phys_end; + struct scatterlist *sg; + int error, i, nseg; bus_dma_segment_t seg; priv = dev->dma_priv; @@ -580,25 +578,11 @@ return (0); } - sg = sgl; - dma_sg = sg; - dma_nents = 0; - while (nents > 0) { - seg_phys = sg_phys(sg); - seg_len = sg->length; - while (--nents > 0) { - prev_phys_end = sg_phys(sg) + sg->length; - sg = sg_next(sg); - if (prev_phys_end != sg_phys(sg)) - break; - seg_len += sg->length; - } - + for_each_sg(sgl, sg, nents, i) { nseg = -1; mtx_lock(&priv->dma_lock); if (_bus_dmamap_load_phys(priv->dmat, obj->dmamap, - seg_phys, seg_len, BUS_DMA_NOWAIT, - &seg, &nseg) != 0) { + sg_phys(sg), sg->length, 0, &seg, &nseg) != 0) { bus_dmamap_unload(priv->dmat, obj->dmamap); bus_dmamap_destroy(priv->dmat, obj->dmamap); mtx_unlock(&priv->dma_lock); @@ -607,14 +591,9 @@ } mtx_unlock(&priv->dma_lock); KASSERT(++nseg == 1, ("More than one segment (nseg=%d)", nseg)); + sg_dma_address(sg) = seg.ds_addr; + } - sg_dma_address(dma_sg) = seg.ds_addr; - sg_dma_len(dma_sg) = seg.ds_len; - - dma_sg = sg_next(dma_sg); - dma_nents++; - } - obj->dma_addr = sg_dma_address(sgl); mtx_lock(&priv->ptree_lock); @@ -629,7 +608,7 @@ return (0); } - return (dma_nents); + return (nents); } void --------------8AAE32C461606048D3D7FDC5--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?332ccf6d-fb54-de70-2e09-22ff1f1acbac>