diff --git a/sys/dev/virtual/vkernel/net/if_vke.c b/sys/dev/virtual/vkernel/net/if_vke.c index c09b36d..a1a4b4f 100644 --- a/sys/dev/virtual/vkernel/net/if_vke.c +++ b/sys/dev/virtual/vkernel/net/if_vke.c @@ -66,16 +66,14 @@ #define VKE_CHUNK 8 /* number of mbufs to queue before interrupting */ -#define NETFIFOSIZE 256 -#define NETFIFOMASK (NETFIFOSIZE -1) -#define NETFIFOINDEX(u) ((u) & NETFIFOMASK) +#define NETFIFOINDEX(u) ((u) & (sc->sc_num_mbufcl - 1)) #define VKE_COTD_RUN 0 #define VKE_COTD_EXIT 1 #define VKE_COTD_DEAD 2 struct vke_fifo { - struct mbuf *array[NETFIFOSIZE]; + struct mbuf **array; int rindex; int windex; }; @@ -99,6 +97,8 @@ struct vke_softc { fifo_t sc_txfifo_done; fifo_t sc_rxfifo; + int sc_num_mbufcl; + long cotd_ipackets; long cotd_oerrors; long cotd_opackets; @@ -278,6 +278,7 @@ vke_init(void *xsc) { struct vke_softc *sc = xsc; struct ifnet *ifp = &sc->arpcom.ac_if; + size_t ringsize = sc->sc_num_mbufcl * sizeof(struct mbuf *); int i; ASSERT_SERIALIZED(ifp->if_serializer); @@ -287,11 +288,17 @@ vke_init(void *xsc) ifp->if_flags |= IFF_RUNNING; ifsq_clr_oactive(ifq_get_subq_default(&ifp->if_snd)); + /* + * Allocate memory for FIFO structures and mbufs. + */ sc->sc_txfifo = kmalloc(sizeof(*sc->sc_txfifo), M_DEVBUF, M_WAITOK); sc->sc_txfifo_done = kmalloc(sizeof(*sc->sc_txfifo_done), M_DEVBUF, M_WAITOK); - sc->sc_rxfifo = kmalloc(sizeof(*sc->sc_rxfifo), M_DEVBUF, M_WAITOK); - for (i = 0; i < NETFIFOSIZE; i++) { + sc->sc_txfifo->array = kmalloc(ringsize, M_DEVBUF, M_WAITOK | M_ZERO); + sc->sc_txfifo_done->array = kmalloc(ringsize, M_DEVBUF, M_WAITOK | M_ZERO); + sc->sc_rxfifo->array = kmalloc(ringsize, M_DEVBUF, M_WAITOK | M_ZERO); + + for (i = 0; i < sc->sc_num_mbufcl; i++) { sc->sc_rxfifo->array[i] = m_getcl(MB_WAIT, MT_DATA, M_PKTHDR); sc->sc_txfifo->array[i] = NULL; sc->sc_txfifo_done->array[i] = NULL; @@ -443,7 +450,7 @@ vke_stop(struct vke_softc *sc) cothread_delete(&sc->cotd_rx); } - for (i = 0; i < NETFIFOSIZE; i++) { + for (i = 0; i < sc->sc_num_mbufcl; i++) { if (sc->sc_rxfifo && sc->sc_rxfifo->array[i]) { m_freem(sc->sc_rxfifo->array[i]); sc->sc_rxfifo->array[i] = NULL; @@ -459,16 +466,22 @@ vke_stop(struct vke_softc *sc) } if (sc->sc_txfifo) { + if (sc->sc_txfifo->array) + kfree(sc->sc_txfifo->array, M_DEVBUF); kfree(sc->sc_txfifo, M_DEVBUF); sc->sc_txfifo = NULL; } if (sc->sc_txfifo_done) { + if (sc->sc_txfifo_done->array) + kfree(sc->sc_txfifo_done->array, M_DEVBUF); kfree(sc->sc_txfifo_done, M_DEVBUF); sc->sc_txfifo_done = NULL; } if (sc->sc_rxfifo) { + if (sc->sc_rxfifo->array) + kfree(sc->sc_rxfifo->array, M_DEVBUF); kfree(sc->sc_rxfifo, M_DEVBUF); sc->sc_rxfifo = NULL; } @@ -754,6 +767,7 @@ havemac: sc->sc_addr = info->netif_addr; sc->sc_mask = info->netif_mask; + sc->sc_num_mbufcl = roundup2(nmbclusters / (NetifNum * 2), 2); ifp = &sc->arpcom.ac_if; if_initname(ifp, VKE_DEVNAME, sc->sc_unit); @@ -789,8 +803,8 @@ havemac: if (bootverbose && sc->sc_addr != 0) { if_printf(ifp, "pre-configured " - "address 0x%08x, netmask 0x%08x\n", - ntohl(sc->sc_addr), ntohl(sc->sc_mask)); + "address 0x%08x, netmask 0x%08x, %d mbuf clusters\n", + ntohl(sc->sc_addr), ntohl(sc->sc_mask), sc->sc_num_mbufcl); } return 0;