svn commit: r292775 - stable/10/sys/x86/x86

Marius Strobl marius at FreeBSD.org
Sun Dec 27 15:18:02 UTC 2015


Author: marius
Date: Sun Dec 27 15:18:01 2015
New Revision: 292775
URL: https://svnweb.freebsd.org/changeset/base/292775

Log:
  MFC: r286785, r291088, r291120
  - Reformat x86 bounce buffer synchronization code to reduce indentation.
    No functional change.
  - Avoid a NULL pointer dereference in bounce_bus_dmamap_sync() when the
    map has been created via bounce_bus_dmamem_alloc(). Even for coherent
    DMA - which bus_dmamem_alloc(9) typically is used for -, calling of
    bus_dmamap_sync(9) isn't optional. [1]
  - Avoid a NULL pointer dereference in bounce_bus_dmamap_unload() when
    the map has been created via bounce_bus_dmamem_alloc(). In that case
    bus_dmamap_unload(9) typically isn't called during normal operation
    but still should be during detach, cleanup from failed attach etc. [2]
  
  PR:		188899 (non-original problem) [1]
  Submitted by:	yongari [2]

Modified:
  stable/10/sys/x86/x86/busdma_bounce.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/x86/x86/busdma_bounce.c
==============================================================================
--- stable/10/sys/x86/x86/busdma_bounce.c	Sun Dec 27 14:53:31 2015	(r292774)
+++ stable/10/sys/x86/x86/busdma_bounce.c	Sun Dec 27 15:18:01 2015	(r292775)
@@ -751,6 +751,9 @@ bounce_bus_dmamap_unload(bus_dma_tag_t d
 {
 	struct bounce_page *bpage;
 
+	if (map == NULL)
+		return;
+
 	while ((bpage = STAILQ_FIRST(&map->bpages)) != NULL) {
 		STAILQ_REMOVE_HEAD(&map->bpages, links);
 		free_bounce_page(dmat, bpage);
@@ -763,47 +766,43 @@ bounce_bus_dmamap_sync(bus_dma_tag_t dma
 {
 	struct bounce_page *bpage;
 
-	if ((bpage = STAILQ_FIRST(&map->bpages)) != NULL) {
-		/*
-		 * Handle data bouncing.  We might also
-		 * want to add support for invalidating
-		 * the caches on broken hardware
-		 */
-		CTR4(KTR_BUSDMA, "%s: tag %p tag flags 0x%x op 0x%x "
-		    "performing bounce", __func__, dmat,
-		    dmat->common.flags, op);
-
-		if ((op & BUS_DMASYNC_PREWRITE) != 0) {
-			while (bpage != NULL) {
-				if (bpage->datavaddr != 0) {
-					bcopy((void *)bpage->datavaddr,
-					    (void *)bpage->vaddr,
-					    bpage->datacount);
-				} else {
-					physcopyout(bpage->dataaddr,
-					    (void *)bpage->vaddr,
-					    bpage->datacount);
-				}
-				bpage = STAILQ_NEXT(bpage, links);
+	if (map == NULL || (bpage = STAILQ_FIRST(&map->bpages)) == NULL)
+		return;
+
+	/*
+	 * Handle data bouncing.  We might also want to add support for
+	 * invalidating the caches on broken hardware.
+	 */
+	CTR4(KTR_BUSDMA, "%s: tag %p tag flags 0x%x op 0x%x "
+	    "performing bounce", __func__, dmat, dmat->common.flags, op);
+
+	if ((op & BUS_DMASYNC_PREWRITE) != 0) {
+		while (bpage != NULL) {
+			if (bpage->datavaddr != 0) {
+				bcopy((void *)bpage->datavaddr,
+				    (void *)bpage->vaddr, bpage->datacount);
+			} else {
+				physcopyout(bpage->dataaddr,
+				    (void *)bpage->vaddr, bpage->datacount);
 			}
-			dmat->bounce_zone->total_bounced++;
+			bpage = STAILQ_NEXT(bpage, links);
 		}
+		dmat->bounce_zone->total_bounced++;
+	}
 
-		if ((op & BUS_DMASYNC_POSTREAD) != 0) {
-			while (bpage != NULL) {
-				if (bpage->datavaddr != 0) {
-					bcopy((void *)bpage->vaddr,
-					    (void *)bpage->datavaddr,
-					    bpage->datacount);
-				} else {
-					physcopyin((void *)bpage->vaddr,
-					    bpage->dataaddr,
-					    bpage->datacount);
-				}
-				bpage = STAILQ_NEXT(bpage, links);
+	if ((op & BUS_DMASYNC_POSTREAD) != 0) {
+		while (bpage != NULL) {
+			if (bpage->datavaddr != 0) {
+				bcopy((void *)bpage->vaddr,
+				    (void *)bpage->datavaddr,
+				    bpage->datacount);
+			} else {
+				physcopyin((void *)bpage->vaddr,
+				    bpage->dataaddr, bpage->datacount);
 			}
-			dmat->bounce_zone->total_bounced++;
+			bpage = STAILQ_NEXT(bpage, links);
 		}
+		dmat->bounce_zone->total_bounced++;
 	}
 }
 
@@ -822,12 +821,14 @@ SYSINIT(bpages, SI_SUB_LOCK, SI_ORDER_AN
 static struct sysctl_ctx_list *
 busdma_sysctl_tree(struct bounce_zone *bz)
 {
+
 	return (&bz->sysctl_tree);
 }
 
 static struct sysctl_oid *
 busdma_sysctl_tree_top(struct bounce_zone *bz)
 {
+
 	return (bz->sysctl_tree_top);
 }
 


More information about the svn-src-all mailing list