Current-Users archive

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

Re: Random network lossage on nfe(4)



On Thu, Apr 17, 2008 at 04:11:54PM -0400, Christos Zoulas wrote:
> On Apr 17, 10:10pm, cube%cubidou.net@localhost (Quentin Garnier) wrote:
> -- Subject: Re: Random network lossage on nfe(4)
> 
> | > So, if putting it back corrupts regular MTU frames I consider this a
> | > serious regression. Considering than 99.9% of the population runs without
> | > jumbo frames, I don't see it as a serious issue. Before my machine was
> | > completely unusable.
> | 
> | What I mean is that it hides the problem.  My 4.99.31 ran just fine with
> | the jumbo frame code in, and I do experience the issue with 4.99.58.
> 
> Hmm, perhaps the change is unrelated then. Can you enable jumbo again and
> see if it still fails?

Can anyone else try the attached patch?  It seems to do the trick for
me, from quick tests.  I'd appreciate a review from someone more
confident that I am with the kmutex_t stuff (notably, is the
mutex_create call correct?).

If my patch is indeed correct, it means the problem appeared when the
kernel was made pre-emptible.

-- 
Quentin Garnier - cube%cubidou.net@localhost - cube%NetBSD.org@localhost
"See the look on my face from staying too long in one place
[...] every time the morning breaks I know I'm closer to falling"
KT Tunstall, Saving My Face, Drastic Fantastic, 2007.
Index: if_nfe.c
===================================================================
RCS file: /cvsroot/src/sys/dev/pci/if_nfe.c,v
retrieving revision 1.33
diff -u -u -r1.33 if_nfe.c
--- if_nfe.c    17 Apr 2008 20:16:46 -0000      1.33
+++ if_nfe.c    17 Apr 2008 23:04:20 -0000
@@ -33,6 +33,7 @@
 #include <sys/types.h>
 #include <sys/sockio.h>
 #include <sys/mbuf.h>
+#include <sys/mutex.h>
 #include <sys/queue.h>
 #include <sys/kernel.h>
 #include <sys/device.h>
@@ -112,6 +113,8 @@
 CFATTACH_DECL_NEW(nfe, sizeof(struct nfe_softc), nfe_match, nfe_attach,
     NULL, NULL);
 
+/* #define NFE_NO_JUMBO */
+
 #ifdef NFE_DEBUG
 int nfedebug = 0;
 #define DPRINTF(x)     do { if (nfedebug) printf x; } while (0)
@@ -323,10 +326,12 @@
                    NFE_READ(sc, NFE_PWR2_CTL) & ~NFE_PWR2_WAKEUP_MASK);
        }
 
-#ifdef notyet
+#ifndef NFE_NO_JUMBO
        /* enable jumbo frames for adapters that support it */
-       if (sc->sc_flags & NFE_JUMBO_SUP)
+       if (sc->sc_flags & NFE_JUMBO_SUP) {
                sc->sc_flags |= NFE_USE_JUMBO;
+               mutex_init(&sc->rxq.mtx, MUTEX_SPIN, IPL_NET);
+       }
 #endif
 
        /* Check for reversed ethernet address */
@@ -1545,12 +1550,15 @@
 {
        struct nfe_jbuf *jbuf;
 
+       mutex_enter(&sc->rxq.mtx);
        jbuf = SLIST_FIRST(&sc->rxq.jfreelist);
+       if (jbuf != NULL)
+               SLIST_REMOVE_HEAD(&sc->rxq.jfreelist, jnext);
+       mutex_exit(&sc->rxq.mtx);
        if (jbuf == NULL)
                return NULL;
        sc->rxq.jbufmap[i] =
            ((char *)jbuf->buf - (char *)sc->rxq.jpool) / NFE_JBYTES;
-       SLIST_REMOVE_HEAD(&sc->rxq.jfreelist, jnext);
        return jbuf;
 }
 
@@ -1576,7 +1584,9 @@
        jbuf = &sc->rxq.jbuf[i];
 
        /* ..and put it back in the free list */
+       mutex_enter(&sc->rxq.mtx);
        SLIST_INSERT_HEAD(&sc->rxq.jfreelist, jbuf, jnext);
+       mutex_exit(&sc->rxq.mtx);
 
        if (m != NULL)
                pool_cache_put(mb_cache, m);
Index: if_nfevar.h
===================================================================
RCS file: /cvsroot/src/sys/dev/pci/if_nfevar.h,v
retrieving revision 1.8
diff -u -u -r1.8 if_nfevar.h
--- if_nfevar.h 17 Apr 2008 19:12:26 -0000      1.8
+++ if_nfevar.h 17 Apr 2008 23:04:20 -0000
@@ -64,6 +64,7 @@
        int                     bufsz;
        int                     cur;
        int                     next;
+       kmutex_t                mtx;
 };
 
 struct nfe_softc {

Attachment: pgpeNCHyVk3__.pgp
Description: PGP signature



Home | Main Index | Thread Index | Old Index