Merge "PROX generator: performance optimization (2/4)"
[samplevnf.git] / VNFs / DPPD-PROX / rx_pkt.c
index bd06b26..075069c 100644 (file)
@@ -77,7 +77,7 @@ static void next_port_pow2(struct rx_params_hw *rx_params_hw)
 static inline void dump_l3(struct task_base *tbase, struct rte_mbuf *mbuf)
 {
        if (unlikely(tbase->aux->task_rt_dump.n_print_rx)) {
-               if (tbase->aux->task_rt_dump.input->reply == NULL) {
+               if ((tbase->aux->task_rt_dump.input == NULL) || (tbase->aux->task_rt_dump.input->reply == NULL)) {
                        plogdx_info(mbuf, "RX: ");
                } else {
                        struct input *input = tbase->aux->task_rt_dump.input;
@@ -145,7 +145,7 @@ static uint16_t rx_pkt_hw_param(struct task_base *tbase, struct rte_mbuf ***mbuf
        }
 
        if (skip)
-               TASK_STATS_ADD_DROP_HANDLED(&tbase->aux->stats, skip);
+               TASK_STATS_ADD_RX_NON_DP(&tbase->aux->stats, skip);
        if (likely(nb_rx > 0)) {
                TASK_STATS_ADD_RX(&tbase->aux->stats, nb_rx);
                return nb_rx - skip;
@@ -201,7 +201,7 @@ static inline uint16_t rx_pkt_hw1_param(struct task_base *tbase, struct rte_mbuf
        }
 
        if (skip)
-               TASK_STATS_ADD_DROP_HANDLED(&tbase->aux->stats, skip);
+               TASK_STATS_ADD_RX_NON_DP(&tbase->aux->stats, skip);
        if (likely(nb_rx > 0)) {
                TASK_STATS_ADD_RX(&tbase->aux->stats, nb_rx);
                return nb_rx - skip;
@@ -408,7 +408,7 @@ uint16_t rx_pkt_dump(struct task_base *tbase, struct rte_mbuf ***mbufs)
                uint32_t n_dump = tbase->aux->task_rt_dump.n_print_rx;
                n_dump = ret < n_dump? ret : n_dump;
 
-               if (tbase->aux->task_rt_dump.input->reply == NULL) {
+               if ((tbase->aux->task_rt_dump.input == NULL) || (tbase->aux->task_rt_dump.input->reply == NULL)) {
                        for (uint32_t i = 0; i < n_dump; ++i) {
                                plogdx_info((*mbufs)[i], "RX: ");
                        }
@@ -453,12 +453,13 @@ uint16_t rx_pkt_trace(struct task_base *tbase, struct rte_mbuf ***mbufs)
        if (ret) {
                uint32_t n_trace = tbase->aux->task_rt_dump.n_trace;
                n_trace = ret < n_trace? ret : n_trace;
+               n_trace = n_trace <= MAX_RING_BURST ? n_trace : MAX_RING_BURST;
 
                for (uint32_t i = 0; i < n_trace; ++i) {
                        uint8_t *pkt = rte_pktmbuf_mtod((*mbufs)[i], uint8_t *);
-                       rte_memcpy(tbase->aux->task_rt_dump.pkt_cpy[tbase->aux->task_rt_dump.cur_trace + i], pkt, sizeof(tbase->aux->task_rt_dump.pkt_cpy[i]));
-                       tbase->aux->task_rt_dump.pkt_cpy_len[tbase->aux->task_rt_dump.cur_trace + i] = rte_pktmbuf_pkt_len((*mbufs)[i]);
-                       tbase->aux->task_rt_dump.pkt_mbuf_addr[tbase->aux->task_rt_dump.cur_trace + i] = (*mbufs)[i];
+                       rte_memcpy(tbase->aux->task_rt_dump.pkt_cpy[i], pkt, sizeof(tbase->aux->task_rt_dump.pkt_cpy[i]));
+                       tbase->aux->task_rt_dump.pkt_cpy_len[i] = rte_pktmbuf_pkt_len((*mbufs)[i]);
+                       tbase->aux->task_rt_dump.pkt_mbuf_addr[i] = (*mbufs)[i];
                }
                tbase->aux->task_rt_dump.cur_trace += n_trace;
 
@@ -475,7 +476,10 @@ uint16_t rx_pkt_distr(struct task_base *tbase, struct rte_mbuf ***mbufs)
 {
        uint16_t ret = call_prev_rx_pkt(tbase, mbufs);
 
-       tbase->aux->rx_bucket[ret]++;
+       if (likely(ret < RX_BUCKET_SIZE))
+               tbase->aux->rx_bucket[ret]++;
+       else
+               tbase->aux->rx_bucket[RX_BUCKET_SIZE - 1]++;
        return ret;
 }
 
@@ -504,36 +508,3 @@ uint16_t rx_pkt_tsc(struct task_base *tbase, struct rte_mbuf ***mbufs)
 
        return ret;
 }
-
-uint16_t rx_pkt_all(struct task_base *tbase, struct rte_mbuf ***mbufs)
-{
-       uint16_t tot = 0;
-       uint16_t ret = 0;
-       struct rte_mbuf **new_mbufs;
-       struct rte_mbuf **dst = tbase->aux->all_mbufs;
-
-       /* In case we receive less than MAX_PKT_BURST packets in one
-          iteration, do no perform any copying of mbuf pointers. Use
-          the buffer itself instead. */
-       ret = call_prev_rx_pkt(tbase, &new_mbufs);
-       if (ret < MAX_PKT_BURST/2) {
-               *mbufs = new_mbufs;
-               return ret;
-       }
-
-       memcpy(dst + tot, new_mbufs, ret * sizeof(*dst));
-       tot += ret;
-       *mbufs = dst;
-
-       do {
-               ret = call_prev_rx_pkt(tbase, &new_mbufs);
-               memcpy(dst + tot, new_mbufs, ret * sizeof(*dst));
-               tot += ret;
-       } while (ret == MAX_PKT_BURST/2 && tot < MAX_RX_PKT_ALL - MAX_PKT_BURST);
-
-       if (tot >= MAX_RX_PKT_ALL - MAX_PKT_BURST) {
-               plog_err("Could not receive all packets - buffer full\n");
-       }
-
-       return tot;
-}