app/eventdev: add ethernet device producer option
authorPavan Nikhilesh <pbhagavatula@caviumnetworks.com>
Mon, 11 Dec 2017 15:13:39 +0000 (20:43 +0530)
committerJerin Jacob <jerin.jacob@caviumnetworks.com>
Fri, 19 Jan 2018 15:09:56 +0000 (16:09 +0100)
Add command line option --prod_type_ethdev to specify that the events
are generated by ethernet device.

Signed-off-by: Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>
Acked-by: Jerin Jacob <jerin.jacob@caviumnetworks.com>
app/test-eventdev/evt_options.c
app/test-eventdev/evt_options.h
app/test-eventdev/test_perf_common.c
doc/guides/tools/testeventdev.rst

index 40202d8..9683b22 100644 (file)
@@ -27,6 +27,7 @@ evt_options_default(struct evt_options *opt)
        opt->pool_sz = 16 * 1024;
        opt->wkr_deq_dep = 16;
        opt->nb_pkts = (1ULL << 26); /* do ~64M packets */
+       opt->prod_type = EVT_PROD_TYPE_SYNT;
 }
 
 typedef int (*option_parser_t)(struct evt_options *opt,
@@ -78,6 +79,13 @@ evt_parse_queue_priority(struct evt_options *opt, const char *arg __rte_unused)
        return 0;
 }
 
+static int
+evt_parse_eth_prod_type(struct evt_options *opt, const char *arg __rte_unused)
+{
+       opt->prod_type = EVT_PROD_TYPE_ETH_RX_ADPTR;
+       return 0;
+}
+
 static int
 evt_parse_test_name(struct evt_options *opt, const char *arg)
 {
@@ -161,6 +169,7 @@ usage(char *program)
                "\t--worker_deq_depth : dequeue depth of the worker\n"
                "\t--fwd_latency      : perform fwd_latency measurement\n"
                "\t--queue_priority   : enable queue priority\n"
+               "\t--prod_type_ethdev : use ethernet device as producer\n."
                );
        printf("available tests:\n");
        evt_test_dump_names();
@@ -221,6 +230,7 @@ static struct option lgopts[] = {
        { EVT_SCHED_TYPE_LIST,  1, 0, 0 },
        { EVT_FWD_LATENCY,      0, 0, 0 },
        { EVT_QUEUE_PRIORITY,   0, 0, 0 },
+       { EVT_PROD_ETHDEV,      0, 0, 0 },
        { EVT_HELP,             0, 0, 0 },
        { NULL,                 0, 0, 0 }
 };
@@ -244,6 +254,7 @@ evt_opts_parse_long(int opt_idx, struct evt_options *opt)
                { EVT_SCHED_TYPE_LIST, evt_parse_sched_type_list},
                { EVT_FWD_LATENCY, evt_parse_fwd_latency},
                { EVT_QUEUE_PRIORITY, evt_parse_queue_priority},
+               { EVT_PROD_ETHDEV, evt_parse_eth_prod_type},
        };
 
        for (i = 0; i < RTE_DIM(parsermap); i++) {
index 8e20ffe..46d1222 100644 (file)
 #define EVT_SCHED_TYPE_LIST      ("stlist")
 #define EVT_FWD_LATENCY          ("fwd_latency")
 #define EVT_QUEUE_PRIORITY       ("queue_priority")
+#define EVT_PROD_ETHDEV          ("prod_type_ethdev")
 #define EVT_HELP                 ("help")
 
+enum evt_prod_type {
+       EVT_PROD_TYPE_NONE,
+       EVT_PROD_TYPE_SYNT,          /* Producer type Synthetic i.e. CPU. */
+       EVT_PROD_TYPE_ETH_RX_ADPTR,  /* Producer type Eth Rx Adapter. */
+       EVT_PROD_TYPE_MAX,
+};
+
 struct evt_options {
 #define EVT_TEST_NAME_MAX_LEN     32
        char test_name[EVT_TEST_NAME_MAX_LEN];
@@ -48,6 +56,7 @@ struct evt_options {
        uint8_t dev_id;
        uint32_t fwd_latency:1;
        uint32_t q_priority:1;
+       enum evt_prod_type prod_type;
 };
 
 void evt_options_default(struct evt_options *opt);
@@ -238,4 +247,24 @@ evt_dump_sched_type_list(struct evt_options *opt)
        evt_dump_end;
 }
 
+#define EVT_PROD_MAX_NAME_LEN 50
+static inline void
+evt_dump_producer_type(struct evt_options *opt)
+{
+       char name[EVT_PROD_MAX_NAME_LEN];
+
+       switch (opt->prod_type) {
+       default:
+       case EVT_PROD_TYPE_SYNT:
+               snprintf(name, EVT_PROD_MAX_NAME_LEN,
+                               "Synthetic producer lcores");
+               break;
+       case EVT_PROD_TYPE_ETH_RX_ADPTR:
+               snprintf(name, EVT_PROD_MAX_NAME_LEN,
+                               "Ethdev Rx Adapter producers");
+               break;
+       }
+       evt_dump("prod_type", "%s", name);
+}
+
 #endif /* _EVT_OPTIONS_ */
index 18ef6d0..373c9ce 100644 (file)
@@ -259,8 +259,10 @@ perf_opt_check(struct evt_options *opt, uint64_t nb_queues)
 {
        unsigned int lcores;
 
-       /* N producer + N worker + 1 master */
-       lcores = 3;
+       /* N producer + N worker + 1 master when producer cores are used
+        * Else N worker + 1 master when Rx adapter is used
+        */
+       lcores = opt->prod_type == EVT_PROD_TYPE_SYNT ? 3 : 2;
 
        if (rte_lcore_count() < lcores) {
                evt_err("test need minimum %d lcores", lcores);
@@ -285,18 +287,21 @@ perf_opt_check(struct evt_options *opt, uint64_t nb_queues)
                return -1;
        }
 
-       /* Validate producer lcores */
-       if (evt_lcores_has_overlap(opt->plcores, rte_get_master_lcore())) {
-               evt_err("producer lcores overlaps with master lcore");
-               return -1;
-       }
-       if (evt_has_disabled_lcore(opt->plcores)) {
-               evt_err("one or more producer lcores are not enabled");
-               return -1;
-       }
-       if (!evt_has_active_lcore(opt->plcores)) {
-               evt_err("minimum one producer is required");
-               return -1;
+       if (opt->prod_type == EVT_PROD_TYPE_SYNT) {
+               /* Validate producer lcores */
+               if (evt_lcores_has_overlap(opt->plcores,
+                                       rte_get_master_lcore())) {
+                       evt_err("producer lcores overlaps with master lcore");
+                       return -1;
+               }
+               if (evt_has_disabled_lcore(opt->plcores)) {
+                       evt_err("one or more producer lcores are not enabled");
+                       return -1;
+               }
+               if (!evt_has_active_lcore(opt->plcores)) {
+                       evt_err("minimum one producer is required");
+                       return -1;
+               }
        }
 
        if (evt_has_invalid_stage(opt))
@@ -341,6 +346,7 @@ perf_opt_dump(struct evt_options *opt, uint8_t nb_queues)
        evt_dump("nb_evdev_queues", "%d", nb_queues);
        evt_dump_queue_priority(opt);
        evt_dump_sched_type_list(opt);
+       evt_dump_producer_type(opt);
 }
 
 void
index c42a430..9785e84 100644 (file)
@@ -119,6 +119,9 @@ The following are the application command-line options:
 
         Enable queue priority.
 
+* ``--prod_type_ethdev``
+
+        Use ethernet device as producer.
 
 Eventdev Tests
 --------------
@@ -321,6 +324,10 @@ the timestamp in the event on the first stage and then on termination, it
 updates the number of cycles to forward a packet. The application uses this
 value to compute the average latency to a forward packet.
 
+When ``--prod_type_ethdev`` command line option is selected, the application
+uses the probed ethernet devices as producers by configuring them as Rx
+adapters instead of using synthetic producers.
+
 Application options
 ^^^^^^^^^^^^^^^^^^^
 
@@ -339,6 +346,7 @@ Supported application command line options are following::
         --worker_deq_depth
         --fwd_latency
         --queue_priority
+        --prod_type_ethdev
 
 Example
 ^^^^^^^
@@ -350,6 +358,12 @@ Example command to run perf queue test:
    sudo build/app/dpdk-test-eventdev -c 0xf -s 0x1 --vdev=event_sw0 -- \
         --test=perf_queue --plcores=2 --wlcore=3 --stlist=p --nb_pkts=0
 
+Example command to run perf queue test with ethernet ports:
+
+.. code-block:: console
+
+   sudo build/app/dpdk-test-eventdev --vdev=event_sw0 -- \
+        --test=perf_queue --plcores=2 --wlcore=3 --stlist=p --prod_type_ethdev
 
 PERF_ATQ Test
 ~~~~~~~~~~~~~~~
@@ -416,6 +430,7 @@ Supported application command line options are following::
         --nb_pkts
         --worker_deq_depth
         --fwd_latency
+        --prod_type_ethdev
 
 Example
 ^^^^^^^