Looks good. Acked-by: Gage Eads <gage.e...@intel.com>
> -----Original Message----- > From: Jerin Jacob [mailto:jerin.ja...@caviumnetworks.com] > Sent: Tuesday, March 20, 2018 7:00 AM > To: dev@dpdk.org > Cc: Eads, Gage <gage.e...@intel.com>; Van Haaren, Harry > <harry.van.haa...@intel.com>; hemant.agra...@nxp.com; > pbhagavat...@caviumnetworks.com; nipun.gu...@nxp.com; > santosh.shu...@caviumnetworks.com; Jerin Jacob > <jerin.ja...@caviumnetworks.com> > Subject: [dpdk-dev] [PATCH] event/octeontx: support device stop flush callback > > Add support for stop flush callback along with unit test. > > Signed-off-by: Jerin Jacob <jerin.ja...@caviumnetworks.com> > --- > This patch has dependecy on "eventdev: add device stop flush callback" patch. > http://dpdk.org/dev/patchwork/patch/36106/ > --- > drivers/event/octeontx/ssovf_evdev.c | 15 +++++++++-- > drivers/event/octeontx/ssovf_evdev.h | 5 +++- > drivers/event/octeontx/ssovf_evdev_selftest.c | 36 > +++++++++++++++++++++++++++ > drivers/event/octeontx/ssovf_worker.c | 13 +++++----- > 4 files changed, 60 insertions(+), 9 deletions(-) > > diff --git a/drivers/event/octeontx/ssovf_evdev.c > b/drivers/event/octeontx/ssovf_evdev.c > index 713983b51..27adf00e3 100644 > --- a/drivers/event/octeontx/ssovf_evdev.c > +++ b/drivers/event/octeontx/ssovf_evdev.c > @@ -529,7 +529,7 @@ ssovf_start(struct rte_eventdev *dev) > > for (i = 0; i < edev->nb_event_queues; i++) { > /* Consume all the events through HWS0 */ > - ssows_flush_events(dev->data->ports[0], i); > + ssows_flush_events(dev->data->ports[0], i, NULL, NULL); > > base = octeontx_ssovf_bar(OCTEONTX_SSO_GROUP, i, 0); > base += SSO_VHGRP_QCTL; > @@ -540,6 +540,16 @@ ssovf_start(struct rte_eventdev *dev) > return 0; > } > > +static void > +ssows_handle_event(void *arg, struct rte_event event) { > + struct rte_eventdev *dev = arg; > + > + if (dev->dev_ops->dev_stop_flush != NULL) > + dev->dev_ops->dev_stop_flush(dev->data->dev_id, event, > + dev->data->dev_stop_flush_arg); > +} > + > static void > ssovf_stop(struct rte_eventdev *dev) > { > @@ -557,7 +567,8 @@ ssovf_stop(struct rte_eventdev *dev) > > for (i = 0; i < edev->nb_event_queues; i++) { > /* Consume all the events through HWS0 */ > - ssows_flush_events(dev->data->ports[0], i); > + ssows_flush_events(dev->data->ports[0], i, > + ssows_handle_event, dev); > > base = octeontx_ssovf_bar(OCTEONTX_SSO_GROUP, i, 0); > base += SSO_VHGRP_QCTL; > diff --git a/drivers/event/octeontx/ssovf_evdev.h > b/drivers/event/octeontx/ssovf_evdev.h > index d1825b4f3..643bc87f2 100644 > --- a/drivers/event/octeontx/ssovf_evdev.h > +++ b/drivers/event/octeontx/ssovf_evdev.h > @@ -164,7 +164,10 @@ uint16_t ssows_deq_timeout(void *port, struct > rte_event *ev, > uint64_t timeout_ticks); > uint16_t ssows_deq_timeout_burst(void *port, struct rte_event ev[], > uint16_t nb_events, uint64_t timeout_ticks); -void > ssows_flush_events(struct ssows *ws, uint8_t queue_id); > + > +typedef void (*ssows_handle_event_t)(void *arg, struct rte_event ev); > +void ssows_flush_events(struct ssows *ws, uint8_t queue_id, > + ssows_handle_event_t fn, void *arg); > void ssows_reset(struct ssows *ws); > int test_eventdev_octeontx(void); > > diff --git a/drivers/event/octeontx/ssovf_evdev_selftest.c > b/drivers/event/octeontx/ssovf_evdev_selftest.c > index 5e012a95a..239362fcf 100644 > --- a/drivers/event/octeontx/ssovf_evdev_selftest.c > +++ b/drivers/event/octeontx/ssovf_evdev_selftest.c > @@ -688,6 +688,40 @@ test_multi_queue_enq_multi_port_deq(void) > nr_ports, 0xff /* invalid */); > } > > +static > +void flush(uint8_t dev_id, struct rte_event event, void *arg) { > + unsigned int *count = arg; > + > + RTE_SET_USED(dev_id); > + if (event.event_type == RTE_EVENT_TYPE_CPU) > + *count = *count + 1; > + > +} > + > +static int > +test_dev_stop_flush(void) > +{ > + unsigned int total_events = MAX_EVENTS, count = 0; > + int ret; > + > + ret = generate_random_events(total_events); > + if (ret) > + return -1; > + > + ret = rte_event_dev_stop_flush_callback_register(evdev, flush, &count); > + if (ret) > + return -2; > + rte_event_dev_stop(evdev); > + ret = rte_event_dev_stop_flush_callback_register(evdev, NULL, NULL); > + if (ret) > + return -3; > + RTE_TEST_ASSERT_EQUAL(total_events, count, > + "count mismatch total_events=%d count=%d", > + total_events, count); > + return 0; > +} > + > static int > validate_queue_to_port_single_link(uint32_t index, uint8_t port, > struct rte_event *ev) > @@ -1414,6 +1448,8 @@ test_eventdev_octeontx(void) > test_simple_enqdeq_parallel); > OCTEONTX_TEST_RUN(eventdev_setup, eventdev_teardown, > test_multi_queue_enq_single_port_deq); > + OCTEONTX_TEST_RUN(eventdev_setup, eventdev_teardown, > + test_dev_stop_flush); > OCTEONTX_TEST_RUN(eventdev_setup, eventdev_teardown, > test_multi_queue_enq_multi_port_deq); > OCTEONTX_TEST_RUN(eventdev_setup, eventdev_teardown, diff --git > a/drivers/event/octeontx/ssovf_worker.c > b/drivers/event/octeontx/ssovf_worker.c > index 753c1e9f5..046eaf80f 100644 > --- a/drivers/event/octeontx/ssovf_worker.c > +++ b/drivers/event/octeontx/ssovf_worker.c > @@ -198,12 +198,14 @@ ssows_enq_fwd_burst(void *port, const struct > rte_event ev[], uint16_t nb_events) } > > void > -ssows_flush_events(struct ssows *ws, uint8_t queue_id) > +ssows_flush_events(struct ssows *ws, uint8_t queue_id, > + ssows_handle_event_t fn, void *arg) > { > uint32_t reg_off; > uint64_t aq_cnt = 1; > uint64_t cq_ds_cnt = 1; > - uint64_t enable, get_work0, get_work1; > + uint64_t enable; > + struct rte_event ev; > uint8_t *base = octeontx_ssovf_bar(OCTEONTX_SSO_GROUP, > queue_id, 0); > > enable = ssovf_read64(base + SSO_VHGRP_QCTL); @@ -219,11 +221,10 > @@ ssows_flush_events(struct ssows *ws, uint8_t queue_id) > cq_ds_cnt = ssovf_read64(base + SSO_VHGRP_INT_CNT); > /* Extract cq and ds count */ > cq_ds_cnt &= 0x1FFF1FFF0000; > - ssovf_load_pair(get_work0, get_work1, ws->base + reg_off); > + ssows_get_work(ws, &ev); > + if (fn != NULL && ev.u64 != 0) > + fn(arg, ev); > } > - > - RTE_SET_USED(get_work0); > - RTE_SET_USED(get_work1); > } > > void > -- > 2.16.2