[dpdk-dev] [PATCH 7/8] event: switch sequence number to dynamic field

Jerin Jacob jerinjacobk at gmail.com
Wed Oct 28 08:27:15 CET 2020


On Wed, Oct 28, 2020 at 3:46 AM David Marchand
<david.marchand at 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.marchand at 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
>


More information about the dev mailing list