Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 6 Aug 2010 14:18:37 +0000 (UTC)
From:      John Baldwin <jhb@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-6@freebsd.org
Subject:   svn commit: r210932 - in stable/6/sys: amd64/amd64 i386/i386
Message-ID:  <201008061418.o76EIbj0038826@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jhb
Date: Fri Aug  6 14:18:37 2010
New Revision: 210932
URL: http://svn.freebsd.org/changeset/base/210932

Log:
  MFC 170866,176206:
  If busdma is being used to realign dynamic buffers and the alignment is set to
  PAGE_SIZE or less, the bounce page counting logic was flawed and wouldn't
  reserve any pages.  Adjust to be correct.

Modified:
  stable/6/sys/amd64/amd64/busdma_machdep.c
  stable/6/sys/i386/i386/busdma_machdep.c
Directory Properties:
  stable/6/sys/   (props changed)
  stable/6/sys/contrib/pf/   (props changed)
  stable/6/sys/dev/cxgb/   (props changed)

Modified: stable/6/sys/amd64/amd64/busdma_machdep.c
==============================================================================
--- stable/6/sys/amd64/amd64/busdma_machdep.c	Fri Aug  6 13:45:16 2010	(r210931)
+++ stable/6/sys/amd64/amd64/busdma_machdep.c	Fri Aug  6 14:18:37 2010	(r210932)
@@ -594,14 +594,14 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm
 		 * Count the number of bounce pages
 		 * needed in order to complete this transfer
 		 */
-		vaddr = trunc_page((vm_offset_t)buf);
+		vaddr = (vm_offset_t)buf;
 		vendaddr = (vm_offset_t)buf + buflen;
 
 		while (vaddr < vendaddr) {
 			paddr = pmap_kextract(vaddr);
 			if (run_filter(dmat, paddr) != 0)
 				map->pagesneeded++;
-			vaddr += PAGE_SIZE;
+			vaddr += (PAGE_SIZE - ((vm_offset_t)vaddr & PAGE_MASK));
 		}
 		CTR1(KTR_BUSDMA, "pagesneeded= %d\n", map->pagesneeded);
 	}
@@ -832,7 +832,7 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, 
 		    bus_dmamap_callback2_t *callback, void *callback_arg,
 		    int flags)
 {
-	bus_addr_t lastaddr;
+	bus_addr_t lastaddr = 0;
 	int nsegs, error, first, i;
 	bus_size_t resid;
 	struct iovec *iov;

Modified: stable/6/sys/i386/i386/busdma_machdep.c
==============================================================================
--- stable/6/sys/i386/i386/busdma_machdep.c	Fri Aug  6 13:45:16 2010	(r210931)
+++ stable/6/sys/i386/i386/busdma_machdep.c	Fri Aug  6 14:18:37 2010	(r210932)
@@ -597,14 +597,14 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm
 		 * Count the number of bounce pages
 		 * needed in order to complete this transfer
 		 */
-		vaddr = trunc_page((vm_offset_t)buf);
+		vaddr = (vm_offset_t)buf;
 		vendaddr = (vm_offset_t)buf + buflen;
 
 		while (vaddr < vendaddr) {
 			paddr = pmap_kextract(vaddr);
 			if (run_filter(dmat, paddr) != 0)
 				map->pagesneeded++;
-			vaddr += PAGE_SIZE;
+			vaddr += (PAGE_SIZE - ((vm_offset_t)vaddr & PAGE_MASK));
 		}
 		CTR1(KTR_BUSDMA, "pagesneeded= %d\n", map->pagesneeded);
 	}



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201008061418.o76EIbj0038826>