Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/rump/net/lib/libshmif Make shmif memory access slightly ...



details:   https://anonhg.NetBSD.org/src/rev/72f81b8d6148
branches:  trunk
changeset: 757062:72f81b8d6148
user:      pooka <pooka%NetBSD.org@localhost>
date:      Thu Aug 12 17:33:55 2010 +0000

description:
Make shmif memory access slightly more sane.  Create a header which
is shared by the interface and the bus analyzer.

diffstat:

 sys/rump/net/lib/libshmif/dumpbus.c  |  33 +++++++++-------------
 sys/rump/net/lib/libshmif/if_shmem.c |  51 +++++++++++++++--------------------
 sys/rump/net/lib/libshmif/shmifvar.h |  45 +++++++++++++++++++++++++++++++
 3 files changed, 81 insertions(+), 48 deletions(-)

diffs (294 lines):

diff -r a344273a5464 -r 72f81b8d6148 sys/rump/net/lib/libshmif/dumpbus.c
--- a/sys/rump/net/lib/libshmif/dumpbus.c       Thu Aug 12 17:23:23 2010 +0000
+++ b/sys/rump/net/lib/libshmif/dumpbus.c       Thu Aug 12 17:33:55 2010 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: dumpbus.c,v 1.2 2010/08/12 17:00:41 pooka Exp $        */
+/*     $NetBSD: dumpbus.c,v 1.3 2010/08/12 17:33:55 pooka Exp $        */
 
 /*
  * Little utility to convert shmif bus traffic to a pcap file
@@ -9,6 +9,7 @@
 #include <sys/mman.h>
 #include <sys/stat.h>
 
+#include <assert.h>
 #include <err.h>
 #include <fcntl.h>
 #include <pcap.h>
@@ -17,13 +18,7 @@
 #include <string.h>
 #include <unistd.h>
 
-/* XXX: sync with driver */
-struct bushdr {
-       uint32_t lock;
-       uint32_t gen;
-       uint32_t last;
-       uint32_t version;
-};
+#include "shmifvar.h"
 
 static void
 usage(void)
@@ -40,8 +35,9 @@
        void *busmem;
        const char *pcapfile = NULL;
        uint8_t *curbus, *buslast;
-       struct bushdr *bhdr;
+       struct shmif_mem *bmem;
        int fd, pfd, i, ch;
+       uint32_t pktlen;
 
        while ((ch = getopt(argc, argv, "p:")) != -1) {
                switch (ch) {
@@ -70,13 +66,13 @@
        if (busmem == MAP_FAILED)
                err(1, "mmap");
 
-       bhdr = busmem;
-       if (bhdr->version != 1)
-               errx(1, "cannot handle bus version %d", bhdr->version);
+       bmem = busmem;
+       if (bmem->shm_version != 1)
+               errx(1, "cannot handle bus version %d", bmem->shm_version);
        printf("bus version %d, lock: %d, generation: %d, lastoff: 0x%x\n",
-           bhdr->version, bhdr->lock, bhdr->gen, bhdr->last);
+           bmem->shm_version, bmem->shm_lock, bmem->shm_gen, bmem->shm_last);
 
-       if (bhdr->gen != 0) {
+       if (bmem->shm_gen != 0) {
                printf("this dumper can manage only generation 0, sorry\n");
                exit(0);
        }
@@ -99,13 +95,12 @@
                        err(1, "phdr write");
        }
        
-       curbus = busmem;
-       buslast = curbus + bhdr->last;
-       curbus += sizeof(*bhdr);
+       curbus = bmem->shm_data;
+       buslast = bmem->shm_data + bmem->shm_last;
+       assert(sizeof(pktlen) == PKTLEN_SIZE);
 
        i = 0;
        while (curbus <= buslast) {
-               uint32_t pktlen;
                struct pcap_pkthdr packhdr;
 
                pktlen = *(uint32_t *)curbus;
@@ -116,7 +111,7 @@
                        continue;
 
                printf("packet %d, offset 0x%x, length 0x%x\n",
-                   i++, curbus - (uint8_t *)(bhdr + 1), pktlen);
+                   i++, curbus - (uint8_t *)(bmem + 1), pktlen);
 
                if (!pcapfile || pktlen == 0) {
                        curbus += pktlen;
diff -r a344273a5464 -r 72f81b8d6148 sys/rump/net/lib/libshmif/if_shmem.c
--- a/sys/rump/net/lib/libshmif/if_shmem.c      Thu Aug 12 17:23:23 2010 +0000
+++ b/sys/rump/net/lib/libshmif/if_shmem.c      Thu Aug 12 17:33:55 2010 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if_shmem.c,v 1.15 2010/08/11 12:10:39 pooka Exp $      */
+/*     $NetBSD: if_shmem.c,v 1.16 2010/08/12 17:33:55 pooka Exp $      */
 
 /*
  * Copyright (c) 2009 Antti Kantee.  All Rights Reserved.
@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_shmem.c,v 1.15 2010/08/11 12:10:39 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_shmem.c,v 1.16 2010/08/12 17:33:55 pooka Exp $");
 
 #include <sys/param.h>
 #include <sys/atomic.h>
@@ -66,27 +66,20 @@
 static void    shmif_start(struct ifnet *);
 static void    shmif_stop(struct ifnet *, int);
 
+#include "shmifvar.h"
+
 struct shmif_sc {
        struct ethercom sc_ec;
        uint8_t sc_myaddr[6];
-       uint8_t *sc_busmem;
+       struct shmif_mem *sc_busmem;
        int sc_memfd;
        int sc_kq;
 
        uint32_t sc_nextpacket;
        uint32_t sc_prevgen;
 };
-#define IFMEM_LOCK             (0x00)
-#define IFMEM_GENERATION       (0x04)
-#define IFMEM_LASTPACKET       (0x08)
-#define IFMEM_WAKEUP           (0x0c)
-#define IFMEM_BUSVERSION       IFMEM_WAKEUP
-#define IFMEM_DATA             (0x10)
-
-#define BUSCTRL_ATOFF(sc, off) ((uint32_t *)(sc->sc_busmem+(off)))
 
 #define BUSMEM_SIZE (1024*1024) /* need write throttling? */
-#define PKTLEN_SIZE 4
 
 /* just in case ... */
 static const uint32_t busversion = 1;
@@ -107,7 +100,7 @@
 lockbus(struct shmif_sc *sc)
 {
 
-       while (atomic_cas_32((uint32_t *)sc->sc_busmem,
+       while (atomic_cas_32(&sc->sc_busmem->shm_lock,
            LOCK_UNLOCKED, LOCK_LOCKED) == LOCK_LOCKED)
                continue;
        membar_enter();
@@ -119,7 +112,7 @@
        unsigned int old;
 
        membar_exit();
-       old = atomic_swap_32((uint32_t *)sc->sc_busmem, LOCK_UNLOCKED);
+       old = atomic_swap_32(&sc->sc_busmem->shm_lock, LOCK_UNLOCKED);
        KASSERT(old == LOCK_LOCKED);
 }
 
@@ -130,7 +123,7 @@
 
        KASSERT(len < (BUSMEM_SIZE - IFMEM_DATA) && off <= BUSMEM_SIZE);
        chunk = MIN(len, BUSMEM_SIZE - off);
-       memcpy(dest, sc->sc_busmem + off, chunk);
+       memcpy(dest, (uint8_t *)sc->sc_busmem + off, chunk);
        len -= chunk;
 
        if (len == 0)
@@ -138,10 +131,10 @@
 
        /* else, wraps around */
        off = IFMEM_DATA;
-       sc->sc_prevgen = *BUSCTRL_ATOFF(sc, IFMEM_GENERATION);
+       sc->sc_prevgen = sc->sc_busmem->shm_gen;
 
        /* finish reading */
-       memcpy((uint8_t *)dest + chunk, sc->sc_busmem + off, len);
+       memcpy((uint8_t *)dest + chunk, (uint8_t *)sc->sc_busmem + off, len);
        return off + len;
 }
 
@@ -154,7 +147,7 @@
            && off >= IFMEM_DATA);
 
        chunk = MIN(len, BUSMEM_SIZE - off);
-       memcpy(sc->sc_busmem + off, data, chunk);
+       memcpy((uint8_t *)sc->sc_busmem + off, data, chunk);
        len -= chunk;
 
        if (len == 0)
@@ -165,11 +158,11 @@
 
        /* else, wraps around */
        off = IFMEM_DATA;
-       (*BUSCTRL_ATOFF(sc, IFMEM_GENERATION))++;
-       sc->sc_prevgen = *BUSCTRL_ATOFF(sc, IFMEM_GENERATION);
+       sc->sc_prevgen = sc->sc_busmem->shm_gen;
+       sc->sc_busmem->shm_gen++;
 
        /* finish writing */
-       memcpy(sc->sc_busmem + off, (uint8_t *)data + chunk, len);
+       memcpy((uint8_t *)sc->sc_busmem + off, (uint8_t *)data + chunk, len);
        return off + len;
 }
 
@@ -224,10 +217,10 @@
                goto fail;
 
        lockbus(sc);
-       if (*BUSCTRL_ATOFF(sc, IFMEM_LASTPACKET) == 0)
-               *BUSCTRL_ATOFF(sc, IFMEM_LASTPACKET) = IFMEM_DATA;
-       sc->sc_nextpacket = *BUSCTRL_ATOFF(sc, IFMEM_LASTPACKET);
-       sc->sc_prevgen = *BUSCTRL_ATOFF(sc, IFMEM_GENERATION);
+       if (sc->sc_busmem->shm_last == 0)
+               sc->sc_busmem->shm_last = IFMEM_DATA;
+       sc->sc_nextpacket = sc->sc_busmem->shm_last;
+       sc->sc_prevgen = sc->sc_busmem->shm_gen;
        unlockbus(sc);
 
        sc->sc_kq = rumpuser_writewatchfile_setup(-1, sc->sc_memfd, 0, &error);
@@ -306,7 +299,7 @@
                }
 
                lockbus(sc);
-               lastoff = *BUSCTRL_ATOFF(sc, IFMEM_LASTPACKET);
+               lastoff = sc->sc_busmem->shm_last;
 
                npktlenoff = nextpktoff(sc, lastoff);
                dataoff = advance(npktlenoff, PKTLEN_SIZE);
@@ -317,7 +310,7 @@
                            m->m_len);
                }
                buswrite(sc, npktlenoff, &pktsize, PKTLEN_SIZE);
-               *BUSCTRL_ATOFF(sc, IFMEM_LASTPACKET) = npktlenoff;
+               sc->sc_busmem->shm_last = npktlenoff;
                unlockbus(sc);
 
                m_freem(m0);
@@ -359,8 +352,8 @@
 
                KASSERT(m->m_flags & M_EXT);
                lockbus(sc);
-               lastpkt = *BUSCTRL_ATOFF(sc, IFMEM_LASTPACKET);
-               busgen = *BUSCTRL_ATOFF(sc, IFMEM_GENERATION);
+               lastpkt = sc->sc_busmem->shm_last;
+               busgen = sc->sc_busmem->shm_gen;
                lastnext = nextpktoff(sc, lastpkt);
                if ((lastnext > sc->sc_nextpacket && busgen > sc->sc_prevgen)
                    || (busgen > sc->sc_prevgen+1)) {
diff -r a344273a5464 -r 72f81b8d6148 sys/rump/net/lib/libshmif/shmifvar.h
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/rump/net/lib/libshmif/shmifvar.h      Thu Aug 12 17:33:55 2010 +0000
@@ -0,0 +1,45 @@
+/*     $NetBSD: shmifvar.h,v 1.1 2010/08/12 17:33:55 pooka Exp $       */
+
+/*-
+ * Copyright (c) 2009 Antti Kantee.  All Rights Reserved.
+ *
+ * Development of this software was supported by The Nokia Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _RUMP_NET_SHMIFVAR_H_
+#define _RUMP_NET_SHMIFVAR_H_
+
+struct shmif_mem {
+       uint32_t shm_lock;
+       uint32_t shm_gen;
+       uint32_t shm_last;
+       uint32_t shm_version;
+       uint8_t shm_data[0];
+};
+
+#define IFMEM_DATA     (offsetof(struct shmif_mem, shm_data))
+#define IFMEM_WAKEUP   (offsetof(struct shmif_mem, shm_version))
+#define PKTLEN_SIZE    (sizeof(uint32_t))
+
+#endif



Home | Main Index | Thread Index | Old Index