A couple nit-picks on the test, but once resolved: Acked-by: Gage Eads <gage.e...@intel.com>
> -----Original Message----- > From: Van Haaren, Harry > Sent: Monday, May 29, 2017 10:17 AM > To: dev@dpdk.org > Cc: jerin.ja...@caviumnetworks.com; Eads, Gage <gage.e...@intel.com>; > Van Haaren, Harry <harry.van.haa...@intel.com> > Subject: [PATCH] event/sw: fix credit tracking in port dequeue > > This patch targets the next-eventdev tree. > > Single-link optimized ports previously did not correctly track credits when > dequeued, and re-enqueued as a FORWARD type. This could "inflate" the > number of credits in the system. > > A unit test is added to reproduce and verify the issue. The fixed > implementation > counts FORWARD packets and reduces the number of credits the port has if it > is > of single-link type. > > Fixes: 656af9180014 ("event/sw: add worker core functions") > > Signed-off-by: Harry van Haaren <harry.van.haa...@intel.com> > --- > drivers/event/sw/sw_evdev_worker.c | 5 ++++ > test/test/test_eventdev_sw.c | 58 > +++++++++++++++++++++++++++++++++++++- > 2 files changed, 62 insertions(+), 1 deletion(-) > > diff --git a/drivers/event/sw/sw_evdev_worker.c > b/drivers/event/sw/sw_evdev_worker.c > index 9cb6bef..b738506 100644 > --- a/drivers/event/sw/sw_evdev_worker.c > +++ b/drivers/event/sw/sw_evdev_worker.c > @@ -87,6 +87,7 @@ sw_event_enqueue_burst(void *port, const struct > rte_event ev[], uint16_t num) > return 0; > } > > + uint32_t forwards = 0; > for (i = 0; i < num; i++) { > int op = ev[i].op; > int outstanding = p->outstanding_releases > 0; @@ -95,6 > +96,7 @@ sw_event_enqueue_burst(void *port, const struct rte_event ev[], > uint16_t num) > p->inflight_credits -= (op == RTE_EVENT_OP_NEW); > p->inflight_credits += (op == RTE_EVENT_OP_RELEASE) * > outstanding; > + forwards += (op == RTE_EVENT_OP_FORWARD); > > new_ops[i] = sw_qe_flag_map[op]; > new_ops[i] &= ~(invalid_qid << QE_FLAG_VALID_SHIFT); @@ - > 113,6 +115,9 @@ sw_event_enqueue_burst(void *port, const struct rte_event > ev[], uint16_t num) > } > } > > + /* handle directed port forward credits */ > + p->inflight_credits -= forwards * p->is_directed; > + > /* returns number of events actually enqueued */ > uint32_t enq = qe_ring_enqueue_burst_with_ops(p->rx_worker_ring, > ev, i, > new_ops); > diff --git a/test/test/test_eventdev_sw.c b/test/test/test_eventdev_sw.c > index > b187d02..aaa9729 100644 > --- a/test/test/test_eventdev_sw.c > +++ b/test/test/test_eventdev_sw.c > @@ -548,6 +548,57 @@ test_single_directed_packet(struct test *t) > return 0; > } > > +static int > +test_directed_forward_credits(struct test *t) { > + uint32_t i; > + int32_t err; > + > + if (init(t, 1, 1) < 0 || > + create_ports(t, 1) < 0 || > + create_directed_qids(t, 1, t->port) < 0) > + return -1; > + > + if (rte_event_dev_start(evdev) < 0) { > + printf("%d: Error with start call\n", __LINE__); > + return -1; > + } > + > + struct rte_event ev = { > + .op = RTE_EVENT_OP_NEW, > + .queue_id = 0, > + }; > + > + for (i = 0; i < 1000; i++) { > + err = rte_event_enqueue_burst(evdev, 0, &ev, 1); > + if (err < 0) { > + printf("%d: error failed to enqueue\n", __LINE__); > + return -1; > + } > + rte_event_schedule(evdev); > + struct test_event_dev_stats stats; > + err = test_event_dev_stats_get(evdev, &stats); Does this stats get call serve a purpose? > + if (err) { > + printf("%d: error failed to get stats\n", __LINE__); > + return -1; > + } > + > + uint32_t deq_pkts; > + deq_pkts = rte_event_dequeue_burst(evdev, 0, &ev, 1, 0); > + if (deq_pkts != 1) { > + printf("%d: error failed to deq\n", __LINE__); > + return -1; > + } > + > + /* re-write event to be a forward, and continue looping it */ > + ev.op = RTE_EVENT_OP_FORWARD; > + } > + > + //rte_event_dev_dump(0, stdout); Comment can be deleted