Author: gonzo
Date: Wed Jul  3 23:38:02 2013
New Revision: 252652
URL: http://svnweb.freebsd.org/changeset/base/252652

Log:
  Fix one of INVARIANTS-related UMA panics on ARM
  
  Force UMA zone to allocate service structures like slabs using own
  allocator.  uma_debug code performs atomic ops on uma_slab_t fields
  and safety of this operation is not guaranteed for write-back caches

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

Modified: head/sys/arm/arm/busdma_machdep-v6.c
==============================================================================
--- head/sys/arm/arm/busdma_machdep-v6.c        Wed Jul  3 23:29:40 2013        
(r252651)
+++ head/sys/arm/arm/busdma_machdep-v6.c        Wed Jul  3 23:38:02 2013        
(r252652)
@@ -192,14 +192,26 @@ static busdma_bufalloc_t standard_alloca
 static void
 busdma_init(void *dummy)
 {
+       int uma_flags;
+
+       uma_flags = 0;
 
        /* Create a cache of buffers in standard (cacheable) memory. */
        standard_allocator = busdma_bufalloc_create("buffer", 
            arm_dcache_align,   /* minimum_alignment */
            NULL,               /* uma_alloc func */ 
            NULL,               /* uma_free func */
-           0);                 /* uma_zcreate_flags */
+           uma_flags);         /* uma_zcreate_flags */
 
+#ifdef INVARIANTS
+       /* 
+        * Force UMA zone to allocate service structures like
+        * slabs using own allocator. uma_debug code performs
+        * atomic ops on uma_slab_t fields and safety of this
+        * operation is not guaranteed for write-back caches
+        */
+       uma_flags = UMA_ZONE_OFFPAGE;
+#endif
        /*
         * Create a cache of buffers in uncacheable memory, to implement the
         * BUS_DMA_COHERENT (and potentially BUS_DMA_NOCACHE) flag.
@@ -208,7 +220,7 @@ busdma_init(void *dummy)
            arm_dcache_align,   /* minimum_alignment */
            busdma_bufalloc_alloc_uncacheable, 
            busdma_bufalloc_free_uncacheable, 
-           0);                 /* uma_zcreate_flags */
+           uma_flags); /* uma_zcreate_flags */
 }
 
 /*
_______________________________________________
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