Skip site navigation (1)Skip section navigation (2)
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>