Merge "PROX generator: performance optimization (3/4)"
[samplevnf.git] / VNFs / DPPD-PROX / main.c
index 96272fe..ed578c8 100644 (file)
@@ -127,11 +127,33 @@ static void check_zero_rx(void)
        }
 }
 
+static void check_nb_mbuf(void)
+{
+       struct lcore_cfg *lconf = NULL;
+       struct task_args *targ = NULL;
+       uint8_t port_id;
+       int n_txd = 0, n_rxd = 0;
+
+       while (core_targ_next(&lconf, &targ, 0) == 0) {
+               for (uint8_t i = 0; i < targ->nb_txports; ++i) {
+                       port_id = targ->tx_port_queue[i].port;
+                       n_txd = prox_port_cfg[port_id].n_txd;
+               }
+               for (uint8_t i = 0; i < targ->nb_rxports; ++i) {
+                       port_id = targ->rx_port_queue[i].port;
+                       n_rxd = prox_port_cfg[port_id].n_rxd;
+               }
+               if (targ->nb_mbuf <= n_rxd + n_txd + targ->nb_cache_mbuf + MAX_PKT_BURST) {
+                       plog_warn("Core %d, task %d might not have enough mbufs (%d) to support %d txd, %d rxd and %d cache_mbuf\n",
+                               lconf->id, targ->id, targ->nb_mbuf, n_txd, n_rxd, targ->nb_cache_mbuf);
+               }
+       }
+}
+
 static void check_missing_rx(void)
 {
        struct lcore_cfg *lconf = NULL, *rx_lconf = NULL, *tx_lconf = NULL;
        struct task_args *targ, *rx_targ = NULL, *tx_targ = NULL;
-       struct prox_port_cfg *port;
        uint8_t port_id, rx_port_id, ok;
 
        while (core_targ_next(&lconf, &targ, 0) == 0) {
@@ -192,6 +214,7 @@ static void check_missing_rx(void)
 
 static void check_cfg_consistent(void)
 {
+       check_nb_mbuf();
        check_missing_rx();
        check_zero_rx();
        check_mixed_normal_pipeline();
@@ -501,7 +524,7 @@ static struct rte_ring *init_ring_between_tasks(struct lcore_cfg *lconf, struct
                        starg->ctrl_plane_ring = ring;
                }
 
-               plog_info("\t\tCore %u task %u to -> core %u task %u ctrl_ring %s %p %s\n",
+               plog_info("\t\t\tCore %u task %u to -> core %u task %u ctrl_ring %s %p %s\n",
                          lconf->id, starg->id, ct.core, ct.task, ct.type == CTRL_TYPE_PKT?
                          "pkt" : "msg", ring, ring->name);
                ris->n_ctrl_rings++;
@@ -614,7 +637,7 @@ static void init_rings(void)
 
                        ct.core = lconf->id;
                        ct.task = starg->id;;
-                       struct rte_ring *tx_ring = init_ring_between_tasks(lcore_cfg, lcore_cfg[prox_cfg.master].targs, ct, 0, 0, &ris);
+                       struct rte_ring *tx_ring = init_ring_between_tasks(&lcore_cfg[prox_cfg.master], lcore_cfg[prox_cfg.master].targs, ct, 0, 0, &ris);
                }
        }
 }
@@ -624,13 +647,14 @@ static void shuffle_mempool(struct rte_mempool* mempool, uint32_t nb_mbuf)
        struct rte_mbuf** pkts = prox_zmalloc(nb_mbuf * sizeof(*pkts), rte_socket_id());
        uint64_t got = 0;
 
-       while (rte_mempool_get_bulk(mempool, (void**)(pkts + got), 1) == 0)
+       while ((got < nb_mbuf) && (rte_mempool_get_bulk(mempool, (void**)(pkts + got), 1) == 0))
                ++got;
 
+       nb_mbuf = got;
        while (got) {
                int idx;
                do {
-                       idx = rand() % nb_mbuf - 1;
+                       idx = rand() % nb_mbuf;
                } while (pkts[idx] == 0);
 
                rte_mempool_put_bulk(mempool, (void**)&pkts[idx], 1);