On Wed, Oct 28, 2020 at 3:46 AM David Marchand <david.march...@redhat.com> wrote: > > The eventdev drivers have been hacking the deprecated field seqn for > internal test usage. > It is moved to a dynamic mbuf field in order to allow removal of seqn. > > Signed-off-by: David Marchand <david.march...@redhat.com>
Overall looks good some minor comments: # use eventdev: instead of event: in git commit > --- > app/test-eventdev/evt_main.c | 3 ++ > app/test-eventdev/test_order_common.c | 2 +- > app/test-eventdev/test_order_common.h | 5 ++- > drivers/event/octeontx/ssovf_evdev_selftest.c | 32 ++++++++-------- > drivers/event/octeontx2/otx2_evdev_selftest.c | 31 +++++++-------- > drivers/event/opdl/opdl_test.c | 8 ++-- > drivers/event/sw/sw_evdev_selftest.c | 34 +++++++++-------- > lib/librte_eventdev/rte_eventdev.c | 21 +++++++++- > lib/librte_eventdev/rte_eventdev.h | 38 ++++++++++++++++--- > lib/librte_eventdev/version.map | 2 + > 10 files changed, 116 insertions(+), 60 deletions(-) > > diff --git a/app/test-eventdev/evt_main.c b/app/test-eventdev/evt_main.c > index a8d304bab3..832bb21d7c 100644 > --- a/app/test-eventdev/evt_main.c > +++ b/app/test-eventdev/evt_main.c > @@ -89,6 +89,9 @@ main(int argc, char **argv) > if (!evdevs) > rte_panic("no eventdev devices found\n"); > > + if (rte_event_test_seqn_dynfield_register() < 0) > + rte_panic("failed to register event dev sequence number\n"); > + > /* Populate the default values of the options */ > evt_options_default(&opt); > > diff --git a/app/test-eventdev/test_order_common.c > b/app/test-eventdev/test_order_common.c > index c5f7317440..d15ff80273 100644 > --- a/app/test-eventdev/test_order_common.c > +++ b/app/test-eventdev/test_order_common.c > @@ -50,7 +50,7 @@ order_producer(void *arg) > > const flow_id_t flow = (uintptr_t)m % nb_flows; > /* Maintain seq number per flow */ > - m->seqn = producer_flow_seq[flow]++; > + *rte_event_test_seqn(m) = producer_flow_seq[flow]++; > flow_id_save(flow, m, &ev); > > while (rte_event_enqueue_burst(dev_id, port, &ev, 1) != 1) { > diff --git a/app/test-eventdev/test_order_common.h > b/app/test-eventdev/test_order_common.h > index 9e3415e421..d4ad31da46 100644 > --- a/app/test-eventdev/test_order_common.h > +++ b/app/test-eventdev/test_order_common.h > @@ -89,9 +89,10 @@ order_process_stage_1(struct test_order *const t, > { > const uint32_t flow = (uintptr_t)ev->mbuf % nb_flows; > /* compare the seqn against expected value */ > - if (ev->mbuf->seqn != expected_flow_seq[flow]) { > + if (*rte_event_test_seqn(ev->mbuf) != expected_flow_seq[flow]) { > evt_err("flow=%x seqn mismatch got=%x expected=%x", > - flow, ev->mbuf->seqn, expected_flow_seq[flow]); > + flow, *rte_event_test_seqn(ev->mbuf), > + expected_flow_seq[flow]); > t->err = true; > rte_smp_wmb(); > } # Since rte_event_test_seqn_dynfield_register() is the public API, I would like to limit the scope only to self test so that rte_event_test_seqn_dynfield_register() need not be exposed. Could you have a separate application-specific dynamic field here? # Also this patch used in fastpath, better to have offset stored in fastpath cache line. see http://mails.dpdk.org/archives/dev/2020-October/189588.html > +#define RTE_EVENT_TEST_SEQN_DYNFIELD_NAME "rte_event_test_seqn_dynfield" > +int rte_event_test_seqn_dynfield_offset = -1; > + > +int > +rte_event_test_seqn_dynfield_register(void) > +{ > + static const struct rte_mbuf_dynfield event_test_seqn_dynfield_desc = > { > + .name = RTE_EVENT_TEST_SEQN_DYNFIELD_NAME, > + .size = sizeof(rte_event_test_seqn_t), > + .align = __alignof__(rte_event_test_seqn_t), > + }; > + rte_event_test_seqn_dynfield_offset = > + rte_mbuf_dynfield_register(&event_test_seqn_dynfield_desc); > + return rte_event_test_seqn_dynfield_offset; > +} > + > int > rte_event_eth_rx_adapter_caps_get(uint8_t dev_id, uint16_t eth_port_id, > uint32_t *caps) > @@ -1247,8 +1263,11 @@ int rte_event_dev_selftest(uint8_t dev_id) > RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL); > struct rte_eventdev *dev = &rte_eventdevs[dev_id]; > > - if (dev->dev_ops->dev_selftest != NULL) > + if (dev->dev_ops->dev_selftest != NULL) { > + if (rte_event_test_seqn_dynfield_register() < 0) > + return -ENOMEM; > return (*dev->dev_ops->dev_selftest)(); > + } > return -ENOTSUP; > } > > diff --git a/lib/librte_eventdev/rte_eventdev.h > b/lib/librte_eventdev/rte_eventdev.h > index ce1fc2ce0f..1656ff8dce 100644 > --- a/lib/librte_eventdev/rte_eventdev.h > +++ b/lib/librte_eventdev/rte_eventdev.h > @@ -211,13 +211,15 @@ extern "C" { > #endif > > #include <rte_common.h> > +#include <rte_compat.h> > #include <rte_config.h> > +#include <rte_mbuf.h> > +#include <rte_mbuf_dyn.h> > #include <rte_memory.h> > #include <rte_errno.h> > > #include "rte_eventdev_trace_fp.h" > > -struct rte_mbuf; /* we just use mbuf pointers; no need to include rte_mbuf.h > */ > struct rte_event; > > /* Event device capability bitmap flags */ > @@ -570,9 +572,9 @@ struct rte_event_queue_conf { > */ > uint32_t nb_atomic_order_sequences; > /**< The maximum number of outstanding events waiting to be > - * reordered by this queue. In other words, the number of entries in > - * this queue’s reorder buffer.When the number of events in the > - * reorder buffer reaches to *nb_atomic_order_sequences* then the > + * event_tested by this queue. In other words, the number of entries > in > + * this queue’s event_test buffer.When the number of events in the > + * event_test buffer reaches to *nb_atomic_order_sequences* then the > * scheduler cannot schedule the events from this queue and invalid > * event will be returned from dequeue until one or more entries are > * freed up/released. > @@ -935,7 +937,7 @@ rte_event_dev_close(uint8_t dev_id); > * Event ordering is based on the received event(s), but also other > * (newly allocated or stored) events are ordered when enqueued within the > same > * ordered context. Events not enqueued (e.g. released or stored) within the > - * context are considered missing from reordering and are skipped at this > time > + * context are considered missing from event_testing and are skipped at > this time > * (but can be ordered again within another context). > * > * @see rte_event_queue_setup(), rte_event_dequeue_burst(), > RTE_EVENT_OP_RELEASE > @@ -1021,7 +1023,7 @@ rte_event_dev_close(uint8_t dev_id); > * then this function hints the scheduler that the user has done all that > need > * to maintain event order in the current ordered context. > * The scheduler is allowed to release the ordered context of this port and > - * avoid reordering any following enqueues. > + * avoid event_testing any following enqueues. > * > * Early ordered context release may increase parallelism and thus system > * performance. > @@ -1111,6 +1113,30 @@ struct rte_event { > }; > }; > > +typedef uint32_t rte_event_test_seqn_t; > +extern int rte_event_test_seqn_dynfield_offset; > + > +/** > + * @warning > + * @b EXPERIMENTAL: this API may change without prior notice > + * > + * Read test sequence number from mbuf. > + * > + * @param mbuf Structure to read from. > + * @return pointer to test sequence number. > + */ > +__rte_experimental > +static inline rte_event_test_seqn_t * > +rte_event_test_seqn(const struct rte_mbuf *mbuf) > +{ > + return RTE_MBUF_DYNFIELD(mbuf, rte_event_test_seqn_dynfield_offset, > + rte_event_test_seqn_t *); > +} > + > +__rte_experimental > +int > +rte_event_test_seqn_dynfield_register(void); > + > /* Ethdev Rx adapter capability bitmap flags */ > #define RTE_EVENT_ETH_RX_ADAPTER_CAP_INTERNAL_PORT 0x1 > /**< This flag is sent when the packet transfer mechanism is in HW. > diff --git a/lib/librte_eventdev/version.map b/lib/librte_eventdev/version.map > index 8ae8420f9b..e49382ba99 100644 > --- a/lib/librte_eventdev/version.map > +++ b/lib/librte_eventdev/version.map > @@ -138,4 +138,6 @@ EXPERIMENTAL { > __rte_eventdev_trace_port_setup; > # added in 20.11 > rte_event_pmd_pci_probe_named; > + rte_event_test_seqn_dynfield_offset; > + rte_event_test_seqn_dynfield_register; Could you change symbol name to rte_event_dev_selftest_seqn_dynfield_offset() to limit the scope only to self test. also, it is not required to expose rte_event_test_seqn_dynfield_register() in that case. > }; > -- > 2.23.0 >