Enhance pdump application, to allow user to run on multiple cores.

Signed-off-by: Vipin Varghese <vipin.vargh...@intel.com>
---
 app/pdump/main.c           | 75 ++++++++++++++++++++++++++++++++------
 doc/guides/tools/pdump.rst |  5 +++
 2 files changed, 69 insertions(+), 11 deletions(-)

diff --git a/app/pdump/main.c b/app/pdump/main.c
index ccf2a1d2f..0d0e80ff1 100644
--- a/app/pdump/main.c
+++ b/app/pdump/main.c
@@ -62,6 +62,7 @@
 #define SIZE 256
 #define BURST_SIZE 32
 #define NUM_VDEVS 2
+#define CORES_STR_SIZE 32
 
 /* true if x is a power of 2 */
 #define POWEROF2(x) ((((x)-1) & (x)) == 0)
@@ -144,7 +145,7 @@ static volatile uint8_t quit_signal;
 static void
 pdump_usage(const char *prgname)
 {
-       printf("usage: %s [EAL options] -- --pdump "
+       printf("usage: %s [EAL options] -- [-l=<list of cores>] --pdump "
                        "'(port=<port id> | device_id=<pci id or vdev name>),"
                        "(queue=<queue_id>),"
                        "(rx-dev=<iface or pcap file> |"
@@ -415,6 +416,7 @@ print_pdump_stats(void)
        for (i = 0; i < num_tuples; i++) {
                printf("##### PDUMP DEBUG STATS #####\n");
                pt = &pdump_t[i];
+               printf(" == DPDK interface (%d) ==\n", i);
                printf(" -packets dequeued:                     %"PRIu64"\n",
                                                        pt->stats.dequeue_pkts);
                printf(" -packets transmitted to vdev:          %"PRIu64"\n",
@@ -834,22 +836,62 @@ enable_pdump(void)
        }
 }
 
+static inline void
+pdump_packets(struct pdump_tuples *pt)
+{
+       if (pt->dir & RTE_PDUMP_FLAG_RX)
+               pdump_rxtx(pt->rx_ring, pt->rx_vdev_id, &pt->stats);
+       if (pt->dir & RTE_PDUMP_FLAG_TX)
+               pdump_rxtx(pt->tx_ring, pt->tx_vdev_id, &pt->stats);
+}
+
+static int
+dump_packets_core(void *arg)
+{
+       struct pdump_tuples *pt = (struct pdump_tuples *) arg;
+
+       while (!quit_signal)
+               pdump_packets(pt);
+
+       return 0;
+}
+
 static inline void
 dump_packets(void)
 {
        int i;
-       struct pdump_tuples *pt;
+       uint32_t lcore_id = 0;
+
+       lcore_id = rte_get_next_lcore(lcore_id, 1, 1);
+
+       if (rte_lcore_count() == 1) {
+               while (!quit_signal) {
+                       for (i = 0; i < num_tuples; i++) {
+                               struct pdump_tuples *pt = &pdump_t[i];
+                               pdump_packets(pt);
+                       }
+               }
+       } else {
+               printf(" Tuples (%u) lcores (%u)\n",
+                       num_tuples, rte_lcore_count());
+
+               if ((uint32_t)num_tuples >= rte_lcore_count()) {
+                       printf("Insufficent Cores\n");
+                       return;
+               }
 
-       while (!quit_signal) {
                for (i = 0; i < num_tuples; i++) {
-                       pt = &pdump_t[i];
-                       if (pt->dir & RTE_PDUMP_FLAG_RX)
-                               pdump_rxtx(pt->rx_ring, pt->rx_vdev_id,
-                                       &pt->stats);
-                       if (pt->dir & RTE_PDUMP_FLAG_TX)
-                               pdump_rxtx(pt->tx_ring, pt->tx_vdev_id,
-                                       &pt->stats);
+                       /* use remote launch for n interfaces */
+                       rte_eal_remote_launch(dump_packets_core,
+                               &pdump_t[i], lcore_id);
+                       lcore_id = rte_get_next_lcore(lcore_id, 0, 1);
+
+                       if (rte_eal_wait_lcore(lcore_id) < 0)
+                               rte_exit(EXIT_FAILURE, "failed to wait\n");
                }
+
+               while (!quit_signal)
+                       ;
        }
 }
 
@@ -860,7 +902,7 @@ main(int argc, char **argv)
        int ret;
        int i;
 
-       char c_flag[] = "-c1";
+       char c_flag[CORES_STR_SIZE] = "-c1";
        char n_flag[] = "-n4";
        char mp_flag[] = "--proc-type=secondary";
        char *argp[argc + 3];
@@ -868,6 +910,17 @@ main(int argc, char **argv)
        /* catch ctrl-c so we can print on exit */
        signal(SIGINT, signal_handler);
 
+       for (i = 0; i < argc; i++) {
+               if (strstr(argv[i], "-l")) {
+                       snprintf(c_flag, RTE_DIM(c_flag), "-l %s", argv[i+1]);
+                       strlcpy(argv[i], "", 2);
+                       strlcpy(argv[i + 1], "", 2);
+                       break;
+               }
+       }
+
+       printf(" c_flag %s", c_flag);
+
        argp[0] = argv[0];
        argp[1] = c_flag;
        argp[2] = n_flag;
diff --git a/doc/guides/tools/pdump.rst b/doc/guides/tools/pdump.rst
index 7c2b73e72..3cfd9fc44 100644
--- a/doc/guides/tools/pdump.rst
+++ b/doc/guides/tools/pdump.rst
@@ -35,6 +35,7 @@ The tool has a number of command line options:
 .. code-block:: console
 
    ./build/app/dpdk-pdump --
+                          [-l <list of cores>]
                           --pdump '(port=<port id> | device_id=<pci id or vdev 
name>),
                                    (queue=<queue_id>),
                                    (rx-dev=<iface or pcap file> |
@@ -43,6 +44,9 @@ The tool has a number of command line options:
                                    [mbuf-size=<mbuf data size>],
                                    [total-num-mbufs=<number of mbufs>]'
 
+The ``-l`` command line option is optional and it takes list cores on which
+capture for each ``--pdump`` is to be run.
+
 The ``--pdump`` command line option is mandatory and it takes various sub 
arguments which are described in
 below section.
 
@@ -113,3 +117,4 @@ Example
 .. code-block:: console
 
    $ sudo ./build/app/dpdk-pdump -- --pdump 
'port=0,queue=*,rx-dev=/tmp/rx.pcap'
+   $ sudo ./build/app/dpdk-pdump -- -l 3,4,5 --pdump 
'port=0,queue=*,rx-dev=/tmp/rx.pcap' --pdump 
'port=1,queue=*,tx-dev=/tmp/tx.pcap'
-- 
2.17.1

Reply via email to