[dpdk-dev] examples/l2fwd: increase pktmbuf pool size
Checks
Commit Message
Make pktmbuf pool size a function of ports and lcores detected instead
of using constant 8192.
Signed-off-by: Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>
---
Check patch generates warning `Unnecessary typecast of c90 int constant`
but it is needed to make compiler happy (generates error comparison
between signed and unsigned integer).
examples/l2fwd/main.c | 32 ++++++++++++++++++++++----------
1 file changed, 22 insertions(+), 10 deletions(-)
--
2.15.1
Comments
On Fri, 29 Dec 2017 01:49:06 +0530
Pavan Nikhilesh <pbhagavatula@caviumnetworks.com> wrote:
> +/*
> + * This expression is used to calculate the number of mbufs needed
> + * depending on user input, taking into account memory for rx and
> + * tx hardware rings, cache per lcore and mbuf pkt burst per port
> + * per lcore. RTE_MAX is used to ensure that NB_MBUF never goes below
> + * a minimum value of 8192
> + */
> +#define NB_MBUF RTE_MAX(\
> + nb_ports * (nb_rxd + nb_txd + MAX_PKT_BURST +\
> + nb_lcores * MEMPOOL_CACHE_SIZE), (unsigned int)8192)
Why not put this inplace where it is used, rather than keeping
the define? Also good practice with macros is to not have the
macro depend on variables that are in context at that point.
You also don't need a cast of (unsigned int)8192, use 8192u instead
On Thu, Dec 28, 2017 at 12:36:42PM -0800, Stephen Hemminger wrote:
> On Fri, 29 Dec 2017 01:49:06 +0530
> Pavan Nikhilesh <pbhagavatula@caviumnetworks.com> wrote:
>
> > +/*
> > + * This expression is used to calculate the number of mbufs needed
> > + * depending on user input, taking into account memory for rx and
> > + * tx hardware rings, cache per lcore and mbuf pkt burst per port
> > + * per lcore. RTE_MAX is used to ensure that NB_MBUF never goes below
> > + * a minimum value of 8192
> > + */
> > +#define NB_MBUF RTE_MAX(\
> > + nb_ports * (nb_rxd + nb_txd + MAX_PKT_BURST +\
> > + nb_lcores * MEMPOOL_CACHE_SIZE), (unsigned int)8192)
>
> Why not put this inplace where it is used, rather than keeping
> the define? Also good practice with macros is to not have the
> macro depend on variables that are in context at that point.
Currently, l3fwd is doing the same thing with macros but I do agree it
would be clean using it inplace will modify in next version.
>
> You also don't need a cast of (unsigned int)8192, use 8192u instead
Thanks for the heads up will remove the cast in next version.
Pavan.
@@ -75,8 +75,6 @@ static int mac_updating = 1;
#define RTE_LOGTYPE_L2FWD RTE_LOGTYPE_USER1
-#define NB_MBUF 8192
-
#define MAX_PKT_BURST 32
#define BURST_TX_DRAIN_US 100 /* TX drain every ~100us */
#define MEMPOOL_CACHE_SIZE 256
@@ -124,6 +122,17 @@ static const struct rte_eth_conf port_conf = {
},
};
+/*
+ * This expression is used to calculate the number of mbufs needed
+ * depending on user input, taking into account memory for rx and
+ * tx hardware rings, cache per lcore and mbuf pkt burst per port
+ * per lcore. RTE_MAX is used to ensure that NB_MBUF never goes below
+ * a minimum value of 8192
+ */
+#define NB_MBUF RTE_MAX(\
+ nb_ports * (nb_rxd + nb_txd + MAX_PKT_BURST +\
+ nb_lcores * MEMPOOL_CACHE_SIZE), (unsigned int)8192)
+
struct rte_mempool * l2fwd_pktmbuf_pool = NULL;
/* Per-port statistics struct */
@@ -556,6 +565,7 @@ main(int argc, char **argv)
uint16_t portid, last_port;
unsigned lcore_id, rx_lcore_id;
unsigned nb_ports_in_mask = 0;
+ unsigned int nb_lcores = 0;
/* init EAL */
ret = rte_eal_init(argc, argv);
@@ -578,13 +588,6 @@ main(int argc, char **argv)
/* convert to number of cycles */
timer_period *= rte_get_timer_hz();
- /* create the mbuf pool */
- l2fwd_pktmbuf_pool = rte_pktmbuf_pool_create("mbuf_pool", NB_MBUF,
- MEMPOOL_CACHE_SIZE, 0, RTE_MBUF_DEFAULT_BUF_SIZE,
- rte_socket_id());
- if (l2fwd_pktmbuf_pool == NULL)
- rte_exit(EXIT_FAILURE, "Cannot init mbuf pool\n");
-
nb_ports = rte_eth_dev_count();
if (nb_ports == 0)
rte_exit(EXIT_FAILURE, "No Ethernet ports - bye\n");
@@ -636,9 +639,11 @@ main(int argc, char **argv)
rte_exit(EXIT_FAILURE, "Not enough cores\n");
}
- if (qconf != &lcore_queue_conf[rx_lcore_id])
+ if (qconf != &lcore_queue_conf[rx_lcore_id]) {
/* Assigned a new logical core in the loop above. */
qconf = &lcore_queue_conf[rx_lcore_id];
+ nb_lcores++;
+ }
qconf->rx_port_list[qconf->n_rx_port] = portid;
qconf->n_rx_port++;
@@ -647,6 +652,13 @@ main(int argc, char **argv)
nb_ports_available = nb_ports;
+ /* create the mbuf pool */
+ l2fwd_pktmbuf_pool = rte_pktmbuf_pool_create("mbuf_pool", NB_MBUF,
+ MEMPOOL_CACHE_SIZE, 0, RTE_MBUF_DEFAULT_BUF_SIZE,
+ rte_socket_id());
+ if (l2fwd_pktmbuf_pool == NULL)
+ rte_exit(EXIT_FAILURE, "Cannot init mbuf pool\n");
+
/* Initialise each port */
for (portid = 0; portid < nb_ports; portid++) {
/* skip ports that are not enabled */