app/pdump: support multi-core capture
authorVipin Varghese <vipin.varghese@intel.com>
Thu, 4 Apr 2019 08:55:15 +0000 (14:25 +0530)
committerThomas Monjalon <thomas@monjalon.net>
Mon, 22 Apr 2019 19:45:16 +0000 (21:45 +0200)
Add option --multi, to enhance pdump application to allow capture
on unique cores for each --pdump option. If option --multi is ignored
the default capture occurs on single core for all --pdump options.

Signed-off-by: Vipin Varghese <vipin.varghese@intel.com>
Acked-by: Reshma Pattan <reshma.pattan@intel.com>
app/pdump/main.c
doc/guides/tools/pdump.rst

index 950f434..3d20854 100644 (file)
@@ -28,6 +28,9 @@
 #include <rte_pdump.h>
 
 #define CMD_LINE_OPT_PDUMP "pdump"
+#define CMD_LINE_OPT_PDUMP_NUM 256
+#define CMD_LINE_OPT_MULTI "multi"
+#define CMD_LINE_OPT_MULTI_NUM 257
 #define PDUMP_PORT_ARG "port"
 #define PDUMP_PCI_ARG "device_id"
 #define PDUMP_QUEUE_ARG "queue"
@@ -139,12 +142,15 @@ struct parse_val {
 static int num_tuples;
 static struct rte_eth_conf port_conf_default;
 static volatile uint8_t quit_signal;
+static uint8_t multiple_core_capture;
 
 /**< display usage */
 static void
 pdump_usage(const char *prgname)
 {
-       printf("usage: %s [EAL options] -- --pdump "
+       printf("usage: %s [EAL options]"
+                       " --["CMD_LINE_OPT_MULTI"]\n"
+                       " --"CMD_LINE_OPT_PDUMP" "
                        "'(port=<port id> | device_id=<pci id or vdev name>),"
                        "(queue=<queue_id>),"
                        "(rx-dev=<iface or pcap file> |"
@@ -375,7 +381,8 @@ launch_args_parse(int argc, char **argv, char *prgname)
        int opt, ret;
        int option_index;
        static struct option long_option[] = {
-               {"pdump", 1, 0, 0},
+               {CMD_LINE_OPT_PDUMP, 1, 0, CMD_LINE_OPT_PDUMP_NUM},
+               {CMD_LINE_OPT_MULTI, 0, 0, CMD_LINE_OPT_MULTI_NUM},
                {NULL, 0, 0, 0}
        };
 
@@ -386,17 +393,16 @@ launch_args_parse(int argc, char **argv, char *prgname)
        while ((opt = getopt_long(argc, argv, " ",
                        long_option, &option_index)) != EOF) {
                switch (opt) {
-               case 0:
-                       if (!strncmp(long_option[option_index].name,
-                                       CMD_LINE_OPT_PDUMP,
-                                       sizeof(CMD_LINE_OPT_PDUMP))) {
-                               ret = parse_pdump(optarg);
-                               if (ret) {
-                                       pdump_usage(prgname);
-                                       return -1;
-                               }
+               case CMD_LINE_OPT_PDUMP_NUM:
+                       ret = parse_pdump(optarg);
+                       if (ret) {
+                               pdump_usage(prgname);
+                               return -1;
                        }
                        break;
+               case CMD_LINE_OPT_MULTI_NUM:
+                       multiple_core_capture = 1;
+                       break;
                default:
                        pdump_usage(prgname);
                        return -1;
@@ -834,23 +840,74 @@ 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;
+
+       printf(" core (%u); port %u device (%s) queue %u\n",
+                       rte_lcore_id(), pt->port, pt->device_id, pt->queue);
+       fflush(stdout);
+
+       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;
+
+       if (!multiple_core_capture) {
+               printf(" core (%u), capture for (%d) tuples\n",
+                               rte_lcore_id(), num_tuples);
+
+               for (i = 0; i < num_tuples; i++)
+                       printf(" - port %u device (%s) queue %u\n",
+                               pdump_t[i].port,
+                               pdump_t[i].device_id,
+                               pdump_t[i].queue);
 
-       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);
+               while (!quit_signal) {
+                       for (i = 0; i < num_tuples; i++)
+                               pdump_packets(&pdump_t[i]);
                }
+
+               return;
+       }
+
+       /* check if there enough core */
+       if ((uint32_t)num_tuples >= rte_lcore_count()) {
+               printf("Insufficient cores to run parallel!\n");
+               return;
        }
+
+       lcore_id = rte_get_next_lcore(lcore_id, 1, 0);
+
+       for (i = 0; i < num_tuples; i++) {
+               rte_eal_remote_launch(dump_packets_core,
+                               &pdump_t[i], lcore_id);
+               lcore_id = rte_get_next_lcore(lcore_id, 1, 0);
+
+               if (rte_eal_wait_lcore(lcore_id) < 0)
+                       rte_exit(EXIT_FAILURE, "failed to wait\n");
+       }
+
+       /* master core */
+       while (!quit_signal)
+               ;
 }
 
 int
index 7c2b73e..53cd2b4 100644 (file)
@@ -35,6 +35,7 @@ The tool has a number of command line options:
 .. code-block:: console
 
    ./build/app/dpdk-pdump --
+                          [--multi]
                           --pdump '(port=<port id> | device_id=<pci id or vdev name>),
                                    (queue=<queue_id>),
                                    (rx-dev=<iface or pcap file> |
@@ -43,6 +44,10 @@ The tool has a number of command line options:
                                    [mbuf-size=<mbuf data size>],
                                    [total-num-mbufs=<number of mbufs>]'
 
+The ``--multi`` command line option is optional argument. If passed, capture
+will be running on unique cores for all ``--pdump`` options. If ignored,
+capture will be running on single core for all ``--pdump`` options.
+
 The ``--pdump`` command line option is mandatory and it takes various sub arguments which are described in
 below section.
 
@@ -112,4 +117,5 @@ 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 -- --pdump 'port=0,queue=*,rx-dev=/tmp/rx.pcap'
+   $ sudo ./build/app/dpdk-pdump -l 3,4,5 -- --multi --pdump 'port=0,queue=*,rx-dev=/tmp/rx-1.pcap' --pdump 'port=1,queue=*,rx-dev=/tmp/rx-2.pcap'