Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 23 Jun 2016 01:00:13 +0000 (UTC)
From:      Adrian Chadd <adrian@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r302102 - head/sys/dev/iwm
Message-ID:  <201606230100.u5N10DWI076981@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: adrian
Date: Thu Jun 23 01:00:13 2016
New Revision: 302102
URL: https://svnweb.freebsd.org/changeset/base/302102

Log:
  [iwm] Fix iwm_dma_contig_free(). dma->map is always NULL here.
  
  * When bus_dmamem_alloc is used, the bus_dmamap_t is usually set to NULL, so
    we were never actually freeing any dma memory allocations done via
    iwm_dma_contig_alloc(). So we should check dma->vaddr instead of dma->map here.
  
  * Also, the dmamap is actually supposed to be invalidated as part of
    bus_dmamem_free(), so bus_dmamap_destroy() is never needed here.
  
  Submitted by:	Imre Vadasz <imre@vdsz.com>
  Approved by:	re (gjb)
  Obtained from:	DragonflyBSD git ef2b29a7ba6ca8a9d2c82ab591c0622227ff84cb

Modified:
  head/sys/dev/iwm/if_iwm.c

Modified: head/sys/dev/iwm/if_iwm.c
==============================================================================
--- head/sys/dev/iwm/if_iwm.c	Thu Jun 23 00:56:54 2016	(r302101)
+++ head/sys/dev/iwm/if_iwm.c	Thu Jun 23 01:00:13 2016	(r302102)
@@ -721,6 +721,7 @@ iwm_dma_contig_alloc(bus_dma_tag_t tag, 
 
 	dma->tag = NULL;
 	dma->size = size;
+	dma->vaddr = NULL;
 
 	error = bus_dma_tag_create(tag, alignment,
             0, BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, size,
@@ -735,8 +736,11 @@ iwm_dma_contig_alloc(bus_dma_tag_t tag, 
 
         error = bus_dmamap_load(dma->tag, dma->map, dma->vaddr, size,
             iwm_dma_map_addr, &dma->paddr, BUS_DMA_NOWAIT);
-        if (error != 0)
+        if (error != 0) {
+		bus_dmamem_free(dma->tag, dma->vaddr, dma->map);
+		dma->vaddr = NULL;
                 goto fail;
+	}
 
 	bus_dmamap_sync(dma->tag, dma->map, BUS_DMASYNC_PREWRITE);
 
@@ -749,16 +753,12 @@ fail:	iwm_dma_contig_free(dma);
 static void
 iwm_dma_contig_free(struct iwm_dma_info *dma)
 {
-	if (dma->map != NULL) {
-		if (dma->vaddr != NULL) {
-			bus_dmamap_sync(dma->tag, dma->map,
-			    BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
-			bus_dmamap_unload(dma->tag, dma->map);
-			bus_dmamem_free(dma->tag, dma->vaddr, dma->map);
-			dma->vaddr = NULL;
-		}
-		bus_dmamap_destroy(dma->tag, dma->map);
-		dma->map = NULL;
+	if (dma->vaddr != NULL) {
+		bus_dmamap_sync(dma->tag, dma->map,
+		    BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
+		bus_dmamap_unload(dma->tag, dma->map);
+		bus_dmamem_free(dma->tag, dma->vaddr, dma->map);
+		dma->vaddr = NULL;
 	}
 	if (dma->tag != NULL) {
 		bus_dma_tag_destroy(dma->tag);



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