> -----Original Message-----
> From: Mattias Rönnblom <hof...@lysator.liu.se>
> Sent: Saturday, August 12, 2023 11:23 AM
> To: Pavan Nikhilesh Bhagavatula <pbhagavat...@marvell.com>; Jerin Jacob
> Kollanukkaran <jer...@marvell.com>; Shijith Thotton
> <sthot...@marvell.com>; timothy.mcdan...@intel.com;
> hemant.agra...@nxp.com; sachin.sax...@nxp.com;
> mattias.ronnb...@ericsson.com; lian...@liangbit.com;
> peter.mccar...@intel.com; harry.van.haa...@intel.com;
> erik.g.carri...@intel.com; abhinandan.guj...@intel.com;
> s.v.naga.haris...@intel.com; anatoly.bura...@intel.com
> Cc: dev@dpdk.org
> Subject: Re: [EXT] Re: [RFC 0/3] Introduce event link profiles
> 
> On 2023-08-10 07:17, Pavan Nikhilesh Bhagavatula wrote:
> >> On 2023-08-09 16:26, pbhagavat...@marvell.com wrote:
> >>> From: Pavan Nikhilesh <pbhagavat...@marvell.com>
> >>>
> >>> A collection of event queues linked to an event port can be associated
> >>> with unique identifier called as a profile, multiple such profiles can
> >>> be configured based on the event device capability using the function
> >>> `rte_event_port_link_with_profile` which takes arguments similar to
> >>> `rte_event_port_link` in addition to the profile identifier.
> >>>
> >>
> >> What is the overall goal with this new API? What problems does it intend
> >> to solve, that the old one doesn't.
> >
> > Linking and unlinking currently has huge overhead and when it needs to be
> done
> > in fastpath, we have to wait for unlinks to complete and handle other
> corner cases.
> >
> 
> OK, so this API change is specific to some particular hardware? Is this
> true for some other event devices? That "huge overhead" goes to "simple
> function call" for unlinking+linking, provided the target configuration
> is known in advance.

CNXK supports this feature in HW as an optional feature. 
Drivers can return -ENOSUP or set info::max_profiles_per_port to 1 if the 
feature cannot be implemented or decided to not implement this.
Although, I believe it can be easily integrated into other SW eventdevices.

> 
> What is the overall use case?
> 

One of the primary use case that our customers are interested is to modify the
worker ratio on the fly without the overhead of unlink/relink and also to make
sure low-priority queues are at least scheduled once in a while without worrying
about affinities and weights.

> > This patch set solves it by avoiding linking/unlinking altogether in 
> > fastpath
> by
> > preconfigured set of link profiles out of which only one would be active and
> can
> > be changed in fastpath with a simple function call. There is no link/unlink
> waiting for
> > unlink overhead.
> >
> >>
> >>> The maximum link profiles that are supported by an event device is
> >>> advertised through the structure member
> >>> `rte_event_dev_info::max_profiles_per_port`.
> >>>
> >>> By default, event ports are configured to use the link profile 0 on
> >>> initialization.
> >>>
> >>> Once multiple link profiles are set up and the event device is started, 
> >>> the
> >>> application can use the function `rte_event_port_change_profile` to
> >> change
> >>> the currently active profile on an event port. This effects the next
> >>> `rte_event_dequeue_burst` call, where the event queues associated
> with
> >> the
> >>> newly active link profile will participate in scheduling.
> >>>
> >>> Rudementary work flow would something like:
> >>>
> >>> Config path:
> >>>
> >>>       uint8_t lowQ[4] = {4, 5, 6, 7};
> >>>       uint8_t highQ[4] = {0, 1, 2, 3};
> >>>
> >>>       if (rte_event_dev_info.max_profiles_per_port < 2)
> >>>           return -ENOTSUP;
> >>>
> >>>       rte_event_port_link_with_profile(0, 0, highQ, NULL, 4, 0);
> >>>       rte_event_port_link_with_profile(0, 0, lowQ, NULL, 4, 1);
> >>>
> >>> Worker path:
> >>>
> >>>       empty_high_deq = 0;
> >>>       empty_low_deq = 0;
> >>>       is_low_deq = 0;
> >>>       while (1) {
> >>>           deq = rte_event_dequeue_burst(0, 0, &ev, 1, 0);
> >>>           if (deq == 0) {
> >>>               /**
> >>>                * Change link profile based on work activity on current
> >>>                * active profile
> >>>                */
> >>>               if (is_low_deq) {
> >>>                   empty_low_deq++;
> >>>                   if (empty_low_deq == MAX_LOW_RETRY) {
> >>>                       rte_event_port_change_profile(0, 0, 0);
> >>>                       is_low_deq = 0;
> >>>                       empty_low_deq = 0;
> >>>                   }
> >>>                   continue;
> >>>               }
> >>>
> >>>               if (empty_high_deq == MAX_HIGH_RETRY) {
> >>>                   rte_event_port_change_profile(0, 0, 1);
> >>>                   is_low_deq = 1;
> >>>                   empty_high_deq = 0;
> >>>               }
> >>>               continue;
> >>>           }
> >>>
> >>>           // Process the event received.
> >>>
> >>>           if (is_low_deq++ == MAX_LOW_EVENTS) {
> >>>               rte_event_port_change_profile(0, 0, 0);
> >>>               is_low_deq = 0;
> >>>           }
> >>>       }
> >>>
> >>
> >> This thing looks like the application is asked to do work scheduling.
> >> That doesn't sound right. That's the job of the work scheduler (i.e.,
> >> the event device).
> >>
> >> If this thing is merely a matter of changing what queues are linked to
> >> which ports, wouldn't a new call:
> >> rte_event_port_link_modify()
> >> suffice?
> >
> >
> > Some applications divide their available lcores into multiple types of
> > workers which each work on a unique set of event queues, application
> might
> > need to modify the worker ratio based on various parameters at run time
> > without a lot of overhead.
> >
> > Modifying links wouldn’t work because we might want to restore previous
> links
> > based on the new traffic pattern etc.,.
> >
> >>
> >>> An application could use heuristic data of load/activity of a given event
> >>> port and change its active profile to adapt to the traffic pattern.
> >>>
> >>> An unlink function `rte_event_port_unlink_with_profile` is provided to
> >>> modify the links associated to a profile, and
> >>> `rte_event_port_links_get_with_profile` can be used to retrieve the
> links
> >>> associated with a profile.
> >>>
> >>> Pavan Nikhilesh (3):
> >>>     eventdev: introduce link profiles
> >>>     event/cnxk: implement event link profiles
> >>>     test/event: add event link profile test
> >>>
> >>>    app/test/test_eventdev.c                   | 110 ++++++++++
> >>>    config/rte_config.h                        |   1 +
> >>>    doc/guides/eventdevs/cnxk.rst              |   1 +
> >>>    doc/guides/prog_guide/eventdev.rst         |  58 ++++++
> >>>    drivers/common/cnxk/roc_nix_inl_dev.c      |   4 +-
> >>>    drivers/common/cnxk/roc_sso.c              |  18 +-
> >>>    drivers/common/cnxk/roc_sso.h              |   8 +-
> >>>    drivers/common/cnxk/roc_sso_priv.h         |   4 +-
> >>>    drivers/event/cnxk/cn10k_eventdev.c        |  45 ++--
> >>>    drivers/event/cnxk/cn10k_worker.c          |  11 +
> >>>    drivers/event/cnxk/cn10k_worker.h          |   1 +
> >>>    drivers/event/cnxk/cn9k_eventdev.c         |  72 ++++---
> >>>    drivers/event/cnxk/cn9k_worker.c           |  22 ++
> >>>    drivers/event/cnxk/cn9k_worker.h           |   2 +
> >>>    drivers/event/cnxk/cnxk_eventdev.c         |  34 ++--
> >>>    drivers/event/cnxk/cnxk_eventdev.h         |  10 +-
> >>>    drivers/event/dlb2/dlb2.c                  |   1 +
> >>>    drivers/event/dpaa/dpaa_eventdev.c         |   1 +
> >>>    drivers/event/dpaa2/dpaa2_eventdev.c       |   2 +-
> >>>    drivers/event/dsw/dsw_evdev.c              |   1 +
> >>>    drivers/event/octeontx/ssovf_evdev.c       |   2 +-
> >>>    drivers/event/opdl/opdl_evdev.c            |   1 +
> >>>    drivers/event/skeleton/skeleton_eventdev.c |   1 +
> >>>    drivers/event/sw/sw_evdev.c                |   1 +
> >>>    lib/eventdev/eventdev_pmd.h                |  59 +++++-
> >>>    lib/eventdev/eventdev_private.c            |   9 +
> >>>    lib/eventdev/eventdev_trace.h              |  22 ++
> >>>    lib/eventdev/eventdev_trace_points.c       |   6 +
> >>>    lib/eventdev/rte_eventdev.c                | 146 ++++++++++---
> >>>    lib/eventdev/rte_eventdev.h                | 226 +++++++++++++++++++++
> >>>    lib/eventdev/rte_eventdev_core.h           |   4 +
> >>>    lib/eventdev/rte_eventdev_trace_fp.h       |   8 +
> >>>    lib/eventdev/version.map                   |   5 +
> >>>    33 files changed, 788 insertions(+), 108 deletions(-)
> >>>
> >>> --
> >>> 2.25.1
> >>>

Reply via email to