app/eventdev: add ethernet device producer option

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>
This commit is contained in:
Pavan Nikhilesh 2017-12-11 20:43:39 +05:30 committed by Jerin Jacob
parent 3c1984b564
commit b01974da9f
4 changed files with 75 additions and 14 deletions

View 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++) {

View File

@ -30,8 +30,16 @@
#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_ */

View 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

View 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
^^^^^^^