svn commit: r189200 - in user/kmacy/releng_7_fast_net/sys: amd64/include arm/include dev/bce dev/mxge i386/include ia64/include powerpc/include sparc64/include sun4v/include

Kip Macy kmacy at FreeBSD.org
Sat Feb 28 20:39:57 PST 2009


Author: kmacy
Date: Sun Mar  1 04:39:56 2009
New Revision: 189200
URL: http://svn.freebsd.org/changeset/base/189200

Log:
  multiq step 1:
  - atomic_barriers: add atomic barriers to atomic.h on all architectures

Modified:
  user/kmacy/releng_7_fast_net/sys/amd64/include/atomic.h
  user/kmacy/releng_7_fast_net/sys/arm/include/atomic.h
  user/kmacy/releng_7_fast_net/sys/dev/bce/if_bcereg.h
  user/kmacy/releng_7_fast_net/sys/dev/mxge/if_mxge.c
  user/kmacy/releng_7_fast_net/sys/dev/mxge/if_mxge_var.h
  user/kmacy/releng_7_fast_net/sys/i386/include/atomic.h
  user/kmacy/releng_7_fast_net/sys/ia64/include/atomic.h
  user/kmacy/releng_7_fast_net/sys/powerpc/include/atomic.h
  user/kmacy/releng_7_fast_net/sys/sparc64/include/atomic.h
  user/kmacy/releng_7_fast_net/sys/sun4v/include/atomic.h

Modified: user/kmacy/releng_7_fast_net/sys/amd64/include/atomic.h
==============================================================================
--- user/kmacy/releng_7_fast_net/sys/amd64/include/atomic.h	Sun Mar  1 03:32:28 2009	(r189199)
+++ user/kmacy/releng_7_fast_net/sys/amd64/include/atomic.h	Sun Mar  1 04:39:56 2009	(r189200)
@@ -32,6 +32,10 @@
 #error this file needs sys/cdefs.h as a prerequisite
 #endif
 
+#define mb()	__asm__ __volatile__ ("mfence;": : :"memory")
+#define wmb()	__asm__ __volatile__ ("sfence;": : :"memory")
+#define rmb()	__asm__ __volatile__ ("lfence;": : :"memory")
+
 /*
  * Various simple operations on memory, each of which is atomic in the
  * presence of interrupts and multiple processors.

Modified: user/kmacy/releng_7_fast_net/sys/arm/include/atomic.h
==============================================================================
--- user/kmacy/releng_7_fast_net/sys/arm/include/atomic.h	Sun Mar  1 03:32:28 2009	(r189199)
+++ user/kmacy/releng_7_fast_net/sys/arm/include/atomic.h	Sun Mar  1 04:39:56 2009	(r189200)
@@ -45,6 +45,10 @@
 
 #include <sys/types.h>
 
+#define	mb()
+#define	wmb()
+#define	rmb()
+
 #ifndef I32_bit
 #define I32_bit (1 << 7)        /* IRQ disable */
 #endif

Modified: user/kmacy/releng_7_fast_net/sys/dev/bce/if_bcereg.h
==============================================================================
--- user/kmacy/releng_7_fast_net/sys/dev/bce/if_bcereg.h	Sun Mar  1 03:32:28 2009	(r189199)
+++ user/kmacy/releng_7_fast_net/sys/dev/bce/if_bcereg.h	Sun Mar  1 04:39:56 2009	(r189200)
@@ -557,6 +557,8 @@
 
 #endif /* BCE_DEBUG */
 
+
+#if __FreeBSD_version < 701101
 #if defined(__i386__) || defined(__amd64__)
 #define mb()    __asm volatile("mfence" ::: "memory")
 #define wmb()   __asm volatile("sfence" ::: "memory")
@@ -566,6 +568,7 @@
 #define rmb()
 #define wmb()
 #endif
+#endif
 
 /****************************************************************************/
 /* Device identification definitions.                                       */

Modified: user/kmacy/releng_7_fast_net/sys/dev/mxge/if_mxge.c
==============================================================================
--- user/kmacy/releng_7_fast_net/sys/dev/mxge/if_mxge.c	Sun Mar  1 03:32:28 2009	(r189199)
+++ user/kmacy/releng_7_fast_net/sys/dev/mxge/if_mxge.c	Sun Mar  1 04:39:56 2009	(r189200)
@@ -747,9 +747,9 @@ mxge_load_firmware_helper(mxge_softc_t *
 		mxge_pio_copy(sc->sram + MXGE_FW_OFFSET + i,
 			      inflate_buffer + i,
 			      min(256U, (unsigned)(fw_len - i)));
-		mb();
+		wmb();
 		dummy = *sc->sram;
-		mb();
+		wmb();
 	}
 
 	*limit = fw_len;
@@ -782,7 +782,7 @@ mxge_dummy_rdma(mxge_softc_t *sc, int en
 	/* clear confirmation addr */
 	confirm = (volatile uint32_t *)sc->cmd;
 	*confirm = 0;
-	mb();
+	wmb();
 
 	/* send an rdma command to the PCIe engine, and wait for the
 	   response in the confirmation address.  The firmware should
@@ -804,9 +804,9 @@ mxge_dummy_rdma(mxge_softc_t *sc, int en
 	submit = (volatile char *)(sc->sram + MXGEFW_BOOT_DUMMY_RDMA);
 
 	mxge_pio_copy(submit, buf, 64);
-	mb();
+	wmb();
 	DELAY(1000);
-	mb();
+	wmb();
 	i = 0;
 	while (*confirm != 0xffffffff && i < 20) {
 		DELAY(1000);
@@ -844,7 +844,7 @@ mxge_send_cmd(mxge_softc_t *sc, uint32_t
 	buf->response_addr.high = htobe32(dma_high);
 	mtx_lock(&sc->cmd_mtx);
 	response->result = 0xffffffff;
-	mb();
+	wmb();
 	mxge_pio_copy((volatile void *)cmd_addr, buf, sizeof (*buf));
 
 	/* wait up to 20ms */
@@ -852,7 +852,7 @@ mxge_send_cmd(mxge_softc_t *sc, uint32_t
 	for (sleep_total = 0; sleep_total <  20; sleep_total++) {
 		bus_dmamap_sync(sc->cmd_dma.dmat, 
 				sc->cmd_dma.map, BUS_DMASYNC_POSTREAD);
-		mb();
+		wmb();
 		switch (be32toh(response->result)) {
 		case 0:
 			data->data0 = be32toh(response->data);
@@ -980,7 +980,7 @@ mxge_load_firmware(mxge_softc_t *sc, int
 	/* clear confirmation addr */
 	confirm = (volatile uint32_t *)sc->cmd;
 	*confirm = 0;
-	mb();
+	wmb();
 	/* send a reload command to the bootstrap MCP, and wait for the
 	   response in the confirmation address.  The firmware should
 	   write a -1 there to indicate it is alive and well
@@ -1005,9 +1005,9 @@ mxge_load_firmware(mxge_softc_t *sc, int
 
 	submit = (volatile char *)(sc->sram + MXGEFW_BOOT_HANDOFF);
 	mxge_pio_copy(submit, buf, 64);
-	mb();
+	wmb();
 	DELAY(1000);
-	mb();
+	wmb();
 	i = 0;
 	while (*confirm != 0xffffffff && i < 20) {
 		DELAY(1000*10);
@@ -1668,7 +1668,7 @@ mxge_submit_req_backwards(mxge_tx_ring_t
                 idx = (starting_slot + cnt) & tx->mask;
                 mxge_pio_copy(&tx->lanai[idx],
 			      &src[cnt], sizeof(*src));
-                mb();
+                wmb();
         }
 }
 
@@ -1694,14 +1694,14 @@ mxge_submit_req(mxge_tx_ring_t *tx, mcp_
 
 	last_flags = src->flags;
 	src->flags = 0;
-        mb();
+        wmb();
         dst = dstp = &tx->lanai[idx];
         srcp = src;
 
         if ((idx + cnt) < tx->mask) {
                 for (i = 0; i < (cnt - 1); i += 2) {
                         mxge_pio_copy(dstp, srcp, 2 * sizeof(*src));
-                        mb(); /* force write every 32 bytes */
+                        wmb(); /* force write every 32 bytes */
                         srcp += 2;
                         dstp += 2;
                 }
@@ -1714,7 +1714,7 @@ mxge_submit_req(mxge_tx_ring_t *tx, mcp_
         if (i < cnt) {
                 /* submit the first request */
                 mxge_pio_copy(dstp, srcp, sizeof(*src));
-                mb(); /* barrier before setting valid flag */
+                wmb(); /* barrier before setting valid flag */
         }
 
         /* re-write the last 32-bits with the valid flags */
@@ -1725,7 +1725,7 @@ mxge_submit_req(mxge_tx_ring_t *tx, mcp_
         dst_ints+=3;
         *dst_ints =  *src_ints;
         tx->req += cnt;
-        mb();
+        wmb();
 }
 
 #if IFCAP_TSO4
@@ -2144,12 +2144,12 @@ mxge_submit_8rx(volatile mcp_kreq_ether_
 	low = src->addr_low;
 	src->addr_low = 0xffffffff;
 	mxge_pio_copy(dst, src, 4 * sizeof (*src));
-	mb();
+	wmb();
 	mxge_pio_copy(dst + 4, src + 4, 4 * sizeof (*src));
-	mb();
+	wmb();
 	src->addr_low = low;
 	dst->addr_low = low;
-	mb();
+	wmb();
 }
 
 static int
@@ -2736,7 +2736,7 @@ mxge_intr(void *arg)
 			send_done_count = be32toh(stats->send_done_count);
 		}
 		if (sc->legacy_irq && mxge_deassert_wait)
-			mb();
+			wmb();
 	} while (*((volatile uint8_t *) &stats->valid));
 
 	if (__predict_false(stats->stats_updated)) {
@@ -3385,7 +3385,7 @@ mxge_close(mxge_softc_t *sc)
 	callout_stop(&sc->co_hdl);
 	sc->ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
 	old_down_cnt = sc->down_cnt;
-	mb();
+	wmb();
 	err = mxge_send_cmd(sc, MXGEFW_CMD_ETHERNET_DOWN, &cmd);
 	if (err) {
 		device_printf(sc->dev, "Couldn't bring down link\n");
@@ -3394,7 +3394,7 @@ mxge_close(mxge_softc_t *sc)
 		/* wait for down irq */
 		DELAY(10 * sc->intr_coal_delay);
 	}
-	mb();
+	wmb();
 	if (old_down_cnt == sc->down_cnt) {
 		device_printf(sc->dev, "never got down irq\n");
 	}

Modified: user/kmacy/releng_7_fast_net/sys/dev/mxge/if_mxge_var.h
==============================================================================
--- user/kmacy/releng_7_fast_net/sys/dev/mxge/if_mxge_var.h	Sun Mar  1 03:32:28 2009	(r189199)
+++ user/kmacy/releng_7_fast_net/sys/dev/mxge/if_mxge_var.h	Sun Mar  1 04:39:56 2009	(r189200)
@@ -282,6 +282,8 @@ struct mxge_media_type
 /* implement our own memory barriers, since bus_space_barrier
    cannot handle write-combining regions */
 
+#if __FreeBSD_version < 701101
+
 #if defined (__GNUC__)
   #if #cpu(i386) || defined __i386 || defined i386 || defined __i386__ || #cpu(x86_64) || defined __x86_64__
     #define mb()  __asm__ __volatile__ ("sfence;": : :"memory")
@@ -296,6 +298,8 @@ struct mxge_media_type
   #error "unknown compiler"
 #endif
 
+#endif
+
 static inline void
 mxge_pio_copy(volatile void *to_v, void *from_v, size_t size)
 {

Modified: user/kmacy/releng_7_fast_net/sys/i386/include/atomic.h
==============================================================================
--- user/kmacy/releng_7_fast_net/sys/i386/include/atomic.h	Sun Mar  1 03:32:28 2009	(r189199)
+++ user/kmacy/releng_7_fast_net/sys/i386/include/atomic.h	Sun Mar  1 04:39:56 2009	(r189200)
@@ -32,6 +32,47 @@
 #error this file needs sys/cdefs.h as a prerequisite
 #endif
 
+#if defined(_KERNEL)
+#include <machine/cpufunc.h>
+#include <machine/specialreg.h>
+#define	mb()	__asm __volatile(			\
+	"testl	%0,cpu_feature				\n\
+	je	2f					\n\
+	mfence						\n\
+1:							\n\
+	.section .text.offpath				\n\
+2:	lock						\n\
+	addl	$0,cpu_feature				\n\
+	jmp	1b					\n\
+	.text						\n\
+"							\
+	: : "i"(CPUID_SSE2) : "memory")
+#define	wmb()	__asm __volatile(			\
+	"testl	%0,cpu_feature				\n\
+	je	2f					\n\
+	sfence						\n\
+1:							\n\
+	.section .text.offpath				\n\
+2:	lock						\n\
+	addl	$0,cpu_feature				\n\
+	jmp	1b					\n\
+	.text						\n\
+"							\
+	: : "i"(CPUID_XMM) : "memory")
+#define	rmb()	__asm __volatile(			\
+	"testl	%0,cpu_feature				\n\
+	je	2f					\n\
+	lfence						\n\
+1:							\n\
+	.section .text.offpath				\n\
+2:	lock						\n\
+	addl	$0,cpu_feature				\n\
+	jmp	1b					\n\
+	.text						\n\
+"							\
+	: : "i"(CPUID_SSE2) : "memory")
+#endif
+
 /*
  * Various simple operations on memory, each of which is atomic in the
  * presence of interrupts and multiple processors.

Modified: user/kmacy/releng_7_fast_net/sys/ia64/include/atomic.h
==============================================================================
--- user/kmacy/releng_7_fast_net/sys/ia64/include/atomic.h	Sun Mar  1 03:32:28 2009	(r189199)
+++ user/kmacy/releng_7_fast_net/sys/ia64/include/atomic.h	Sun Mar  1 04:39:56 2009	(r189200)
@@ -29,6 +29,10 @@
 #ifndef _MACHINE_ATOMIC_H_
 #define	_MACHINE_ATOMIC_H_
 
+#define	mb()
+#define	wmb()
+#define	rmb()
+
 /*
  * Various simple arithmetic on memory which is atomic in the presence
  * of interrupts and SMP safe.

Modified: user/kmacy/releng_7_fast_net/sys/powerpc/include/atomic.h
==============================================================================
--- user/kmacy/releng_7_fast_net/sys/powerpc/include/atomic.h	Sun Mar  1 03:32:28 2009	(r189199)
+++ user/kmacy/releng_7_fast_net/sys/powerpc/include/atomic.h	Sun Mar  1 04:39:56 2009	(r189200)
@@ -39,6 +39,10 @@
 #define	__ATOMIC_BARRIER					\
     __asm __volatile("sync" : : : "memory")
 
+#define mb()	__ATOMIC_BARRIER
+#define	wmb()	mb()
+#define	rmb()	mb()
+
 /*
  * atomic_add(p, v)
  * { *p += v; }

Modified: user/kmacy/releng_7_fast_net/sys/sparc64/include/atomic.h
==============================================================================
--- user/kmacy/releng_7_fast_net/sys/sparc64/include/atomic.h	Sun Mar  1 03:32:28 2009	(r189199)
+++ user/kmacy/releng_7_fast_net/sys/sparc64/include/atomic.h	Sun Mar  1 04:39:56 2009	(r189200)
@@ -40,6 +40,10 @@
 #define	__ASI_ATOMIC	ASI_P
 #endif
 
+#define mb()	__asm__ __volatile__ ("membar #MemIssue": : :"memory")
+#define wmb()	mb()
+#define rmb()	mb()
+
 /*
  * Various simple arithmetic on memory which is atomic in the presence
  * of interrupts and multiple processors.  See atomic(9) for details.

Modified: user/kmacy/releng_7_fast_net/sys/sun4v/include/atomic.h
==============================================================================
--- user/kmacy/releng_7_fast_net/sys/sun4v/include/atomic.h	Sun Mar  1 03:32:28 2009	(r189199)
+++ user/kmacy/releng_7_fast_net/sys/sun4v/include/atomic.h	Sun Mar  1 04:39:56 2009	(r189200)
@@ -33,6 +33,10 @@
 
 #include <machine/cpufunc.h>
 
+#define mb()	__asm__ __volatile__ ("membar #MemIssue": : :"memory")
+#define wmb()	mb()
+#define rmb()	mb()
+
 /* Userland needs different ASI's. */
 #ifdef _KERNEL
 #define	__ASI_ATOMIC	ASI_N


More information about the svn-src-user mailing list