Current-Users archive

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

Re: sk/skc/makphy breakage on current



In Message <200806171218.m5HCI1lx004729%wheel.duzan.org@localhost> ,
   Gary Duzan <gary%duzan.org@localhost> wrote:

=>In Message <20080617115344.GD25752%taryn.cubidou.net@localhost> ,
=>   Quentin Garnier <cube%cubidou.net@localhost> wrote:
=>
=>=>On Tue, Jun 17, 2008 at 06:20:31AM -0400, Jared D. McNeill wrote:
=>=>> On Tue, 17 Jun 2008, Quentin Garnier wrote:
=>=>>> Try the attached patch.  Beware, not even test-compiled :)
=>=>>
=>=>>> +       mutex_leave(&sc_if->sc_jpool_mtx);
=>=>>
=>=>> mutex_exit? :)
=>=>
=>=>Heh, yeah, that's probably better.  The idea was there.
=>
=>   Ok, I'll give the patch plus suggested changes a try when I get
=>home this evening (US/Eastern, UTC-4).

   I've applied the patch with a few tweaks to get it to compile,
and things do seem more stable now. The final patch is included
below.

   Thanks.

                                        Gary Duzan



Index: sys/dev/pci/if_sk.c
===================================================================
RCS file: /usr2/netbsd-cvs/src/sys/dev/pci/if_sk.c,v
retrieving revision 1.49
diff -b -u -p -r1.49 if_sk.c
--- sys/dev/pci/if_sk.c 28 Apr 2008 20:23:55 -0000      1.49
+++ sys/dev/pci/if_sk.c 18 Jun 2008 01:12:25 -0000
@@ -125,6 +125,7 @@ __KERNEL_RCSID(0, "$NetBSD: if_sk.c,v 1.
 #include <sys/sockio.h>
 #include <sys/mbuf.h>
 #include <sys/malloc.h>
+#include <sys/mutex.h>
 #include <sys/kernel.h>
 #include <sys/socket.h>
 #include <sys/device.h>
@@ -858,6 +859,7 @@ sk_alloc_jumbo_mem(struct sk_if_softc *s
 
        LIST_INIT(&sc_if->sk_jfree_listhead);
        LIST_INIT(&sc_if->sk_jinuse_listhead);
+       mutex_init(&sc_if->sk_jpool_mtx, MUTEX_DEFAULT, IPL_NET);
 
        /*
         * Now divide it up into 9K pieces and save the addresses
@@ -912,13 +914,17 @@ sk_jalloc(struct sk_if_softc *sc_if)
 {
        struct sk_jpool_entry   *entry;
 
+       mutex_enter(&sc_if->sk_jpool_mtx);
        entry = LIST_FIRST(&sc_if->sk_jfree_listhead);
 
-       if (entry == NULL)
+       if (entry == NULL) {
+               mutex_exit(&sc_if->sk_jpool_mtx);
                return NULL;
+       }
 
        LIST_REMOVE(entry, jpool_entries);
        LIST_INSERT_HEAD(&sc_if->sk_jinuse_listhead, entry, jpool_entries);
+       mutex_exit(&sc_if->sk_jpool_mtx);
        return sc_if->sk_cdata.sk_jslots[entry->slot];
 }
 
@@ -930,7 +936,7 @@ sk_jfree(struct mbuf *m, void *buf, size
 {
        struct sk_jpool_entry *entry;
        struct sk_if_softc *sc;
-       int i, s;
+       int i;
 
        /* Extract the softc struct pointer. */
        sc = (struct sk_if_softc *)arg;
@@ -946,17 +952,17 @@ sk_jfree(struct mbuf *m, void *buf, size
        if ((i < 0) || (i >= SK_JSLOTS))
                panic("sk_jfree: asked to free buffer that we don't manage!");
 
-       s = splvm();
+       mutex_enter(&sc->sk_jpool_mtx);
        entry = LIST_FIRST(&sc->sk_jinuse_listhead);
        if (entry == NULL)
                panic("sk_jfree: buffer not in use!");
        entry->slot = i;
        LIST_REMOVE(entry, jpool_entries);
        LIST_INSERT_HEAD(&sc->sk_jfree_listhead, entry, jpool_entries);
+       mutex_exit(&sc->sk_jpool_mtx);
 
        if (__predict_true(m != NULL))
                pool_cache_put(mb_cache, m);
-       splx(s);
 }
 
 /*
Index: sys/dev/pci/if_skvar.h
===================================================================
RCS file: /usr2/netbsd-cvs/src/sys/dev/pci/if_skvar.h,v
retrieving revision 1.13
diff -b -u -p -r1.13 if_skvar.h
--- sys/dev/pci/if_skvar.h      28 Apr 2008 20:23:55 -0000      1.13
+++ sys/dev/pci/if_skvar.h      18 Jun 2008 01:12:25 -0000
@@ -232,6 +232,7 @@ struct sk_if_softc {
        struct sk_softc         *sk_softc;      /* parent controller */
        int                     sk_tx_bmu;      /* TX BMU register */
        int                     sk_if_flags;
+       kmutex_t                sk_jpool_mtx;
        LIST_HEAD(__sk_jfreehead, sk_jpool_entry)       sk_jfree_listhead;
        LIST_HEAD(__sk_jinusehead, sk_jpool_entry)      sk_jinuse_listhead;
        SIMPLEQ_HEAD(__sk_txmaphead, sk_txmap_entry) sk_txmap_head;


Home | Main Index | Thread Index | Old Index