[v2,2/3] app/eventdev: use enqueue new event burst routine
Checks
Commit Message
From: Pavan Nikhilesh <pbhagavatula@marvell.com>
Use the `rte_event_enqueue_new_burst` routine to enqueue events
with rte_event::op as RTE_EVENT_OP_NEW. This allows PMDs to use
optimized enqueue routines.
Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
---
app/test-eventdev/evt_options.c | 2 +-
app/test-eventdev/test_perf_common.c | 58 +++++++++++++++++-----------
2 files changed, 37 insertions(+), 23 deletions(-)
Comments
>From: Pavan Nikhilesh <pbhagavatula@marvell.com>
>
>Use the `rte_event_enqueue_new_burst` routine to enqueue events
>with rte_event::op as RTE_EVENT_OP_NEW. This allows PMDs to use
>optimized enqueue routines.
>
>Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>[]
Acked-by: Shijith Thotton <sthotton@marvell.com>
>---
> app/test-eventdev/evt_options.c | 2 +-
> app/test-eventdev/test_perf_common.c | 58 +++++++++++++++++-----------
> 2 files changed, 37 insertions(+), 23 deletions(-)
>
>diff --git a/app/test-eventdev/evt_options.c b/app/test-eventdev/evt_options.c
>index b175c067cd..03fb3bfce0 100644
>--- a/app/test-eventdev/evt_options.c
>+++ b/app/test-eventdev/evt_options.c
>@@ -27,7 +27,7 @@ evt_options_default(struct evt_options *opt)
> opt->nb_flows = 1024;
> opt->socket_id = SOCKET_ID_ANY;
> opt->pool_sz = 16 * 1024;
>- opt->prod_enq_burst_sz = 1;
>+ opt->prod_enq_burst_sz = 0;
> opt->wkr_deq_dep = 16;
> opt->nb_pkts = (1ULL << 26); /* do ~64M packets */
> opt->nb_timers = 1E8;
>diff --git a/app/test-eventdev/test_perf_common.c b/app/test-
>eventdev/test_perf_common.c
>index fd434666cb..68af3cb346 100644
>--- a/app/test-eventdev/test_perf_common.c
>+++ b/app/test-eventdev/test_perf_common.c
>@@ -131,8 +131,10 @@ perf_producer(void *arg)
> uint32_t flow_counter = 0;
> uint64_t count = 0;
> struct perf_elt *m[BURST_SIZE + 1] = {NULL};
>+ uint8_t enable_fwd_latency;
> struct rte_event ev;
>
>+ enable_fwd_latency = opt->fwd_latency;
> if (opt->verbose_level > 1)
> printf("%s(): lcore %d dev_id %d port=%d queue %d\n",
>__func__,
> rte_lcore_id(), dev_id, port, p->queue_id);
>@@ -151,13 +153,16 @@ perf_producer(void *arg)
> for (i = 0; i < BURST_SIZE; i++) {
> ev.flow_id = flow_counter++ % nb_flows;
> ev.event_ptr = m[i];
>- m[i]->timestamp = rte_get_timer_cycles();
>- while (rte_event_enqueue_burst(dev_id,
>- port, &ev, 1) != 1) {
>+ if (enable_fwd_latency)
>+ m[i]->timestamp = rte_get_timer_cycles();
>+ while (rte_event_enqueue_new_burst(dev_id, port, &ev,
>+ 1) != 1) {
> if (t->done)
> break;
> rte_pause();
>- m[i]->timestamp = rte_get_timer_cycles();
>+ if (enable_fwd_latency)
>+ m[i]->timestamp =
>+ rte_get_timer_cycles();
> }
> }
> count += BURST_SIZE;
>@@ -171,7 +176,6 @@ perf_producer_burst(void *arg)
> {
> uint32_t i;
> uint64_t timestamp;
>- struct rte_event_dev_info dev_info;
> struct prod_data *p = arg;
> struct test_perf *t = p->t;
> struct evt_options *opt = t->opt;
>@@ -183,15 +187,13 @@ perf_producer_burst(void *arg)
> uint32_t flow_counter = 0;
> uint16_t enq = 0;
> uint64_t count = 0;
>- struct perf_elt *m[MAX_PROD_ENQ_BURST_SIZE + 1];
>- struct rte_event ev[MAX_PROD_ENQ_BURST_SIZE + 1];
>+ struct perf_elt *m[opt->prod_enq_burst_sz + 1];
>+ struct rte_event ev[opt->prod_enq_burst_sz + 1];
> uint32_t burst_size = opt->prod_enq_burst_sz;
>+ uint8_t enable_fwd_latency;
>
>- memset(m, 0, sizeof(*m) * (MAX_PROD_ENQ_BURST_SIZE + 1));
>- rte_event_dev_info_get(dev_id, &dev_info);
>- if (dev_info.max_event_port_enqueue_depth < burst_size)
>- burst_size = dev_info.max_event_port_enqueue_depth;
>-
>+ enable_fwd_latency = opt->fwd_latency;
>+ memset(m, 0, sizeof(*m) * (opt->prod_enq_burst_sz + 1));
> if (opt->verbose_level > 1)
> printf("%s(): lcore %d dev_id %d port=%d queue %d\n",
>__func__,
> rte_lcore_id(), dev_id, port, p->queue_id);
>@@ -212,19 +214,21 @@ perf_producer_burst(void *arg)
> for (i = 0; i < burst_size; i++) {
> ev[i].flow_id = flow_counter++ % nb_flows;
> ev[i].event_ptr = m[i];
>- m[i]->timestamp = timestamp;
>+ if (enable_fwd_latency)
>+ m[i]->timestamp = timestamp;
> }
>- enq = rte_event_enqueue_burst(dev_id, port, ev, burst_size);
>+ enq = rte_event_enqueue_new_burst(dev_id, port, ev,
>burst_size);
> while (enq < burst_size) {
>- enq += rte_event_enqueue_burst(dev_id, port,
>- ev + enq,
>- burst_size - enq);
>+ enq += rte_event_enqueue_new_burst(
>+ dev_id, port, ev + enq, burst_size - enq);
> if (t->done)
> break;
> rte_pause();
>- timestamp = rte_get_timer_cycles();
>- for (i = enq; i < burst_size; i++)
>- m[i]->timestamp = timestamp;
>+ if (enable_fwd_latency) {
>+ timestamp = rte_get_timer_cycles();
>+ for (i = enq; i < burst_size; i++)
>+ m[i]->timestamp = timestamp;
>+ }
> }
> count += burst_size;
> }
>@@ -799,9 +803,19 @@ perf_event_crypto_producer_burst(void *arg)
> static int
> perf_producer_wrapper(void *arg)
> {
>+ struct rte_event_dev_info dev_info;
> struct prod_data *p = arg;
> struct test_perf *t = p->t;
>- bool burst = evt_has_burst_mode(p->dev_id);
>+
>+ rte_event_dev_info_get(p->dev_id, &dev_info);
>+ if (!t->opt->prod_enq_burst_sz) {
>+ t->opt->prod_enq_burst_sz = MAX_PROD_ENQ_BURST_SIZE;
>+ if (dev_info.max_event_port_enqueue_depth > 0 &&
>+ (uint32_t)dev_info.max_event_port_enqueue_depth <
>+ t->opt->prod_enq_burst_sz)
>+ t->opt->prod_enq_burst_sz =
>+ dev_info.max_event_port_enqueue_depth;
>+ }
>
> /* In case of synthetic producer, launch perf_producer or
> * perf_producer_burst depending on producer enqueue burst size
>@@ -811,7 +825,7 @@ perf_producer_wrapper(void *arg)
> return perf_producer(arg);
> else if (t->opt->prod_type == EVT_PROD_TYPE_SYNT &&
> t->opt->prod_enq_burst_sz > 1) {
>- if (!burst)
>+ if (dev_info.max_event_port_enqueue_depth == 1)
> evt_err("This event device does not support burst
>mode");
> else
> return perf_producer_burst(arg);
>--
>2.25.1
@@ -27,7 +27,7 @@ evt_options_default(struct evt_options *opt)
opt->nb_flows = 1024;
opt->socket_id = SOCKET_ID_ANY;
opt->pool_sz = 16 * 1024;
- opt->prod_enq_burst_sz = 1;
+ opt->prod_enq_burst_sz = 0;
opt->wkr_deq_dep = 16;
opt->nb_pkts = (1ULL << 26); /* do ~64M packets */
opt->nb_timers = 1E8;
@@ -131,8 +131,10 @@ perf_producer(void *arg)
uint32_t flow_counter = 0;
uint64_t count = 0;
struct perf_elt *m[BURST_SIZE + 1] = {NULL};
+ uint8_t enable_fwd_latency;
struct rte_event ev;
+ enable_fwd_latency = opt->fwd_latency;
if (opt->verbose_level > 1)
printf("%s(): lcore %d dev_id %d port=%d queue %d\n", __func__,
rte_lcore_id(), dev_id, port, p->queue_id);
@@ -151,13 +153,16 @@ perf_producer(void *arg)
for (i = 0; i < BURST_SIZE; i++) {
ev.flow_id = flow_counter++ % nb_flows;
ev.event_ptr = m[i];
- m[i]->timestamp = rte_get_timer_cycles();
- while (rte_event_enqueue_burst(dev_id,
- port, &ev, 1) != 1) {
+ if (enable_fwd_latency)
+ m[i]->timestamp = rte_get_timer_cycles();
+ while (rte_event_enqueue_new_burst(dev_id, port, &ev,
+ 1) != 1) {
if (t->done)
break;
rte_pause();
- m[i]->timestamp = rte_get_timer_cycles();
+ if (enable_fwd_latency)
+ m[i]->timestamp =
+ rte_get_timer_cycles();
}
}
count += BURST_SIZE;
@@ -171,7 +176,6 @@ perf_producer_burst(void *arg)
{
uint32_t i;
uint64_t timestamp;
- struct rte_event_dev_info dev_info;
struct prod_data *p = arg;
struct test_perf *t = p->t;
struct evt_options *opt = t->opt;
@@ -183,15 +187,13 @@ perf_producer_burst(void *arg)
uint32_t flow_counter = 0;
uint16_t enq = 0;
uint64_t count = 0;
- struct perf_elt *m[MAX_PROD_ENQ_BURST_SIZE + 1];
- struct rte_event ev[MAX_PROD_ENQ_BURST_SIZE + 1];
+ struct perf_elt *m[opt->prod_enq_burst_sz + 1];
+ struct rte_event ev[opt->prod_enq_burst_sz + 1];
uint32_t burst_size = opt->prod_enq_burst_sz;
+ uint8_t enable_fwd_latency;
- memset(m, 0, sizeof(*m) * (MAX_PROD_ENQ_BURST_SIZE + 1));
- rte_event_dev_info_get(dev_id, &dev_info);
- if (dev_info.max_event_port_enqueue_depth < burst_size)
- burst_size = dev_info.max_event_port_enqueue_depth;
-
+ enable_fwd_latency = opt->fwd_latency;
+ memset(m, 0, sizeof(*m) * (opt->prod_enq_burst_sz + 1));
if (opt->verbose_level > 1)
printf("%s(): lcore %d dev_id %d port=%d queue %d\n", __func__,
rte_lcore_id(), dev_id, port, p->queue_id);
@@ -212,19 +214,21 @@ perf_producer_burst(void *arg)
for (i = 0; i < burst_size; i++) {
ev[i].flow_id = flow_counter++ % nb_flows;
ev[i].event_ptr = m[i];
- m[i]->timestamp = timestamp;
+ if (enable_fwd_latency)
+ m[i]->timestamp = timestamp;
}
- enq = rte_event_enqueue_burst(dev_id, port, ev, burst_size);
+ enq = rte_event_enqueue_new_burst(dev_id, port, ev, burst_size);
while (enq < burst_size) {
- enq += rte_event_enqueue_burst(dev_id, port,
- ev + enq,
- burst_size - enq);
+ enq += rte_event_enqueue_new_burst(
+ dev_id, port, ev + enq, burst_size - enq);
if (t->done)
break;
rte_pause();
- timestamp = rte_get_timer_cycles();
- for (i = enq; i < burst_size; i++)
- m[i]->timestamp = timestamp;
+ if (enable_fwd_latency) {
+ timestamp = rte_get_timer_cycles();
+ for (i = enq; i < burst_size; i++)
+ m[i]->timestamp = timestamp;
+ }
}
count += burst_size;
}
@@ -799,9 +803,19 @@ perf_event_crypto_producer_burst(void *arg)
static int
perf_producer_wrapper(void *arg)
{
+ struct rte_event_dev_info dev_info;
struct prod_data *p = arg;
struct test_perf *t = p->t;
- bool burst = evt_has_burst_mode(p->dev_id);
+
+ rte_event_dev_info_get(p->dev_id, &dev_info);
+ if (!t->opt->prod_enq_burst_sz) {
+ t->opt->prod_enq_burst_sz = MAX_PROD_ENQ_BURST_SIZE;
+ if (dev_info.max_event_port_enqueue_depth > 0 &&
+ (uint32_t)dev_info.max_event_port_enqueue_depth <
+ t->opt->prod_enq_burst_sz)
+ t->opt->prod_enq_burst_sz =
+ dev_info.max_event_port_enqueue_depth;
+ }
/* In case of synthetic producer, launch perf_producer or
* perf_producer_burst depending on producer enqueue burst size
@@ -811,7 +825,7 @@ perf_producer_wrapper(void *arg)
return perf_producer(arg);
else if (t->opt->prod_type == EVT_PROD_TYPE_SYNT &&
t->opt->prod_enq_burst_sz > 1) {
- if (!burst)
+ if (dev_info.max_event_port_enqueue_depth == 1)
evt_err("This event device does not support burst mode");
else
return perf_producer_burst(arg);