Fix stacking of rx receive functions 17/50217/1
authorXavier Simonart <xavier.simonart@intel.com>
Mon, 8 Jan 2018 09:58:14 +0000 (10:58 +0100)
committerXavier Simonart <xavier.simonart@intel.com>
Mon, 8 Jan 2018 09:58:14 +0000 (10:58 +0100)
PROX can stack different RX functions, so that they are executed
after each other.
This feature is for instance used to dump packets or to print
distribution of receive packets, without influencing the performance
of the rx functions when no dump or print is needed.
The previous implementation was wrong and causing some of the stacked
functions not to be executed. This was causing for instance issues
in latency measurement after enabling dumping packets.

Change-Id: I766b8ee8e8852fa17cdaf60ee6e1fec0dc98c719
Signed-off-by: Xavier Simonart <xavier.simonart@intel.com>
VNFs/DPPD-PROX/rx_pkt.c
VNFs/DPPD-PROX/task_base.h

index ec698d9..bd06b26 100644 (file)
@@ -388,13 +388,9 @@ static uint16_t call_prev_rx_pkt(struct task_base *tbase, struct rte_mbuf ***mbu
 {
        uint16_t ret;
 
-       if (tbase->aux->rx_prev_idx + 1 == tbase->aux->rx_prev_count) {
-               ret = tbase->aux->rx_pkt_prev[tbase->aux->rx_prev_idx](tbase, mbufs);
-       } else {
-               tbase->aux->rx_prev_idx++;
-               ret = tbase->aux->rx_pkt_prev[tbase->aux->rx_prev_idx](tbase, mbufs);
-               tbase->aux->rx_prev_idx--;
-       }
+       tbase->aux->rx_prev_idx++;
+       ret = tbase->aux->rx_pkt_prev[tbase->aux->rx_prev_idx - 1](tbase, mbufs);
+       tbase->aux->rx_prev_idx--;
 
        return ret;
 }
index ad00962..f8c0524 100644 (file)
@@ -213,8 +213,8 @@ static void task_base_add_rx_pkt_function(struct task_base *tbase, rx_pkt_func t
                return;
        }
 
-       for (int16_t i = tbase->aux->rx_prev_count; i >= 0; --i) {
-               tbase->aux->rx_pkt_prev[i + 1] = tbase->aux->rx_pkt_prev[i];
+       for (int16_t i = tbase->aux->rx_prev_count; i > 0; --i) {
+               tbase->aux->rx_pkt_prev[i] = tbase->aux->rx_pkt_prev[i - 1];
        }
        tbase->aux->rx_pkt_prev[0] = tbase->rx_pkt;
        tbase->rx_pkt = to_add;
@@ -226,8 +226,13 @@ static void task_base_del_rx_pkt_function(struct task_base *tbase, rx_pkt_func t
        int cur = 0;
        int found = 0;
 
-       if (tbase->aux->rx_prev_count == 1) {
+       if (unlikely(tbase->aux->rx_prev_count == 0)) {
+               return;
+       } else if (tbase->rx_pkt == to_del) {
                tbase->rx_pkt = tbase->aux->rx_pkt_prev[0];
+               for (int16_t i = 0; i < tbase->aux->rx_prev_count - 1; ++i) {
+                       tbase->aux->rx_pkt_prev[i] = tbase->aux->rx_pkt_prev[i + 1];
+               }
                found = 1;
        } else {
                for (int16_t i = 0; i < tbase->aux->rx_prev_count; ++i) {