From a317449e0db1aad9fe15a47b3de47a3c647721e5 Mon Sep 17 00:00:00 2001 From: Sepherosa Ziehau Date: Mon, 16 Apr 2012 19:41:20 +0800 Subject: [PATCH] ifnet: Factor out if_ring_count2() 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 | 8 +------- sys/dev/netif/jme/if_jme.c | 14 +++----------- sys/net/if.c | 25 +++++++++++++++++++++++++ sys/net/if_var.h | 1 + 4 files changed, 30 insertions(+), 18 deletions(-) diff --git a/sys/dev/netif/emx/if_emx.c b/sys/dev/netif/emx/if_emx.c index e5253395ea..526aa2a0de 100644 --- a/sys/dev/netif/emx/if_emx.c +++ b/sys/dev/netif/emx/if_emx.c @@ -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); diff --git a/sys/dev/netif/jme/if_jme.c b/sys/dev/netif/jme/if_jme.c index d5b0f8f397..7554136369 100644 --- a/sys/dev/netif/jme/if_jme.c +++ b/sys/dev/netif/jme/if_jme.c @@ -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; diff --git a/sys/net/if.c b/sys/net/if.c index ec8a8c4eb3..827e0b3877 100644 --- a/sys/net/if.c +++ b/sys/net/if.c @@ -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; +} diff --git a/sys/net/if_var.h b/sys/net/if_var.h index db37914303..4b352bf046 100644 --- a/sys/net/if_var.h +++ b/sys/net/if_var.h @@ -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) -- 2.41.0