ifnet: Factor out if_ring_count2()
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Mon, 16 Apr 2012 11:41:20 +0000 (19:41 +0800)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Mon, 16 Apr 2012 11:41:20 +0000 (19:41 +0800)
This function calculates maximum allowed power-of-2 ring count based on
user specified value (cnt) and the maximum number of rings supported by
the hardware (cnt_max).  The power-of-2 cpu count is also take into
consideration.

sys/dev/netif/emx/if_emx.c
sys/dev/netif/jme/if_jme.c
sys/net/if.c
sys/net/if_var.h

index e525339..526aa2a 100644 (file)
@@ -533,13 +533,7 @@ emx_attach(device_t dev)
 
        /* Calculate # of RX rings */
        sc->rx_ring_cnt = device_getenv_int(dev, "rxr", emx_rxr);
-       if (sc->rx_ring_cnt <= 0 || sc->rx_ring_cnt > EMX_NRX_RING ||
-           sc->rx_ring_cnt > ncpus) {
-               if (ncpus > 1)
-                       sc->rx_ring_cnt = EMX_NRX_RING;
-               else
-                       sc->rx_ring_cnt = 1;
-       }
+       sc->rx_ring_cnt = if_ring_count2(sc->rx_ring_cnt, EMX_NRX_RING);
 
        /* Allocate RX/TX rings' busdma(9) stuffs */
        error = emx_dma_alloc(sc);
index d5b0f8f..7554136 100644 (file)
@@ -653,18 +653,10 @@ jme_attach(device_t dev)
                sc->jme_tx_desc_cnt = JME_NDESC_MAX;
 
        /*
-        * Calculate rx rings based on ncpus2
+        * Calculate rx rings
         */
-       sc->jme_rx_ring_cnt = jme_rx_ring_count;
-       if (sc->jme_rx_ring_cnt <= 0)
-               sc->jme_rx_ring_cnt = JME_NRXRING_1;
-       if (sc->jme_rx_ring_cnt > ncpus2)
-               sc->jme_rx_ring_cnt = ncpus2;
-
-       if (sc->jme_rx_ring_cnt >= JME_NRXRING_4)
-               sc->jme_rx_ring_cnt = JME_NRXRING_4;
-       else if (sc->jme_rx_ring_cnt >= JME_NRXRING_2)
-               sc->jme_rx_ring_cnt = JME_NRXRING_2;
+       sc->jme_rx_ring_cnt = if_ring_count2(jme_rx_ring_count,
+           JME_NRXRING_MAX);
        sc->jme_rx_ring_inuse = sc->jme_rx_ring_cnt;
 
        i = 0;
index ec8a8c4..827e0b3 100644 (file)
@@ -2751,3 +2751,28 @@ if_deregister_com_alloc(u_char type)
         if_com_alloc[type] = NULL;
         if_com_free[type] = NULL;
 }
+
+int
+if_ring_count2(int cnt, int cnt_max)
+{
+       int shift = 0;
+
+       KASSERT(cnt_max >= 1 && powerof2(cnt_max),
+           ("invalid ring count max %d\n", cnt_max));
+
+       if (cnt <= 0)
+               cnt = cnt_max;
+       if (cnt > ncpus2)
+               cnt = ncpus2;
+       if (cnt > cnt_max)
+               cnt = cnt_max;
+
+       while ((1 << (shift + 1)) <= cnt)
+               ++shift;
+       cnt = 1 << shift;
+
+       KASSERT(cnt >= 1 && cnt <= ncpus2 && cnt <= cnt_max,
+           ("calculate cnt %d, ncpus2 %d, cnt max %d\n",
+            cnt, ncpus2, cnt_max));
+       return cnt;
+}
index db37914..4b352bf 100644 (file)
@@ -795,6 +795,7 @@ struct ifaddr *ifaddr_byindex(unsigned short);
 struct ifmultiaddr *ifmaof_ifpforaddr(struct sockaddr *, struct ifnet *);
 int    if_simloop(struct ifnet *ifp, struct mbuf *m, int af, int hlen);
 void   if_devstart(struct ifnet *ifp);
+int    if_ring_count2(int cnt, int cnt_max);
 
 #define IF_LLSOCKADDR(ifp)                                             \
     ((struct sockaddr_dl *)(ifp)->if_lladdr->ifa_addr)