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 simplify, improve, etc.



details:   https://anonhg.NetBSD.org/src/rev/9e730b9bd735
branches:  trunk
changeset: 757153:9e730b9bd735
user:      pooka <pooka%NetBSD.org@localhost>
date:      Mon Aug 16 17:33:52 2010 +0000

description:
simplify, improve, etc.

diffstat:

 sys/rump/net/lib/libshmif/if_shmem.c     |  116 +++++++++++++++++++-----------
 sys/rump/net/lib/libshmif/shmif_busops.c |   16 +--
 2 files changed, 79 insertions(+), 53 deletions(-)

diffs (286 lines):

diff -r 563b03895937 -r 9e730b9bd735 sys/rump/net/lib/libshmif/if_shmem.c
--- a/sys/rump/net/lib/libshmif/if_shmem.c      Mon Aug 16 17:29:52 2010 +0000
+++ b/sys/rump/net/lib/libshmif/if_shmem.c      Mon Aug 16 17:33:52 2010 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if_shmem.c,v 1.25 2010/08/15 21:57:58 pooka Exp $      */
+/*     $NetBSD: if_shmem.c,v 1.26 2010/08/16 17:33:52 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.25 2010/08/15 21:57:58 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_shmem.c,v 1.26 2010/08/16 17:33:52 pooka Exp $");
 
 #include <sys/param.h>
 #include <sys/atomic.h>
@@ -69,8 +69,8 @@
        int sc_memfd;
        int sc_kq;
 
+       uint64_t sc_devgen;
        uint32_t sc_nextpacket;
-       uint32_t sc_prevgen;
 };
 
 static const uint32_t busversion = SHMIF_VERSION;
@@ -157,7 +157,7 @@
        }
 
        sc->sc_nextpacket = sc->sc_busmem->shm_last;
-       sc->sc_prevgen = sc->sc_busmem->shm_gen;
+       sc->sc_devgen = sc->sc_busmem->shm_gen;
        shmif_unlockbus(sc->sc_busmem);
 
        sc->sc_kq = rumpuser_writewatchfile_setup(-1, sc->sc_memfd, 0, &error);
@@ -171,7 +171,7 @@
        ifp->if_ioctl = shmif_ioctl;
        ifp->if_start = shmif_start;
        ifp->if_stop = shmif_stop;
-       ifp->if_mtu = 1518;
+       ifp->if_mtu = ETHERMTU;
 
        if_attach(ifp);
        ether_ifattach(ifp, enaddr);
@@ -223,13 +223,16 @@
 shmif_start(struct ifnet *ifp)
 {
        struct shmif_sc *sc = ifp->if_softc;
+       struct shmif_mem *busmem = sc->sc_busmem;
        struct mbuf *m, *m0;
-       uint32_t lastoff, dataoff, npktlenoff;
-       uint32_t pktsize;
+       uint32_t dataoff;
+       uint32_t pktsize, pktwrote;
        bool wrote = false;
        bool wrap;
        int error;
 
+       ifp->if_flags |= IFF_OACTIVE;
+
        for (;;) {
                struct shmif_pkthdr sp;
                struct timeval tv;
@@ -243,29 +246,31 @@
                for (m = m0; m != NULL; m = m->m_next) {
                        pktsize += m->m_len;
                }
+               KASSERT(pktsize <= ETHERMTU + ETHER_HDR_LEN);
 
                getmicrouptime(&tv);
-
                sp.sp_len = pktsize;
                sp.sp_sec = tv.tv_sec;
                sp.sp_usec = tv.tv_usec;
 
-               shmif_lockbus(sc->sc_busmem);
-               lastoff = sc->sc_busmem->shm_last;
-               npktlenoff = shmif_nextpktoff(sc->sc_busmem, lastoff);
+               shmif_lockbus(busmem);
+               KASSERT(busmem->shm_magic == SHMIF_MAGIC);
+               busmem->shm_last = shmif_nextpktoff(busmem, busmem->shm_last);
 
                wrap = false;
-               dataoff = shmif_buswrite(sc->sc_busmem,
-                   npktlenoff, &sp, sizeof(sp), &wrap);
+               dataoff = shmif_buswrite(busmem,
+                   busmem->shm_last, &sp, sizeof(sp), &wrap);
+               pktwrote = 0;
                for (m = m0; m != NULL; m = m->m_next) {
-                       dataoff = shmif_buswrite(sc->sc_busmem, dataoff,
+                       pktwrote += m->m_len;
+                       dataoff = shmif_buswrite(busmem, dataoff,
                            mtod(m, void *), m->m_len, &wrap);
                }
+               KASSERT(pktwrote == pktsize);
 
                if (wrap)
-                       sc->sc_busmem->shm_gen++;
-               sc->sc_busmem->shm_last = npktlenoff;
-               shmif_unlockbus(sc->sc_busmem);
+                       busmem->shm_gen++;
+               shmif_unlockbus(busmem);
 
                m_freem(m0);
                wrote = true;
@@ -273,6 +278,9 @@
                DPRINTF(("shmif_start: send %d bytes at off %d\n",
                    pktsize, npktlenoff));
        }
+
+       ifp->if_flags &= ~IFF_OACTIVE;
+
        /* wakeup */
        if (wrote)
                rumpuser_pwrite(sc->sc_memfd,
@@ -291,9 +299,10 @@
 {
        struct ifnet *ifp = arg;
        struct shmif_sc *sc = ifp->if_softc;
+       struct shmif_mem *busmem = sc->sc_busmem;
        struct mbuf *m = NULL;
        struct ether_header *eth;
-       uint32_t nextpkt, lastpkt, busgen, lastnext;
+       uint32_t nextpkt, busgen;
        bool wrap;
        int error;
 
@@ -305,26 +314,19 @@
                        MCLGET(m, M_WAIT);
                }
 
-               DPRINTF(("waiting %d/%d\n", sc->sc_nextpacket, sc->sc_prevgen));
-
+               DPRINTF(("waiting %d/%d\n", sc->sc_nextpacket, sc->sc_devgen));
                KASSERT(m->m_flags & M_EXT);
-               shmif_lockbus(sc->sc_busmem);
-               lastpkt = sc->sc_busmem->shm_last;
-               busgen = sc->sc_busmem->shm_gen;
-               lastnext = shmif_nextpktoff(sc->sc_busmem, lastpkt);
-               if ((lastnext > sc->sc_nextpacket && busgen > sc->sc_prevgen)
-                   || (busgen > sc->sc_prevgen+1)) {
-                       nextpkt = lastpkt;
-                       sc->sc_prevgen = busgen;
-                       rumpuser_dprintf("shmif_rcv: generation overrun, "
-                           "skipping invalid packets\n");
-               } else {
-                       nextpkt = sc->sc_nextpacket;
-               }
+
+               shmif_lockbus(busmem);
+               busgen = busmem->shm_gen;
+               KASSERT(busmem->shm_magic == SHMIF_MAGIC);
+               KASSERT(busgen >= sc->sc_devgen);
 
                /* need more data? */
-               if (lastnext == nextpkt && sc->sc_prevgen == busgen){
-                       shmif_unlockbus(sc->sc_busmem);
+               if (sc->sc_devgen == busgen && 
+                   shmif_nextpktoff(busmem, busmem->shm_last)
+                    == sc->sc_nextpacket) {
+                       shmif_unlockbus(busmem);
                        error = 0;
                        rumpuser_writewatchfile_wait(sc->sc_kq, NULL, &error);
                        if (__predict_false(error))
@@ -332,22 +334,48 @@
                        continue;
                }
 
+               /*
+                * Check if we have been sleeping too long.  There are
+                * basically two scenarios:
+                *  1) our next packet is behind the first packet and
+                *     we are a generation behind
+                *  2) we are over two generations behind
+                */
+               if ((sc->sc_nextpacket < busmem->shm_first
+                 && sc->sc_devgen < busgen) || (sc->sc_devgen+1 < busgen)) {
+                       KASSERT(busgen > 0);
+                       nextpkt = busmem->shm_first;
+                       if (busmem->shm_first > busmem->shm_last)
+                               sc->sc_devgen = busgen - 1;
+                       else
+                               sc->sc_devgen = busgen;
+               } else {
+                       nextpkt = sc->sc_nextpacket;
+               }
+
+               /*
+                * If our read pointer is ahead the bus last write, our
+                * generation must be one behind.
+                */
+               KASSERT(!(nextpkt > busmem->shm_last
+                   && sc->sc_devgen == busgen));
+
                wrap = false;
-               shmif_busread(sc->sc_busmem,
-                   &sp, nextpkt, sizeof(sp), &wrap);
-               KASSERT(sp.sp_len <= MCLBYTES);
-               shmif_busread(sc->sc_busmem, mtod(m, void *),
-                   shmif_advance(nextpkt, sizeof(sp)), sp.sp_len, &wrap);
-               if (wrap)
-                       sc->sc_prevgen = sc->sc_busmem->shm_gen;
+               nextpkt = shmif_busread(busmem, &sp,
+                   nextpkt, sizeof(sp), &wrap);
+               KASSERT(sp.sp_len <= ETHERMTU + ETHER_HDR_LEN);
+               nextpkt = shmif_busread(busmem, mtod(m, void *),
+                   nextpkt, sp.sp_len, &wrap);
 
                DPRINTF(("shmif_rcv: read packet of length %d at %d\n",
                    sp.sp_len, nextpkt));
 
-               sc->sc_nextpacket = shmif_nextpktoff(sc->sc_busmem, nextpkt);
-               sc->sc_prevgen = busgen;
+               sc->sc_nextpacket = nextpkt;
                shmif_unlockbus(sc->sc_busmem);
 
+               if (wrap)
+                       sc->sc_devgen++;
+
                m->m_len = m->m_pkthdr.len = sp.sp_len;
                m->m_pkthdr.rcvif = ifp;
 
diff -r 563b03895937 -r 9e730b9bd735 sys/rump/net/lib/libshmif/shmif_busops.c
--- a/sys/rump/net/lib/libshmif/shmif_busops.c  Mon Aug 16 17:29:52 2010 +0000
+++ b/sys/rump/net/lib/libshmif/shmif_busops.c  Mon Aug 16 17:33:52 2010 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: shmif_busops.c,v 1.4 2010/08/15 18:55:03 pooka Exp $   */
+/*     $NetBSD: shmif_busops.c,v 1.5 2010/08/16 17:33:52 pooka Exp $   */
 
 /*
  * Copyright (c) 2009 Antti Kantee.  All Rights Reserved.
@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: shmif_busops.c,v 1.4 2010/08/15 18:55:03 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: shmif_busops.c,v 1.5 2010/08/16 17:33:52 pooka Exp $");
 
 #include <sys/param.h>
 #include <sys/atomic.h>
@@ -49,9 +49,8 @@
 
        newoff = oldoff + delta;
        if (newoff >= BUSMEM_DATASIZE)
-               newoff -= (BUSMEM_DATASIZE);
+               newoff -= BUSMEM_DATASIZE;
        return newoff;
-
 }
 
 uint32_t
@@ -60,7 +59,7 @@
 {
        size_t chunk;
 
-       KASSERT(len < (BUSMEM_DATASIZE) && off <= BUSMEM_DATASIZE);
+       KASSERT(len < (BUSMEM_DATASIZE/2) && off <= BUSMEM_DATASIZE);
        chunk = MIN(len, BUSMEM_DATASIZE - off);
        memcpy(dest, busmem->shm_data + off, chunk);
        len -= chunk;
@@ -69,12 +68,11 @@
                return off + chunk;
 
        /* else, wraps around */
-       off = 0;
        *wrap = true;
 
        /* finish reading */
-       memcpy((uint8_t *)dest + chunk, busmem->shm_data + off, len);
-       return off + len;
+       memcpy((uint8_t *)dest + chunk, busmem->shm_data, len);
+       return len;
 }
 
 void
@@ -95,7 +93,7 @@
 {
        size_t chunk;
 
-       KASSERT(len < (BUSMEM_DATASIZE) && off <= BUSMEM_DATASIZE);
+       KASSERT(len < (BUSMEM_DATASIZE/2) && off <= BUSMEM_DATASIZE);
 
        chunk = MIN(len, BUSMEM_DATASIZE - off);
        len -= chunk;



Home | Main Index | Thread Index | Old Index