Author: cognet
Date: Sat Dec 22 01:04:29 2012
New Revision: 244575
URL: http://svnweb.freebsd.org/changeset/base/244575

Log:
  The manpage states that bus_dmamap_create(9) returns ENOMEM if it can't
  allocate a map or mapping resources.  That seems to imply that any memory
  allocations it does must use M_NOWAIT and check for NULL.
  
  Submitted by: Ian Lepore <[email protected]>

Modified:
  head/sys/arm/arm/busdma_machdep.c

Modified: head/sys/arm/arm/busdma_machdep.c
==============================================================================
--- head/sys/arm/arm/busdma_machdep.c   Sat Dec 22 01:03:23 2012        
(r244574)
+++ head/sys/arm/arm/busdma_machdep.c   Sat Dec 22 01:04:29 2012        
(r244575)
@@ -567,16 +567,24 @@ bus_dmamap_create(bus_dma_tag_t dmat, in
        bus_dmamap_t map;
        int error = 0;
 
-       map = uma_zalloc_arg(dmamap_zone, dmat, M_WAITOK);
+       map = uma_zalloc_arg(dmamap_zone, dmat, M_NOWAIT);
        *mapp = map;
+       if (map == NULL)
+               return (ENOMEM);
 
        /*
         * If the tag's segments haven't been allocated yet we need to do it
         * now, because we can't sleep for resources at map load time.
         */
-       if (dmat->segments == NULL)
+       if (dmat->segments == NULL) {
                dmat->segments = malloc(dmat->nsegments * 
-                   sizeof(*dmat->segments), M_DEVBUF, M_WAITOK);
+                   sizeof(*dmat->segments), M_DEVBUF, M_NOWAIT);
+               if (dmat->segments == NULL) {
+                       uma_zfree(dmamap_zone, map);
+                       *mapp = NULL;
+                       return (ENOMEM);
+               }
+       }
 
        /*
         * Bouncing might be required if the driver asks for an active
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to