Author: marius
Date: Wed Sep 22 19:59:11 2010
New Revision: 213016
URL: http://svn.freebsd.org/changeset/base/213016

Log:
  MFC: r212676
  
  Sync with other platforms:
  - make dflt_lock() always panic,
  - add kludge to use contigmalloc() when the alignment is larger than the size
    and print a diagnostic when we didn't satisfy the alignment.

Modified:
  stable/8/sys/sparc64/sparc64/bus_machdep.c
  stable/8/sys/sun4v/sun4v/bus_machdep.c
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)
  stable/8/sys/dev/xen/xenpci/   (props changed)

Modified: stable/8/sys/sparc64/sparc64/bus_machdep.c
==============================================================================
--- stable/8/sys/sparc64/sparc64/bus_machdep.c  Wed Sep 22 19:55:40 2010        
(r213015)
+++ stable/8/sys/sparc64/sparc64/bus_machdep.c  Wed Sep 22 19:59:11 2010        
(r213016)
@@ -182,11 +182,8 @@ busdma_lock_mutex(void *arg, bus_dma_loc
 static void
 dflt_lock(void *arg, bus_dma_lock_op_t op)
 {
-#ifdef INVARIANTS
+
        panic("driver error: busdma dflt_lock called");
-#else
-       printf("DRIVER_ERROR: busdma dflt_lock called\n");
-#endif
 }
 
 /*
@@ -631,9 +628,18 @@ nexus_dmamem_alloc(bus_dma_tag_t dmat, v
        if (flags & BUS_DMA_ZERO)
                mflags |= M_ZERO;
 
-       if ((dmat->dt_maxsize <= PAGE_SIZE)) {
+       /*
+        * XXX:
+        * (dmat->dt_alignment < dmat->dt_maxsize) is just a quick hack; the
+        * exact alignment guarantees of malloc need to be nailed down, and
+        * the code below should be rewritten to take that into account.
+        *
+        * In the meantime, we'll warn the user if malloc gets it wrong.
+        */
+       if (dmat->dt_maxsize <= PAGE_SIZE &&
+           dmat->dt_alignment < dmat->dt_maxsize)
                *vaddr = malloc(dmat->dt_maxsize, M_DEVBUF, mflags);
-       } else {
+       else {
                /*
                 * XXX use contigmalloc until it is merged into this
                 * facility and handles multi-seg allocations.  Nobody
@@ -646,6 +652,8 @@ nexus_dmamem_alloc(bus_dma_tag_t dmat, v
        }
        if (*vaddr == NULL)
                return (ENOMEM);
+       if ((uintptr_t)*vaddr % dmat->dt_alignment)
+               printf("%s: failed to align memory properly.\n", __func__);
        return (0);
 }
 
@@ -657,11 +665,11 @@ static void
 nexus_dmamem_free(bus_dma_tag_t dmat, void *vaddr, bus_dmamap_t map)
 {
 
-       if ((dmat->dt_maxsize <= PAGE_SIZE))
+       if (dmat->dt_maxsize <= PAGE_SIZE &&
+           dmat->dt_alignment < dmat->dt_maxsize)
                free(vaddr, M_DEVBUF);
-       else {
+       else
                contigfree(vaddr, dmat->dt_maxsize, M_DEVBUF);
-       }
 }
 
 struct bus_dma_methods nexus_dma_methods = {

Modified: stable/8/sys/sun4v/sun4v/bus_machdep.c
==============================================================================
--- stable/8/sys/sun4v/sun4v/bus_machdep.c      Wed Sep 22 19:55:40 2010        
(r213015)
+++ stable/8/sys/sun4v/sun4v/bus_machdep.c      Wed Sep 22 19:59:11 2010        
(r213016)
@@ -181,11 +181,8 @@ busdma_lock_mutex(void *arg, bus_dma_loc
 static void
 dflt_lock(void *arg, bus_dma_lock_op_t op)
 {
-#ifdef INVARIANTS
+
        panic("driver error: busdma dflt_lock called");
-#else
-       printf("DRIVER_ERROR: busdma dflt_lock called\n");
-#endif
 }
 
 /*
@@ -647,9 +644,18 @@ nexus_dmamem_alloc(bus_dma_tag_t dmat, v
        if (flags & BUS_DMA_ZERO)
                mflags |= M_ZERO;
 
-       if ((dmat->dt_maxsize <= PAGE_SIZE)) {
+       /*
+        * XXX:
+        * (dmat->dt_alignment < dmat->dt_maxsize) is just a quick hack; the
+        * exact alignment guarantees of malloc need to be nailed down, and
+        * the code below should be rewritten to take that into account.
+        *
+        * In the meantime, we'll warn the user if malloc gets it wrong.
+        */
+       if (dmat->dt_maxsize <= PAGE_SIZE &&
+           dmat->dt_alignment < dmat->dt_maxsize)
                *vaddr = malloc(dmat->dt_maxsize, M_DEVBUF, mflags);
-       } else {
+       else {
                /*
                 * XXX use contigmalloc until it is merged into this
                 * facility and handles multi-seg allocations.  Nobody
@@ -662,6 +668,8 @@ nexus_dmamem_alloc(bus_dma_tag_t dmat, v
        }
        if (*vaddr == NULL)
                return (ENOMEM);
+       if ((uintptr_t)*vaddr % dmat->dt_alignment)
+               printf("%s: failed to align memory properly.\n", __func__);
        return (0);
 }
 
@@ -673,11 +681,11 @@ static void
 nexus_dmamem_free(bus_dma_tag_t dmat, void *vaddr, bus_dmamap_t map)
 {
 
-       if ((dmat->dt_maxsize <= PAGE_SIZE))
+       if (dmat->dt_maxsize <= PAGE_SIZE &&
+           dmat->dt_alignment < dmat->dt_maxsize)
                free(vaddr, M_DEVBUF);
-       else {
+       else
                contigfree(vaddr, dmat->dt_maxsize, M_DEVBUF);
-       }
 }
 
 struct bus_dma_methods nexus_dma_methods = {
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to