Date: Sat, 7 Mar 2009 12:11:46 -0800 From: Kip Macy <kmacy@freebsd.org> To: Ivan Voras <ivoras@freebsd.org> Cc: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: Re: svn commit: r189470 - in user/kmacy/releng_7_net_backport/sys: amd64/include arm/include dev/bce dev/mxge i386/include ia64/include powerpc/include sparc64/include sun4v/include Message-ID: <3c1674c90903071211y29ea8ee6u412352faf9cd108f@mail.gmail.com> In-Reply-To: <9bbcef730903070240t2068f43em9b0017b10ba992e4@mail.gmail.com> References: <200903070118.n271IL5p034118@svn.freebsd.org> <9bbcef730903070240t2068f43em9b0017b10ba992e4@mail.gmail.com>
index | next in thread | previous in thread | raw e-mail
The names are what are used in Linux. There are a number of drivers in the tree that share code with Linux that #define them in a platform dependent way. -Kip On Sat, Mar 7, 2009 at 2:40 AM, Ivan Voras <ivoras@freebsd.org> wrote: > Hi, > > Are these names taken from some standard? I'm not strongly arguing > against them but naming something "mb" and such introduces great > potential for conflicts with local code. (Not the actual choice of > letters but that they are two and three-characters long identifiers). > Maybe something like membar, membar_read, membar_write would be > better? > > But I see this is merged from existing code so it's probably too late... > > > 2009/3/7 Kip Macy <kmacy@freebsd.org>: >> Author: kmacy >> Date: Sat Mar 7 01:18:21 2009 >> New Revision: 189470 >> URL: http://svn.freebsd.org/changeset/base/189470 >> >> Log: >> multiq step 1: >> - atomic_barriers: add atomic barriers to atomic.h on all architectures >> >> Modified: >> user/kmacy/releng_7_net_backport/sys/amd64/include/atomic.h >> user/kmacy/releng_7_net_backport/sys/arm/include/atomic.h >> user/kmacy/releng_7_net_backport/sys/dev/bce/if_bcereg.h >> user/kmacy/releng_7_net_backport/sys/dev/mxge/if_mxge.c >> user/kmacy/releng_7_net_backport/sys/dev/mxge/if_mxge_var.h >> user/kmacy/releng_7_net_backport/sys/i386/include/atomic.h >> user/kmacy/releng_7_net_backport/sys/ia64/include/atomic.h >> user/kmacy/releng_7_net_backport/sys/powerpc/include/atomic.h >> user/kmacy/releng_7_net_backport/sys/sparc64/include/atomic.h >> user/kmacy/releng_7_net_backport/sys/sun4v/include/atomic.h >> >> Modified: user/kmacy/releng_7_net_backport/sys/amd64/include/atomic.h >> ============================================================================== >> --- user/kmacy/releng_7_net_backport/sys/amd64/include/atomic.h Sat Mar 7 01:17:13 2009 (r189469) >> +++ user/kmacy/releng_7_net_backport/sys/amd64/include/atomic.h Sat Mar 7 01:18:21 2009 (r189470) >> @@ -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_net_backport/sys/arm/include/atomic.h >> ============================================================================== >> --- user/kmacy/releng_7_net_backport/sys/arm/include/atomic.h Sat Mar 7 01:17:13 2009 (r189469) >> +++ user/kmacy/releng_7_net_backport/sys/arm/include/atomic.h Sat Mar 7 01:18:21 2009 (r189470) >> @@ -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_net_backport/sys/dev/bce/if_bcereg.h >> ============================================================================== >> --- user/kmacy/releng_7_net_backport/sys/dev/bce/if_bcereg.h Sat Mar 7 01:17:13 2009 (r189469) >> +++ user/kmacy/releng_7_net_backport/sys/dev/bce/if_bcereg.h Sat Mar 7 01:18:21 2009 (r189470) >> @@ -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_net_backport/sys/dev/mxge/if_mxge.c >> ============================================================================== >> --- user/kmacy/releng_7_net_backport/sys/dev/mxge/if_mxge.c Sat Mar 7 01:17:13 2009 (r189469) >> +++ user/kmacy/releng_7_net_backport/sys/dev/mxge/if_mxge.c Sat Mar 7 01:18:21 2009 (r189470) >> @@ -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_net_backport/sys/dev/mxge/if_mxge_var.h >> ============================================================================== >> --- user/kmacy/releng_7_net_backport/sys/dev/mxge/if_mxge_var.h Sat Mar 7 01:17:13 2009 (r189469) >> +++ user/kmacy/releng_7_net_backport/sys/dev/mxge/if_mxge_var.h Sat Mar 7 01:18:21 2009 (r189470) >> @@ -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_net_backport/sys/i386/include/atomic.h >> ============================================================================== >> --- user/kmacy/releng_7_net_backport/sys/i386/include/atomic.h Sat Mar 7 01:17:13 2009 (r189469) >> +++ user/kmacy/releng_7_net_backport/sys/i386/include/atomic.h Sat Mar 7 01:18:21 2009 (r189470) >> @@ -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_net_backport/sys/ia64/include/atomic.h >> ============================================================================== >> --- user/kmacy/releng_7_net_backport/sys/ia64/include/atomic.h Sat Mar 7 01:17:13 2009 (r189469) >> +++ user/kmacy/releng_7_net_backport/sys/ia64/include/atomic.h Sat Mar 7 01:18:21 2009 (r189470) >> @@ -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_net_backport/sys/powerpc/include/atomic.h >> ============================================================================== >> --- user/kmacy/releng_7_net_backport/sys/powerpc/include/atomic.h Sat Mar 7 01:17:13 2009 (r189469) >> +++ user/kmacy/releng_7_net_backport/sys/powerpc/include/atomic.h Sat Mar 7 01:18:21 2009 (r189470) >> @@ -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_net_backport/sys/sparc64/include/atomic.h >> ============================================================================== >> --- user/kmacy/releng_7_net_backport/sys/sparc64/include/atomic.h Sat Mar 7 01:17:13 2009 (r189469) >> +++ user/kmacy/releng_7_net_backport/sys/sparc64/include/atomic.h Sat Mar 7 01:18:21 2009 (r189470) >> @@ -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_net_backport/sys/sun4v/include/atomic.h >> ============================================================================== >> --- user/kmacy/releng_7_net_backport/sys/sun4v/include/atomic.h Sat Mar 7 01:17:13 2009 (r189469) >> +++ user/kmacy/releng_7_net_backport/sys/sun4v/include/atomic.h Sat Mar 7 01:18:21 2009 (r189470) >> @@ -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 >> >help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3c1674c90903071211y29ea8ee6u412352faf9cd108f>
