From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 4988242653; Wed, 27 Sep 2023 17:24:10 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 2071640296; Wed, 27 Sep 2023 17:24:10 +0200 (CEST) Received: from mail-vs1-f42.google.com (mail-vs1-f42.google.com [209.85.217.42]) by mails.dpdk.org (Postfix) with ESMTP id E4D6C40271 for ; Wed, 27 Sep 2023 17:24:08 +0200 (CEST) Received: by mail-vs1-f42.google.com with SMTP id ada2fe7eead31-4525dd7f9d0so4585040137.3 for ; Wed, 27 Sep 2023 08:24:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1695828248; x=1696433048; darn=dpdk.org; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=zp372oPGH3xePEB7Kq2MV36+O+MFnZXvi3D97SW7U2Y=; b=cxemhdyxZ/KV9HEDLZGe7p9AoShKjSGl9VPdgkw+6ea1zmIHkvxrRmd/+5qf/j0yrA MdsXHPfnC8+0uRmWbex+WkhJe3fUB88XerhiF+RBV5VM0LN8hqqVzW8GHcjUvo+x3y4k 1Slhl+X908ujFOrSGO9WrgqLeg8ZQB/irSJ9i0bSw0vef5+qk/7yVvomapLYlvumirFU L644SKPPULd4gZ+ghAmICM6QZ18/u8jvHK+tfyuxDGa1de0p87d593MTGn/0KsjKFHal I99KWcjhWowClB73pSvLxIFsHS0zSugXhq9aEOzJgcqz8HheWOzrUq4NdgcKNPaPWZ1m Q40A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1695828248; x=1696433048; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=zp372oPGH3xePEB7Kq2MV36+O+MFnZXvi3D97SW7U2Y=; b=CL2XuKvOn/1XQC0U5rNdpsOss9ZDrxoSFdt2Ef2T+x2ne7Qjy3XLsSV3C2du2Bxk7B lAR5WLUXoaxAixOfzSFt0hNvjvzavy+wgPq4ve6ET+FImU/Kp5TibWR0VBARfRCgQHvB NcTmI3z1F/ZDWw2DiKImQQSlrRFwhpDVEiJ/UySWFu5btHJGpcybD8/0Pm9QRtJkKB/t xBFoMTIo1ukba79PULBS7onTXS5gN0mhjYNuWrv6JRytJgoOnig13J4bvE6FP8zEX3XT 7p+H7Aag9P2J7DE71qAic8mmjO2uzem+Vv6ckkhzsFuweIzS8UafENro6lJBtk79SslU vPzQ== X-Gm-Message-State: AOJu0YyKVmyE+04SwwAzwN9kVXj9QkwgrGlynxKAP9nqq+033Ori1Mkr BnLqb1hV04jS/XLyi8arDKI0xpCcYZYx2pa2+No= X-Google-Smtp-Source: AGHT+IEqkBzX+RwFkDCW/TMnh8LtDBS+jHtKTd+E7tp51nVudy2NZUwSY89LhjkarJ03Ak5cEBVcIcfBhePlnziDDWg= X-Received: by 2002:a67:f58a:0:b0:44e:b77e:f976 with SMTP id i10-20020a67f58a000000b0044eb77ef976mr1872699vso.20.1695828247955; Wed, 27 Sep 2023 08:24:07 -0700 (PDT) MIME-Version: 1.0 References: <20230831204424.13367-1-pbhagavatula@marvell.com> <20230921102830.2765-1-pbhagavatula@marvell.com> <20230921102830.2765-2-pbhagavatula@marvell.com> In-Reply-To: <20230921102830.2765-2-pbhagavatula@marvell.com> From: Jerin Jacob Date: Wed, 27 Sep 2023 20:53:41 +0530 Message-ID: Subject: Re: [PATCH v3 1/3] eventdev: introduce link profiles To: pbhagavatula@marvell.com Cc: jerinj@marvell.com, sthotton@marvell.com, timothy.mcdaniel@intel.com, hemant.agrawal@nxp.com, sachin.saxena@nxp.com, mattias.ronnblom@ericsson.com, liangma@liangbit.com, peter.mccarthy@intel.com, harry.van.haaren@intel.com, erik.g.carrillo@intel.com, abhinandan.gujjar@intel.com, s.v.naga.harish.k@intel.com, anatoly.burakov@intel.com, dev@dpdk.org Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org On Thu, Sep 21, 2023 at 3:58=E2=80=AFPM wrote: > > From: Pavan Nikhilesh > > A collection of event queues linked to an event port can be > associated with a unique identifier called as a profile, multiple as a "link profile" > such profiles can be created based on the event device capability > using the function `rte_event_port_profile_links_set` which takes > arguments similar to `rte_event_port_link` in addition to the profile > identifier. > > 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_profile_switch` > 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. > > An unlink function `rte_event_port_profile_unlink` is provided > to modify the links associated to a profile, and > `rte_event_port_profile_links_get` can be used to retrieve the > links associated with a profile. > > Using Link profiles can reduce the overhead of linking/unlinking and > waiting for unlinks in progress in fast-path and gives applications > the ability to switch between preset profiles on the fly. > > Signed-off-by: Pavan Nikhilesh > --- > +Linking Queues to Ports with profiles > +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > + > +An application can use link profiles if supported by the underlying even= t device to setup up use "link profiles" > +multiple link profile per port and change them run time depending up on = heuristic data. > +Using Link profiles can reduce the overhead of linking/unlinking and wai= t for unlinks in progress > +in fast-path and gives applications the ability to switch between preset= profiles on the fly. > + > +An Example use case could be as follows. > + > +Config path: > + > +.. code-block:: c > + > + uint8_t lq[4] =3D {4, 5, 6, 7}; > + uint8_t hq[4] =3D {0, 1, 2, 3}; > + > + if (rte_event_dev_info.max_profiles_per_port < 2) > + return -ENOTSUP; > + > + rte_event_port_profile_links_set(0, 0, hq, NULL, 4, 0); > + rte_event_port_profile_links_set(0, 0, lq, NULL, 4, 1); > + > +Worker path: > + > +.. code-block:: c > + > + uint8_t profile_id_to_switch; > + > + while (1) { > + deq =3D rte_event_dequeue_burst(0, 0, &ev, 1, 0); > + if (deq =3D=3D 0) { > + profile_id_to_switch =3D app_findprofile_id_to_switch(); app_find_profile_id_to_switch() > + rte_event_port_profile_switch(0, 0, profile_id_to_switch= ); > + continue; > + } > + > + // Process the event received. > + } > + > Starting the EventDev > ~~~~~~~~~~~~~~~~~~~~~ > > diff --git a/doc/guides/rel_notes/release_23_11.rst b/doc/guides/rel_note= s/release_23_11.rst > index b34ddc0860..e714fc2be5 100644 > --- a/doc/guides/rel_notes/release_23_11.rst > +++ b/doc/guides/rel_notes/release_23_11.rst > @@ -89,6 +89,23 @@ New Features > * Added support for ``remaining_ticks_get`` timer adapter PMD callback > to get the remaining ticks to expire for a given event timer. > > +* **Added eventdev support to link queues to port with profile.** > + > + Introduced event link profiles that can be used to associated links be= tween ``link profiles`` > + event queues and an event port with a unique identifier termed as prof= ile. > + The profile can be used to switch between the associated links in fast= -path > + without the additional overhead of linking/unlinking and waiting for u= nlinking. Added ``rte_event_port_profile_links_set``, ``rte_event_port_profile_unlink= ``, ``rte_event_port_profile_links_get`` and ``rte_event_port_profile_switch``= APIs to enable this feature. In order to reduce the verbose in release notes, below text can be replaced with above text. > + > + * Added ``rte_event_port_profile_links_set`` to link event queues to a= n event > + port with a unique profile identifier. > + > + * Added ``rte_event_port_profile_unlink`` to unlink event queues from = an event > + port associated with a profile. > + > + * Added ``rte_event_port_profile_links_get`` to retrieve links associa= ted to a > + profile. > + > + * Added ``rte_event_port_profile_switch`` to switch between profiles a= s needed. > > diff --git a/drivers/event/dlb2/dlb2.c b/drivers/event/dlb2/dlb2.c > index cf2764364f..e645f7595a 100644 > --- a/drivers/event/dlb2/dlb2.c > +++ b/drivers/event/dlb2/dlb2.c > @@ -79,6 +79,7 @@ static struct rte_event_dev_info evdev_dlb2_default_inf= o =3D { > RTE_EVENT_DEV_CAP_RUNTIME_PORT_LINK | > RTE_EVENT_DEV_CAP_MULTIPLE_QUEUE_PORT | > RTE_EVENT_DEV_CAP_MAINTENANCE_FREE), > + .max_profiles_per_port =3D 1, > }; > > struct process_local_port_data > diff --git a/drivers/event/dpaa/dpaa_eventdev.c b/drivers/event/dpaa/dpaa= _eventdev.c > index 4b3d16735b..f615da3813 100644 > --- a/drivers/event/dpaa/dpaa_eventdev.c > +++ b/drivers/event/dpaa/dpaa_eventdev.c > @@ -359,6 +359,7 @@ dpaa_event_dev_info_get(struct rte_eventdev *dev, > RTE_EVENT_DEV_CAP_NONSEQ_MODE | > RTE_EVENT_DEV_CAP_CARRY_FLOW_ID | > RTE_EVENT_DEV_CAP_MAINTENANCE_FREE; > + dev_info->max_profiles_per_port =3D 1; > } > > static int > diff --git a/drivers/event/dpaa2/dpaa2_eventdev.c b/drivers/event/dpaa2/d= paa2_eventdev.c > index fa1a1ade80..ffc5550f85 100644 > --- a/drivers/event/dpaa2/dpaa2_eventdev.c > +++ b/drivers/event/dpaa2/dpaa2_eventdev.c > @@ -411,7 +411,7 @@ dpaa2_eventdev_info_get(struct rte_eventdev *dev, > RTE_EVENT_DEV_CAP_QUEUE_ALL_TYPES | > RTE_EVENT_DEV_CAP_CARRY_FLOW_ID | > RTE_EVENT_DEV_CAP_MAINTENANCE_FREE; > - > + dev_info->max_profiles_per_port =3D 1; > } > > static int > diff --git a/drivers/event/dsw/dsw_evdev.c b/drivers/event/dsw/dsw_evdev.= c > index 6c5cde2468..785c12f61f 100644 > --- a/drivers/event/dsw/dsw_evdev.c > +++ b/drivers/event/dsw/dsw_evdev.c > @@ -218,6 +218,7 @@ dsw_info_get(struct rte_eventdev *dev __rte_unused, > .max_event_port_dequeue_depth =3D DSW_MAX_PORT_DEQUEUE_DE= PTH, > .max_event_port_enqueue_depth =3D DSW_MAX_PORT_ENQUEUE_DE= PTH, > .max_num_events =3D DSW_MAX_EVENTS, > + .max_profiles_per_port =3D 1, > .event_dev_cap =3D RTE_EVENT_DEV_CAP_BURST_MODE| > RTE_EVENT_DEV_CAP_DISTRIBUTED_SCHED| > RTE_EVENT_DEV_CAP_NONSEQ_MODE| > diff --git a/drivers/event/octeontx/ssovf_evdev.c b/drivers/event/octeont= x/ssovf_evdev.c > index 650266b996..0eb9358981 100644 > --- a/drivers/event/octeontx/ssovf_evdev.c > +++ b/drivers/event/octeontx/ssovf_evdev.c > @@ -158,7 +158,7 @@ ssovf_info_get(struct rte_eventdev *dev, struct rte_e= vent_dev_info *dev_info) > RTE_EVENT_DEV_CAP_NONSEQ_MODE | > RTE_EVENT_DEV_CAP_CARRY_FLOW_ID | > RTE_EVENT_DEV_CAP_MAINTENANCE_FRE= E; > - > + dev_info->max_profiles_per_port =3D 1; > } > > static int > diff --git a/drivers/event/opdl/opdl_evdev.c b/drivers/event/opdl/opdl_ev= dev.c > index 9ce8b39b60..dd25749654 100644 > --- a/drivers/event/opdl/opdl_evdev.c > +++ b/drivers/event/opdl/opdl_evdev.c > @@ -378,6 +378,7 @@ opdl_info_get(struct rte_eventdev *dev, struct rte_ev= ent_dev_info *info) > .event_dev_cap =3D RTE_EVENT_DEV_CAP_BURST_MODE | > RTE_EVENT_DEV_CAP_CARRY_FLOW_ID | > RTE_EVENT_DEV_CAP_MAINTENANCE_FREE, > + .max_profiles_per_port =3D 1, > }; > > *info =3D evdev_opdl_info; > diff --git a/drivers/event/skeleton/skeleton_eventdev.c b/drivers/event/s= keleton/skeleton_eventdev.c > index 8513b9a013..dc9b131641 100644 > --- a/drivers/event/skeleton/skeleton_eventdev.c > +++ b/drivers/event/skeleton/skeleton_eventdev.c > @@ -104,6 +104,7 @@ skeleton_eventdev_info_get(struct rte_eventdev *dev, > RTE_EVENT_DEV_CAP_EVENT_QOS | > RTE_EVENT_DEV_CAP_CARRY_FLOW_ID | > RTE_EVENT_DEV_CAP_MAINTENANCE_FRE= E; > + dev_info->max_profiles_per_port =3D 1; > } > > static int > diff --git a/drivers/event/sw/sw_evdev.c b/drivers/event/sw/sw_evdev.c > index cfd659d774..6d1816b76d 100644 > --- a/drivers/event/sw/sw_evdev.c > +++ b/drivers/event/sw/sw_evdev.c > @@ -609,6 +609,7 @@ sw_info_get(struct rte_eventdev *dev, struct rte_even= t_dev_info *info) > RTE_EVENT_DEV_CAP_NONSEQ_MODE | > RTE_EVENT_DEV_CAP_CARRY_FLOW_ID | > RTE_EVENT_DEV_CAP_MAINTENANCE_FREE), > + .max_profiles_per_port =3D 1, > }; > In order to optimze for common case i.e chnages in all PMD, Please move this logic to common code i.e [for-main]dell[dpdk-next-eventdev] $ git diff diff --git a/lib/eventdev/rte_eventdev.c b/lib/eventdev/rte_eventdev.c index 30df0572d2..39018f23b6 100644 --- a/lib/eventdev/rte_eventdev.c +++ b/lib/eventdev/rte_eventdev.c @@ -95,6 +95,7 @@ rte_event_dev_info_get(uint8_t dev_id, struct rte_event_dev_info *dev_info) return -EINVAL; memset(dev_info, 0, sizeof(struct rte_event_dev_info)); + dev_info->max_profiles_per_port =3D 1; if (*dev->dev_ops->dev_infos_get =3D=3D NULL) return -ENOTSUP; [for-main]dell[dpdk-next-eventdev] $ > +/** > + * Link multiple source event queues associated with a profile to a dest= ination > + * event port. > + * > + * @param dev > + * Event device pointer > + * @param port > + * Event port pointer > + * @param queues > + * Points to an array of *nb_links* event queues to be linked > + * to the event port. > + * @param priorities > + * Points to an array of *nb_links* service priorities associated with= each > + * event queue link to event port. > + * @param nb_links > + * The number of links to establish. > + * @param profile profile_id > + * The profile ID to associate the links. > + * > + * @return > + * Returns 0 on success. > + */ > +typedef int (*eventdev_port_link_profile_t)(struct rte_eventdev *dev, vo= id *port, > + const uint8_t queues[], const= uint8_t priorities[], > + uint16_t nb_links, uint8_t pr= ofile); profile_id > + > /** > * Unlink multiple source event queues from destination event port. > * > @@ -455,6 +484,28 @@ typedef int (*eventdev_port_link_t)(struct rte_event= dev *dev, void *port, > typedef int (*eventdev_port_unlink_t)(struct rte_eventdev *dev, void *po= rt, > uint8_t queues[], uint16_t nb_unlinks); > > +/** > + * Unlink multiple source event queues associated with a profile from de= stination > + * event port. > + * > + * @param dev > + * Event device pointer > + * @param port > + * Event port pointer > + * @param queues > + * An array of *nb_unlinks* event queues to be unlinked from the event= port. > + * @param nb_unlinks > + * The number of unlinks to establish > + * @param profile profile_id > + * The profile ID of the associated links. > + * > + * @return > + * Returns 0 on success. > + */ > +typedef int (*eventdev_port_unlink_profile_t)(struct rte_eventdev *dev, = void *port, > + uint8_t queues[], uint16_t = nb_unlinks, > + uint8_t profile); profile_id > RTE_TRACE_POINT( > rte_eventdev_trace_port_unlinks_in_progress, > RTE_TRACE_POINT_ARGS(uint8_t dev_id, uint8_t port_id), > diff --git a/lib/eventdev/eventdev_trace_points.c b/lib/eventdev/eventdev= _trace_points.c > index 76144cfe75..8024e07531 100644 > --- a/lib/eventdev/eventdev_trace_points.c > +++ b/lib/eventdev/eventdev_trace_points.c > @@ -19,9 +19,15 @@ RTE_TRACE_POINT_REGISTER(rte_eventdev_trace_port_setup= , > RTE_TRACE_POINT_REGISTER(rte_eventdev_trace_port_link, > lib.eventdev.port.link) > > +RTE_TRACE_POINT_REGISTER(rte_eventdev_trace_port_profile_links_set, > + lib.eventdev.port.profile.links.set) > + > RTE_TRACE_POINT_REGISTER(rte_eventdev_trace_port_unlink, > lib.eventdev.port.unlink) > > +RTE_TRACE_POINT_REGISTER(rte_eventdev_trace_port_profile_unlink, > + lib.eventdev.port.profile.unlink) > + > RTE_TRACE_POINT_REGISTER(rte_eventdev_trace_start, > lib.eventdev.start) > > @@ -40,6 +46,9 @@ RTE_TRACE_POINT_REGISTER(rte_eventdev_trace_deq_burst, > RTE_TRACE_POINT_REGISTER(rte_eventdev_trace_maintain, > lib.eventdev.maintain) > > +RTE_TRACE_POINT_REGISTER(rte_eventdev_trace_port_profile_switch, > + lib.eventdev.port.profile.switch) > + > /* Eventdev Rx adapter trace points */ > diff --git a/lib/eventdev/rte_eventdev.c b/lib/eventdev/rte_eventdev.c > index 6ab4524332..30df0572d2 100644 > --- a/lib/eventdev/rte_eventdev.c > +++ b/lib/eventdev/rte_eventdev.c > +int > +rte_event_port_profile_unlink(uint8_t dev_id, uint8_t port_id, uint8_t q= ueues[], > + uint16_t nb_unlinks, uint8_t profile) prfofile->profile_id > +int > +rte_event_port_profile_links_get(uint8_t dev_id, uint8_t port_id, uint8_= t queues[], > + uint8_t priorities[], uint8_t profile) profile_id > diff --git a/lib/eventdev/rte_eventdev.h b/lib/eventdev/rte_eventdev.h > index 2ba8a7b090..f6ce45d160 100644 > --- a/lib/eventdev/rte_eventdev.h > +++ b/lib/eventdev/rte_eventdev.h > @@ -320,6 +320,12 @@ struct rte_event; > * rte_event_queue_setup(). > */ > > +#define RTE_EVENT_DEV_CAP_PROFILE_LINK (1ULL << 12) Need to change as /**< in comment to show up in doxygen > +/** Event device is capable of supporting multiple link profiles per eve= nt port > + * i.e., the value of `rte_event_dev_info::max_profiles_per_port` is gre= ater > + * than one. > + */ > + > +/** > + * Link multiple source event queues supplied in *queues* to the destina= tion > + * event port designated by its *port_id* with associated profile identi= fier > + * supplied in *profile* with service priorities supplied in *priorities= * on profile_id > + * the event device designated by its *dev_id*. > + * > + * If *profile* is set to 0 then, the links created by the call `rte_eve= nt_port_link` profile_id > + * will be overwritten. > + * > + * Event ports by default use profile 0 unless it is changed using the > + * call ``rte_event_port_profile_switch()``. > + * > + * The link establishment shall enable the event port *port_id* from > + * receiving events from the specified event queue(s) supplied in *queue= s* > + * > + * An event queue may link to one or more event ports. > + * The number of links can be established from an event queue to event p= ort is > + * implementation defined. > + * > + * Event queue(s) to event port link establishment can be changed at run= time > + * without re-configuring the device to support scaling and to reduce th= e > + * latency of critical work by establishing the link with more event por= ts > + * at runtime. > + * > + * @param dev_id > + * The identifier of the device. > + * > + * @param port_id > + * Event port identifier to select the destination port to link. > + * > + * @param queues > + * Points to an array of *nb_links* event queues to be linked > + * to the event port. > + * NULL value is allowed, in which case this function links all the co= nfigured > + * event queues *nb_event_queues* which previously supplied to > + * rte_event_dev_configure() to the event port *port_id* > + * > + * @param priorities > + * Points to an array of *nb_links* service priorities associated with= each > + * event queue link to event port. > + * The priority defines the event port's servicing priority for > + * event queue, which may be ignored by an implementation. > + * The requested priority should in the range of > + * [RTE_EVENT_DEV_PRIORITY_HIGHEST, RTE_EVENT_DEV_PRIORITY_LOWEST]. > + * The implementation shall normalize the requested priority to > + * implementation supported priority value. > + * NULL value is allowed, in which case this function links the event = queues > + * with RTE_EVENT_DEV_PRIORITY_NORMAL servicing priority > + * > + * @param nb_links > + * The number of links to establish. This parameter is ignored if queu= es is > + * NULL. > + * > + * @param profile profile_id > + * The profile identifier associated with the links between event queu= es and > + * event port. Should be less than the max capability reported by > + * ``rte_event_dev_info::max_profiles_per_port`` > + * > + * @return > + * The number of links actually established. The return value can be les= s than > + * the value of the *nb_links* parameter when the implementation has the > + * limitation on specific queue to port link establishment or if invalid > + * parameters are specified in *queues* > + * If the return value is less than *nb_links*, the remaining links at t= he end > + * of link[] are not established, and the caller has to take care of the= m. > + * If return value is less than *nb_links* then implementation shall upd= ate the > + * rte_errno accordingly, Possible rte_errno values are > + * (EDQUOT) Quota exceeded(Application tried to link the queue configure= d with > + * RTE_EVENT_QUEUE_CFG_SINGLE_LINK to more than one event ports) > + * (EINVAL) Invalid parameter > + * > + */ > +__rte_experimental > +int > +rte_event_port_profile_links_set(uint8_t dev_id, uint8_t port_id, const = uint8_t queues[], > + const uint8_t priorities[], uint16_t nb_= links, uint8_t profile); profile_id > + > +/** > + * Unlink multiple source event queues supplied in *queues* that belong = to profile > + * designated by *profile* from the destination event port designated by= its > + * *port_id* on the event device designated by its *dev_id*. > + * > + * If *profile* is set to 0 i.e., the default profile then, then this fu= nction will profile_id > + * act as ``rte_event_port_unlink``. > + * > + * The unlink call issues an async request to disable the event port *po= rt_id* > + * from receiving events from the specified event queue *queue_id*. > + * Event queue(s) to event port unlink establishment can be changed at r= untime > + * without re-configuring the device. > + * > + * @see rte_event_port_unlinks_in_progress() to poll for completed unlin= ks. > + * > + * @param dev_id > + * The identifier of the device. > + * > + * @param port_id > + * Event port identifier to select the destination port to unlink. > + * > + * @param queues > + * Points to an array of *nb_unlinks* event queues to be unlinked > + * from the event port. > + * NULL value is allowed, in which case this function unlinks all the > + * event queue(s) from the event port *port_id*. > + * > + * @param nb_unlinks > + * The number of unlinks to establish. This parameter is ignored if qu= eues is > + * NULL. > + * > + * @param profile profile_id > + * The profile identifier associated with the links between event queu= es and > + * event port. Should be less than the max capability reported by > + * ``rte_event_dev_info::max_profiles_per_port`` > + * > + * @return > + * The number of unlinks successfully requested. The return value can be= less > + * than the value of the *nb_unlinks* parameter when the implementation = has the > + * limitation on specific queue to port unlink establishment or > + * if invalid parameters are specified. > + * If the return value is less than *nb_unlinks*, the remaining queues a= t the > + * end of queues[] are not unlinked, and the caller has to take care of = them. > + * If return value is less than *nb_unlinks* then implementation shall u= pdate > + * the rte_errno accordingly, Possible rte_errno values are > + * (EINVAL) Invalid parameter > + * > + */ > +__rte_experimental > +int > +rte_event_port_profile_unlink(uint8_t dev_id, uint8_t port_id, uint8_t q= ueues[], > + uint16_t nb_unlinks, uint8_t profile); > + profile_id > +/** > + * Retrieve the list of source event queues and its service priority > + * associated to a profile and linked to the destination event port > + * designated by its *port_id* on the event device designated by its *de= v_id*. > + * > + * @param dev_id > + * The identifier of the device. > + * > + * @param port_id > + * Event port identifier. > + * > + * @param[out] queues > + * Points to an array of *queues* for output. > + * The caller has to allocate *RTE_EVENT_MAX_QUEUES_PER_DEV* bytes to > + * store the event queue(s) linked with event port *port_id* > + * > + * @param[out] priorities > + * Points to an array of *priorities* for output. > + * The caller has to allocate *RTE_EVENT_MAX_QUEUES_PER_DEV* bytes to > + * store the service priority associated with each event queue linked > + * > + * @param profile profile_id > + * The profile identifier associated with the links between event queu= es and > + * event port. Should be less than the max capability reported by > + * ``rte_event_dev_info::max_profiles_per_port`` > + * > + * @return > + * The number of links established on the event port designated by its > + * *port_id*. > + * - <0 on failure. > + */ > +__rte_experimental > +int > +rte_event_port_profile_links_get(uint8_t dev_id, uint8_t port_id, uint8_= t queues[], > + uint8_t priorities[], uint8_t profile); > + > /** > * Retrieve the service ID of the event dev. If the adapter doesn't use > * a rte_service function, this function returns -ESRCH. > @@ -2265,6 +2449,53 @@ rte_event_maintain(uint8_t dev_id, uint8_t port_id= , int op) > return 0; > } > > +/** > + * Change the active profile on an event port. > + * > + * This function is used to change the current active profile on an even= t port > + * when multiple link profiles are configured on an event port through t= he > + * function call ``rte_event_port_profile_links_set``. > + * > + * On the subsequent ``rte_event_dequeue_burst`` call, only the event qu= eues > + * that were associated with the newly active profile will participate i= n > + * scheduling. > + * > + * @param dev_id > + * The identifier of the device. > + * @param port_id > + * The identifier of the event port. > + * @param profile profile_id > + * The identifier of the profile. > + * @return > + * - 0 on success. > + * - -EINVAL if *dev_id*, *port_id*, or *profile* is invalid. > + */ > +__rte_experimental > +static inline uint8_t > +rte_event_port_profile_switch(uint8_t dev_id, uint8_t port_id, uint8_t p= rofile) profile_id > +{ > + const struct rte_event_fp_ops *fp_ops; > + void *port; > + > + fp_ops =3D &rte_event_fp_ops[dev_id]; > + port =3D fp_ops->data[port_id]; > + > +#ifdef RTE_LIBRTE_EVENTDEV_DEBUG > + if (dev_id >=3D RTE_EVENT_MAX_DEVS || > + port_id >=3D RTE_EVENT_MAX_PORTS_PER_DEV) > + return -EINVAL; > + > + if (port =3D=3D NULL) > + return -EINVAL; > + > + if (profile >=3D RTE_EVENT_MAX_PROFILES_PER_PORT) > + return -EINVAL; > +#endif > + rte_eventdev_trace_port_profile_switch(dev_id, port_id, profile); > + > + return fp_ops->profile_switch(port, profile); > +} > + > #ifdef __cplusplus > } > #endif > diff --git a/lib/eventdev/rte_eventdev_core.h b/lib/eventdev/rte_eventdev= _core.h > index c27a52ccc0..5af646ed5c 100644 > --- a/lib/eventdev/rte_eventdev_core.h > +++ b/lib/eventdev/rte_eventdev_core.h > @@ -42,6 +42,8 @@ typedef uint16_t (*event_crypto_adapter_enqueue_t)(void= *port, > uint16_t nb_events); > /**< @internal Enqueue burst of events on crypto adapter */ > > +typedef int (*event_profile_switch_t)(void *port, uint8_t profile); > + > struct rte_event_fp_ops { > void **data; > /**< points to array of internal port data pointers */ > @@ -65,7 +67,9 @@ struct rte_event_fp_ops { > /**< PMD Tx adapter enqueue same destination function. */ > event_crypto_adapter_enqueue_t ca_enqueue; > /**< PMD Crypto adapter enqueue function. */ > - uintptr_t reserved[5]; > + event_profile_switch_t profile_switch; > + /**< PMD Event switch profile function. */ > + uintptr_t reserved[4]; > } __rte_cache_aligned; > > extern struct rte_event_fp_ops rte_event_fp_ops[RTE_EVENT_MAX_DEVS]; > diff --git a/lib/eventdev/rte_eventdev_trace_fp.h b/lib/eventdev/rte_even= tdev_trace_fp.h > index af2172d2a5..04d510ad00 100644 > --- a/lib/eventdev/rte_eventdev_trace_fp.h > +++ b/lib/eventdev/rte_eventdev_trace_fp.h > @@ -46,6 +46,14 @@ RTE_TRACE_POINT_FP( > rte_trace_point_emit_int(op); > ) > > +RTE_TRACE_POINT_FP( > + rte_eventdev_trace_port_profile_switch, > + RTE_TRACE_POINT_ARGS(uint8_t dev_id, uint8_t port_id, uint8_t pro= file), > + rte_trace_point_emit_u8(dev_id); > + rte_trace_point_emit_u8(port_id); > + rte_trace_point_emit_u8(profile); > +) > + > RTE_TRACE_POINT_FP( > rte_eventdev_trace_eth_tx_adapter_enqueue, > RTE_TRACE_POINT_ARGS(uint8_t dev_id, uint8_t port_id, void *ev_ta= ble, > diff --git a/lib/eventdev/version.map b/lib/eventdev/version.map > index 7ce09a87bb..f88decee39 100644 > --- a/lib/eventdev/version.map > +++ b/lib/eventdev/version.map > @@ -134,6 +134,10 @@ EXPERIMENTAL { > > # added in 23.11 > rte_event_eth_rx_adapter_create_ext_with_params; > + rte_event_port_profile_links_set; > + rte_event_port_profile_unlink; > + rte_event_port_profile_links_get; > + __rte_eventdev_trace_port_profile_switch; > }; With above changes, Acked-by: Jerin Jacob > > INTERNAL { > -- > 2.25.1 >