Now without the malloc ... suggested by blambert@

Index: if_bnx.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/if_bnx.c,v
retrieving revision 1.100
diff -N -u -p if_bnx.c
--- if_bnx.c    13 Jan 2013 05:45:10 -0000      1.100
+++ if_bnx.c    22 Jan 2013 15:10:53 -0000
@@ -388,10 +388,11 @@ void      bnx_iff(struct bnx_softc *);
 void   bnx_stats_update(struct bnx_softc *);
 void   bnx_tick(void *);
 
-struct rwlock bnx_tx_pool_lk = RWLOCK_INITIALIZER("bnxplinit");
-struct pool *bnx_tx_pool = NULL;
+struct pool bnx_tx_pool;
+int    bnx_tx_pool_init;
 void   bnx_alloc_pkts(void *, void *);
 
+
 /****************************************************************************/
 /* OpenBSD device dispatch table.                                           */
 /****************************************************************************/
@@ -654,6 +655,12 @@ bnx_attach(struct device *parent, struct device *self,
 
        sc->bnx_pa = *pa;
 
+       if (!bnx_tx_pool_init) {
+               pool_init(&bnx_tx_pool, sizeof(struct bnx_pkt), 0, 0, 0,
+                   "bnxpkts", &pool_allocator_nointr);
+               bnx_tx_pool_init = 1;
+       }
+
        /*
         * Map control/status registers.
        */
@@ -3766,13 +3773,13 @@ bnx_alloc_pkts(void *xsc, void *arg)
        int s;
 
        for (i = 0; i < 4; i++) { /* magic! */
-               pkt = pool_get(bnx_tx_pool, PR_WAITOK);
+               pkt = pool_get(&bnx_tx_pool, PR_NOWAIT | PR_ZERO);
                if (pkt == NULL)
                        break;
 
                if (bus_dmamap_create(sc->bnx_dmatag,
                    MCLBYTES * BNX_MAX_SEGMENTS, USABLE_TX_BD,
-                   MCLBYTES, 0, BUS_DMA_WAITOK | BUS_DMA_ALLOCNOW,
+                   MCLBYTES, 0, BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW,
                    &pkt->pkt_dmamap) != 0)
                        goto put;
 
@@ -3799,7 +3806,7 @@ bnx_alloc_pkts(void *xsc, void *arg)
 stopping:
        bus_dmamap_destroy(sc->bnx_dmatag, pkt->pkt_dmamap);
 put:
-       pool_put(bnx_tx_pool, pkt);
+       pool_put(&bnx_tx_pool, pkt);
 }
 
 /****************************************************************************/
@@ -3945,7 +3952,7 @@ bnx_free_tx_chain(struct bnx_softc *sc)
                mtx_leave(&sc->tx_pkt_mtx);
 
                bus_dmamap_destroy(sc->bnx_dmatag, pkt->pkt_dmamap);
-               pool_put(bnx_tx_pool, pkt);
+               pool_put(&bnx_tx_pool, pkt);
 
                mtx_enter(&sc->tx_pkt_mtx);
        }
@@ -4743,25 +4750,9 @@ bnx_init(void *xsc)
        struct bnx_softc        *sc = (struct bnx_softc *)xsc;
        struct ifnet            *ifp = &sc->arpcom.ac_if;
        u_int32_t               ether_mtu;
-       int                     txpl = 1;
        int                     s;
 
        DBPRINT(sc, BNX_VERBOSE_RESET, "Entering %s()\n", __FUNCTION__);
-
-       if (rw_enter(&bnx_tx_pool_lk, RW_WRITE | RW_INTR) != 0)
-               return;
-       if (bnx_tx_pool == NULL) {
-               bnx_tx_pool = malloc(sizeof(*bnx_tx_pool), M_DEVBUF, M_WAITOK);
-               if (bnx_tx_pool != NULL) {
-                       pool_init(bnx_tx_pool, sizeof(struct bnx_pkt),
-                           0, 0, 0, "bnxpkts", &pool_allocator_nointr);
-               } else
-                       txpl = 0;
-       }
-       rw_exit(&bnx_tx_pool_lk);
-
-       if (!txpl)
-               return;
 
        s = splnet();

Reply via email to