Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 3 Jul 2013 23:38:02 +0000 (UTC)
From:      Oleksandr Tymoshenko <gonzo@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r252652 - head/sys/arm/arm
Message-ID:  <201307032338.r63Nc24U063406@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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 */
 }
 
 /*



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