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
Robert Watson
rwatson at FreeBSD.org
Sat Mar 7 14:19:11 PST 2009
On Sat, 7 Mar 2009, Kip Macy wrote:
> 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.
As long as the definitions are consistently _KERNEL-only, I don't see that
this is a problem; however, we should not expose them to user applications.
Robert N M Watson
Computer Laboratory
University of Cambridge
>
> -Kip
>
> On Sat, Mar 7, 2009 at 2:40 AM, Ivan Voras <ivoras at 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 at 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
>>>
>>
>
More information about the svn-src-user
mailing list