For test-pipeline, if the main core receive SIGINT signal, it will kill
all the threads immediately and not wait other threads to finish their
jobs.

To fix this, add 'signal_handler' function.

Fixes: 48f31ca50cc4 ("app/pipeline: packet framework benchmark")
Cc: cristian.dumitre...@intel.com
Cc: sta...@dpdk.org

Signed-off-by: Feifei Wang <feifei.wa...@arm.com>
Reviewed-by: Ruifeng Wang <ruifeng.w...@arm.com>
Reviewed-by: Matthew Dirba <matthew.di...@arm.com>
---
 app/test-pipeline/main.c              |  14 +++
 app/test-pipeline/main.h              |   2 +
 app/test-pipeline/pipeline_acl.c      |   6 +-
 app/test-pipeline/pipeline_hash.c     | 110 ++++++++++-----------
 app/test-pipeline/pipeline_lpm.c      |   6 +-
 app/test-pipeline/pipeline_lpm_ipv6.c |   6 +-
 app/test-pipeline/pipeline_stub.c     |   6 +-
 app/test-pipeline/runtime.c           | 132 ++++++++++++++------------
 8 files changed, 158 insertions(+), 124 deletions(-)

diff --git a/app/test-pipeline/main.c b/app/test-pipeline/main.c
index 1e16794183..8633933fd9 100644
--- a/app/test-pipeline/main.c
+++ b/app/test-pipeline/main.c
@@ -10,6 +10,7 @@
 #include <string.h>
 #include <sys/queue.h>
 #include <stdarg.h>
+#include <signal.h>
 #include <errno.h>
 #include <getopt.h>
 #include <unistd.h>
@@ -41,6 +42,15 @@
 
 #include "main.h"
 
+bool force_quit;
+
+static void
+signal_handler(int signum)
+{
+       if (signum == SIGINT || signum == SIGTERM)
+               force_quit = true;
+}
+
 int
 main(int argc, char **argv)
 {
@@ -54,6 +64,10 @@ main(int argc, char **argv)
        argc -= ret;
        argv += ret;
 
+       force_quit = false;
+       signal(SIGINT, signal_handler);
+       signal(SIGTERM, signal_handler);
+
        /* Parse application arguments (after the EAL ones) */
        ret = app_parse_args(argc, argv);
        if (ret < 0) {
diff --git a/app/test-pipeline/main.h b/app/test-pipeline/main.h
index 59dcfddbf4..9df157de22 100644
--- a/app/test-pipeline/main.h
+++ b/app/test-pipeline/main.h
@@ -60,6 +60,8 @@ struct app_params {
 
 extern struct app_params app;
 
+extern bool force_quit;
+
 int app_parse_args(int argc, char **argv);
 void app_print_usage(void);
 void app_init(void);
diff --git a/app/test-pipeline/pipeline_acl.c b/app/test-pipeline/pipeline_acl.c
index 2f04868e3e..9eb4053e23 100644
--- a/app/test-pipeline/pipeline_acl.c
+++ b/app/test-pipeline/pipeline_acl.c
@@ -236,14 +236,16 @@ app_main_loop_worker_pipeline_acl(void) {
 
        /* Run-time */
 #if APP_FLUSH == 0
-       for ( ; ; )
+       while (!force_quit)
                rte_pipeline_run(p);
 #else
-       for (i = 0; ; i++) {
+       i = 0;
+       while (!force_quit) {
                rte_pipeline_run(p);
 
                if ((i & APP_FLUSH) == 0)
                        rte_pipeline_flush(p);
+               i++;
        }
 #endif
 }
diff --git a/app/test-pipeline/pipeline_hash.c 
b/app/test-pipeline/pipeline_hash.c
index 2dd8928d43..cab9c20980 100644
--- a/app/test-pipeline/pipeline_hash.c
+++ b/app/test-pipeline/pipeline_hash.c
@@ -366,14 +366,16 @@ app_main_loop_worker_pipeline_hash(void) {
 
        /* Run-time */
 #if APP_FLUSH == 0
-       for ( ; ; )
+       while (!force_quit)
                rte_pipeline_run(p);
 #else
-       for (i = 0; ; i++) {
+       i = 0;
+       while (!force_quit) {
                rte_pipeline_run(p);
 
                if ((i & APP_FLUSH) == 0)
                        rte_pipeline_flush(p);
+               i++;
        }
 #endif
 }
@@ -411,59 +413,61 @@ app_main_loop_rx_metadata(void) {
        RTE_LOG(INFO, USER1, "Core %u is doing RX (with meta-data)\n",
                rte_lcore_id());
 
-       for (i = 0; ; i = ((i + 1) & (app.n_ports - 1))) {
-               uint16_t n_mbufs;
-
-               n_mbufs = rte_eth_rx_burst(
-                       app.ports[i],
-                       0,
-                       app.mbuf_rx.array,
-                       app.burst_size_rx_read);
-
-               if (n_mbufs == 0)
-                       continue;
-
-               for (j = 0; j < n_mbufs; j++) {
-                       struct rte_mbuf *m;
-                       uint8_t *m_data, *key;
-                       struct rte_ipv4_hdr *ip_hdr;
-                       struct rte_ipv6_hdr *ipv6_hdr;
-                       uint32_t ip_dst;
-                       uint8_t *ipv6_dst;
-                       uint32_t *signature, *k32;
-
-                       m = app.mbuf_rx.array[j];
-                       m_data = rte_pktmbuf_mtod(m, uint8_t *);
-                       signature = RTE_MBUF_METADATA_UINT32_PTR(m,
-                                       APP_METADATA_OFFSET(0));
-                       key = RTE_MBUF_METADATA_UINT8_PTR(m,
-                                       APP_METADATA_OFFSET(32));
-
-                       if (RTE_ETH_IS_IPV4_HDR(m->packet_type)) {
-                               ip_hdr = (struct rte_ipv4_hdr *)
-                                       &m_data[sizeof(struct rte_ether_hdr)];
-                               ip_dst = ip_hdr->dst_addr;
-
-                               k32 = (uint32_t *) key;
-                               k32[0] = ip_dst & 0xFFFFFF00;
-                       } else if (RTE_ETH_IS_IPV6_HDR(m->packet_type)) {
-                               ipv6_hdr = (struct rte_ipv6_hdr *)
-                                       &m_data[sizeof(struct rte_ether_hdr)];
-                               ipv6_dst = ipv6_hdr->dst_addr;
-
-                               memcpy(key, ipv6_dst, 16);
-                       } else
+       while (!force_quit) {
+               for (i = 0; i < app.n_ports; i++) {
+                       uint16_t n_mbufs;
+
+                       n_mbufs = rte_eth_rx_burst(
+                               app.ports[i],
+                               0,
+                               app.mbuf_rx.array,
+                               app.burst_size_rx_read);
+
+                       if (n_mbufs == 0)
                                continue;
 
-                       *signature = test_hash(key, NULL, 0, 0);
+                       for (j = 0; j < n_mbufs; j++) {
+                               struct rte_mbuf *m;
+                               uint8_t *m_data, *key;
+                               struct rte_ipv4_hdr *ip_hdr;
+                               struct rte_ipv6_hdr *ipv6_hdr;
+                               uint32_t ip_dst;
+                               uint8_t *ipv6_dst;
+                               uint32_t *signature, *k32;
+
+                               m = app.mbuf_rx.array[j];
+                               m_data = rte_pktmbuf_mtod(m, uint8_t *);
+                               signature = RTE_MBUF_METADATA_UINT32_PTR(m,
+                                               APP_METADATA_OFFSET(0));
+                               key = RTE_MBUF_METADATA_UINT8_PTR(m,
+                                               APP_METADATA_OFFSET(32));
+
+                               if (RTE_ETH_IS_IPV4_HDR(m->packet_type)) {
+                                       ip_hdr = (struct rte_ipv4_hdr *)
+                                               &m_data[sizeof(struct 
rte_ether_hdr)];
+                                       ip_dst = ip_hdr->dst_addr;
+
+                                       k32 = (uint32_t *) key;
+                                       k32[0] = ip_dst & 0xFFFFFF00;
+                               } else if (RTE_ETH_IS_IPV6_HDR(m->packet_type)) 
{
+                                       ipv6_hdr = (struct rte_ipv6_hdr *)
+                                               &m_data[sizeof(struct 
rte_ether_hdr)];
+                                       ipv6_dst = ipv6_hdr->dst_addr;
+
+                                       memcpy(key, ipv6_dst, 16);
+                               } else
+                                       continue;
+
+                               *signature = test_hash(key, NULL, 0, 0);
+                       }
+
+                       do {
+                               ret = rte_ring_sp_enqueue_bulk(
+                                       app.rings_rx[i],
+                                       (void **) app.mbuf_rx.array,
+                                       n_mbufs,
+                                       NULL);
+                       } while (ret == 0 && !force_quit);
                }
-
-               do {
-                       ret = rte_ring_sp_enqueue_bulk(
-                               app.rings_rx[i],
-                               (void **) app.mbuf_rx.array,
-                               n_mbufs,
-                               NULL);
-               } while (ret == 0);
        }
 }
diff --git a/app/test-pipeline/pipeline_lpm.c b/app/test-pipeline/pipeline_lpm.c
index 854319174b..8a59bd0042 100644
--- a/app/test-pipeline/pipeline_lpm.c
+++ b/app/test-pipeline/pipeline_lpm.c
@@ -160,14 +160,16 @@ app_main_loop_worker_pipeline_lpm(void) {
 
        /* Run-time */
 #if APP_FLUSH == 0
-       for ( ; ; )
+       while (!force_quit)
                rte_pipeline_run(p);
 #else
-       for (i = 0; ; i++) {
+       i = 0;
+       while (!force_quit) {
                rte_pipeline_run(p);
 
                if ((i & APP_FLUSH) == 0)
                        rte_pipeline_flush(p);
+               i++;
        }
 #endif
 }
diff --git a/app/test-pipeline/pipeline_lpm_ipv6.c 
b/app/test-pipeline/pipeline_lpm_ipv6.c
index 18d4f018f1..207ffbeff0 100644
--- a/app/test-pipeline/pipeline_lpm_ipv6.c
+++ b/app/test-pipeline/pipeline_lpm_ipv6.c
@@ -158,14 +158,16 @@ app_main_loop_worker_pipeline_lpm_ipv6(void) {
 
        /* Run-time */
 #if APP_FLUSH == 0
-       for ( ; ; )
+       while (!force_quit)
                rte_pipeline_run(p);
 #else
-       for (i = 0; ; i++) {
+       i = 0;
+       while (!force_quit) {
                rte_pipeline_run(p);
 
                if ((i & APP_FLUSH) == 0)
                        rte_pipeline_flush(p);
+               i++;
        }
 #endif
 }
diff --git a/app/test-pipeline/pipeline_stub.c 
b/app/test-pipeline/pipeline_stub.c
index b6750d51bf..48a638aad7 100644
--- a/app/test-pipeline/pipeline_stub.c
+++ b/app/test-pipeline/pipeline_stub.c
@@ -122,14 +122,16 @@ app_main_loop_worker_pipeline_stub(void) {
 
        /* Run-time */
 #if APP_FLUSH == 0
-       for ( ; ; )
+       while (!force_quit)
                rte_pipeline_run(p);
 #else
-       for (i = 0; ; i++) {
+       i = 0;
+       while (!force_quit) {
                rte_pipeline_run(p);
 
                if ((i & APP_FLUSH) == 0)
                        rte_pipeline_flush(p);
+               i++;
        }
 #endif
 }
diff --git a/app/test-pipeline/runtime.c b/app/test-pipeline/runtime.c
index d939a85d7e..752f783370 100644
--- a/app/test-pipeline/runtime.c
+++ b/app/test-pipeline/runtime.c
@@ -48,24 +48,26 @@ app_main_loop_rx(void) {
 
        RTE_LOG(INFO, USER1, "Core %u is doing RX\n", rte_lcore_id());
 
-       for (i = 0; ; i = ((i + 1) & (app.n_ports - 1))) {
-               uint16_t n_mbufs;
-
-               n_mbufs = rte_eth_rx_burst(
-                       app.ports[i],
-                       0,
-                       app.mbuf_rx.array,
-                       app.burst_size_rx_read);
-
-               if (n_mbufs == 0)
-                       continue;
-
-               do {
-                       ret = rte_ring_sp_enqueue_bulk(
-                               app.rings_rx[i],
-                               (void **) app.mbuf_rx.array,
-                               n_mbufs, NULL);
-               } while (ret == 0);
+       while (!force_quit) {
+               for (i = 0; i < app.n_ports; i++) {
+                       uint16_t n_mbufs;
+
+                       n_mbufs = rte_eth_rx_burst(
+                               app.ports[i],
+                               0,
+                               app.mbuf_rx.array,
+                               app.burst_size_rx_read);
+
+                       if (n_mbufs == 0)
+                               continue;
+
+                       do {
+                               ret = rte_ring_sp_enqueue_bulk(
+                                       app.rings_rx[i],
+                                       (void **) app.mbuf_rx.array,
+                                       n_mbufs, NULL);
+                       } while (ret == 0 && !force_quit);
+               }
        }
 }
 
@@ -82,25 +84,27 @@ app_main_loop_worker(void) {
        if (worker_mbuf == NULL)
                rte_panic("Worker thread: cannot allocate buffer space\n");
 
-       for (i = 0; ; i = ((i + 1) & (app.n_ports - 1))) {
-               int ret;
-
-               ret = rte_ring_sc_dequeue_bulk(
-                       app.rings_rx[i],
-                       (void **) worker_mbuf->array,
-                       app.burst_size_worker_read,
-                       NULL);
+       while (!force_quit) {
+               for (i = 0; i < app.n_ports; i++) {
+                       int ret;
 
-               if (ret == 0)
-                       continue;
-
-               do {
-                       ret = rte_ring_sp_enqueue_bulk(
-                               app.rings_tx[i ^ 1],
+                       ret = rte_ring_sc_dequeue_bulk(
+                               app.rings_rx[i],
                                (void **) worker_mbuf->array,
-                               app.burst_size_worker_write,
+                               app.burst_size_worker_read,
                                NULL);
-               } while (ret == 0);
+
+                       if (ret == 0)
+                               continue;
+
+                       do {
+                               ret = rte_ring_sp_enqueue_bulk(
+                                       app.rings_tx[i ^ 1],
+                                       (void **) worker_mbuf->array,
+                                       app.burst_size_worker_write,
+                                       NULL);
+                       } while (ret == 0 && !force_quit);
+               }
        }
 }
 
@@ -110,45 +114,47 @@ app_main_loop_tx(void) {
 
        RTE_LOG(INFO, USER1, "Core %u is doing TX\n", rte_lcore_id());
 
-       for (i = 0; ; i = ((i + 1) & (app.n_ports - 1))) {
-               uint16_t n_mbufs, n_pkts;
-               int ret;
+       while (!force_quit) {
+               for (i = 0; i < app.n_ports; i++) {
+                       uint16_t n_mbufs, n_pkts;
+                       int ret;
 
-               n_mbufs = app.mbuf_tx[i].n_mbufs;
+                       n_mbufs = app.mbuf_tx[i].n_mbufs;
 
-               ret = rte_ring_sc_dequeue_bulk(
-                       app.rings_tx[i],
-                       (void **) &app.mbuf_tx[i].array[n_mbufs],
-                       app.burst_size_tx_read,
-                       NULL);
+                       ret = rte_ring_sc_dequeue_bulk(
+                               app.rings_tx[i],
+                               (void **) &app.mbuf_tx[i].array[n_mbufs],
+                               app.burst_size_tx_read,
+                               NULL);
 
-               if (ret == 0)
-                       continue;
+                       if (ret == 0)
+                               continue;
 
-               n_mbufs += app.burst_size_tx_read;
+                       n_mbufs += app.burst_size_tx_read;
 
-               if (n_mbufs < app.burst_size_tx_write) {
-                       app.mbuf_tx[i].n_mbufs = n_mbufs;
-                       continue;
-               }
+                       if (n_mbufs < app.burst_size_tx_write) {
+                               app.mbuf_tx[i].n_mbufs = n_mbufs;
+                               continue;
+                       }
 
-               n_pkts = rte_eth_tx_burst(
-                       app.ports[i],
-                       0,
-                       app.mbuf_tx[i].array,
-                       n_mbufs);
+                       n_pkts = rte_eth_tx_burst(
+                               app.ports[i],
+                               0,
+                               app.mbuf_tx[i].array,
+                               n_mbufs);
 
-               if (n_pkts < n_mbufs) {
-                       uint16_t k;
+                       if (n_pkts < n_mbufs) {
+                               uint16_t k;
 
-                       for (k = n_pkts; k < n_mbufs; k++) {
-                               struct rte_mbuf *pkt_to_free;
+                               for (k = n_pkts; k < n_mbufs; k++) {
+                                       struct rte_mbuf *pkt_to_free;
 
-                               pkt_to_free = app.mbuf_tx[i].array[k];
-                               rte_pktmbuf_free(pkt_to_free);
+                                       pkt_to_free = app.mbuf_tx[i].array[k];
+                                       rte_pktmbuf_free(pkt_to_free);
+                               }
                        }
-               }
 
-               app.mbuf_tx[i].n_mbufs = 0;
+                       app.mbuf_tx[i].n_mbufs = 0;
+               }
        }
 }
-- 
2.25.1

Reply via email to