From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id CBE9AA04B7; Sun, 4 Oct 2020 13:10:44 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 272E11BC29; Sun, 4 Oct 2020 13:10:43 +0200 (CEST) Received: from hqnvemgate26.nvidia.com (hqnvemgate26.nvidia.com [216.228.121.65]) by dpdk.org (Postfix) with ESMTP id A0EC91BC0C for ; Sun, 4 Oct 2020 13:10:39 +0200 (CEST) Received: from hqmail.nvidia.com (Not Verified[216.228.121.13]) by hqnvemgate26.nvidia.com (using TLS: TLSv1.2, AES256-SHA) id ; Sun, 04 Oct 2020 04:10:26 -0700 Received: from HQMAIL109.nvidia.com (172.20.187.15) by HQMAIL111.nvidia.com (172.20.187.18) with Microsoft SMTP Server (TLS) id 15.0.1473.3; Sun, 4 Oct 2020 11:10:25 +0000 Received: from NAM10-MW2-obe.outbound.protection.outlook.com (104.47.55.108) by HQMAIL109.nvidia.com (172.20.187.15) with Microsoft SMTP Server (TLS) id 15.0.1473.3 via Frontend Transport; Sun, 4 Oct 2020 11:10:25 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=AO3Y+GuSoNnuk9+mZ1WcPChCJwFhkS3MlSTtWHG0lFlfSx3PebRhzUAHA8+68VJutG/TM6GSVtvieY2PJmviiyrG4KWr8dVLXmNYF8BBSKI8bO5TNcLM9yRwlXZ225WmJYVNbYtDb8wOPdj7Gfwr64qjp5ecQy8/iwG7UY+OZ4bhKAHdI+OsUoI5IN3QGUOrEYnCBsvPn71EjuYsMJjo/RPwhXzCrnWhY5N+lhNBMEzpAkiMQhmru2oluqSfWMlwUIzQkVkckBTpoS5XnQDbFV/bYMWXypCtK49ji1wQLzQyWi59jqz60YYzNfJ8IRM+bGHw0I1B9kGHFBO2C1KFXA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=TcIbT2Yn3oQgzQvoxq9eEUXqexeIzpMHO5Y7yPy7cMM=; b=Df930u6aC0vNl/2PV0MxJMq0CO9U5VD/zbAJtEhUtHZ9j4orrCK9fNBVxUN/vbRcsY4ym6ZbKl1U4oOTm52Kt2bZw7GUxVWQVnl1T16fCLWuqhO5lYJG4s50wnY3GYzXxJJXzd6R33zFTbQ3ZNSoVzK/b103UbnYWp6eEkNasDCh+qGR3K6lNq9F325p6GD/+Ywr2M2WNJ0XyD3do1GFpZ5q5CXyZhNNZRBzBxc5L3eZ1kZaXwUN0gwcjs/CQqYSz+pjZ1OSvaF9fqssVJoGEJWvDZg6ey/+85DYonaBy2l31IWoMeoAiF3/NvKwvCce+huFCg1Z+tUh5cYNfqgsPw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none Received: from MN2PR12MB4286.namprd12.prod.outlook.com (2603:10b6:208:199::22) by BL0PR12MB2434.namprd12.prod.outlook.com (2603:10b6:207:4d::28) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3433.32; Sun, 4 Oct 2020 11:10:02 +0000 Received: from MN2PR12MB4286.namprd12.prod.outlook.com ([fe80::61fd:a36e:cf4f:2d3f]) by MN2PR12MB4286.namprd12.prod.outlook.com ([fe80::61fd:a36e:cf4f:2d3f%8]) with mapi id 15.20.3433.042; Sun, 4 Oct 2020 11:10:02 +0000 From: Ori Kam To: Andrey Vesnovaty , "dev@dpdk.org" CC: "jer@marvell.com" , "jerinjacobk@gmail.com" , NBU-Contact-Thomas Monjalon , "ferruh.yigit@intel.com" , "stephen@networkplumber.org" , "bruce.richardson@intel.com" , Slava Ovsiienko , "andrey.vesnovaty@gmail.com" , "mdr@ashroe.eu" , "nhorman@tuxdriver.com" , "ajit.khaparde@broadcom.com" , "samik.gupta@broadcom.com" , Andrey Vesnovaty , "Andrew Rybchenko" , Ori Kam Thread-Topic: [PATCH v3 01/10] ethdev: add flow shared action API Thread-Index: AQHWmdGMn8R9VUT4REqKH78UAzfUkqmHOPGQ Date: Sun, 4 Oct 2020 11:10:02 +0000 Message-ID: References: <20201003220619.19231-1-andreyv@nvidia.com> <20201003220619.19231-2-andreyv@nvidia.com> In-Reply-To: <20201003220619.19231-2-andreyv@nvidia.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: nvidia.com; dkim=none (message not signed) header.d=none;nvidia.com; dmarc=none action=none header.from=nvidia.com; x-originating-ip: [147.236.152.129] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 0818b7dc-954a-468f-acae-08d868560a7b x-ms-traffictypediagnostic: BL0PR12MB2434: x-ld-processed: 43083d15-7273-40c1-b7db-39efd9ccc17a,ExtAddr x-ms-exchange-transport-forked: True x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:4125; x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: XSR8hdOvL+BK+N74QJVWfY6qcDD9HmLL/2gyc2AIkPVqu6QTQsAEqbVphK+qIYOMVFWCh56BXuYpSwVYcgfGRnwABecJ8gKyQA8d8raCQbR9BMZZHaOx+q4pTc8Frq5AMxMUJcUt3Yd40kSB1nC+/LSp5F2On0vjF6lu/g63MLb5C5b6lDkORXLjRXxYZ8CdrUjpPxM1SrQVqMdTAa6YGp19g88WVIZ8+bD6wlMTLTOyXu7JV9FQ+quIKt5RLhJ6e43p5j18M5LlqR47TO4YWAEkSHZAjmWnRrOwHR4RVqaSHEWv5eTpBxHoFpbw8m5HE0U5/ZqEwhwSj15VPY1axA== x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:MN2PR12MB4286.namprd12.prod.outlook.com; PTR:; CAT:NONE; SFS:(4636009)(39860400002)(396003)(376002)(136003)(366004)(346002)(8936002)(71200400001)(2906002)(30864003)(86362001)(55016002)(8676002)(186003)(7416002)(76116006)(6506007)(52536014)(66446008)(64756008)(26005)(4326008)(83380400001)(316002)(9686003)(54906003)(110136005)(53546011)(66556008)(66476007)(33656002)(7696005)(478600001)(5660300002)(107886003)(66946007); DIR:OUT; SFP:1101; x-ms-exchange-antispam-messagedata: azNHEw6bM3ltMrOZzX1kvIV3sPTHOqHnVhe7aTKv1ed06TZLqI2chx6w0ENHyNT1GYjvyvon7IXT8z54fJQoctXo+Qc7P8HgVY4fhR/z/1Wq2Y0GT9/UU/XxsqA7wlEmT2uuCtdP7q6TPnxe8ZNGqkKIP4gPiUP8Rri+DBCaoe/OAjk+S62QPNGjUOcvSxM22k537Xql0nA73OKlPm4i/aV1SRfFP8s2h6jUwoTAyxPpyJodc73E0l43neJO4ikHuIaefcdjIC+t3nicNPVZHvWpyY+TATM7a9sDlLa+lLqVOAPubAsyjc++072eIVKZ8lUk/30JoLVUmFWL02s6siB1FSUu4P+VHX2xituwvMzBDqmaxVo5ciinDWcay7lnEXEr/ByaITTgDzPn1iOfDziGDC0VgrwVF0W/yDNmMiGGNvG54dOhIIESL/US8ti8aDWPp22oD55+DWa+E5GgB8VxHmyhU++pt6iMBkVHQ5T3juPT/XpSXVEuwBzv4rLo1oHA0ppkTyIoeu9QPQPYZA7MjcKryZsEkvkMzCgUvx4V6aPsbn6MMnL5oawmPDr+LnN4iG9McnhcJ50/EqRgnLwY+0+WMoLKqR+1VMtmE01BTHz18gWX9Z3/ST1ksu3yUbAUjTauqYuH9b7ENN6ISw== Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: MN2PR12MB4286.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 0818b7dc-954a-468f-acae-08d868560a7b X-MS-Exchange-CrossTenant-originalarrivaltime: 04 Oct 2020 11:10:02.2779 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: 2RjKLtlpOfOpjKOPxxipI+AaNgzX3A8FIVtMaROdpBchyRkgsYd91Cpv162PzebuE25vbva9ZlNMl+YAZeIgWA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BL0PR12MB2434 X-OriginatorOrg: Nvidia.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nvidia.com; s=n1; t=1601809826; bh=TcIbT2Yn3oQgzQvoxq9eEUXqexeIzpMHO5Y7yPy7cMM=; h=ARC-Seal:ARC-Message-Signature:ARC-Authentication-Results:From:To: CC:Subject:Thread-Topic:Thread-Index:Date:Message-ID:References: In-Reply-To:Accept-Language:Content-Language:X-MS-Has-Attach: X-MS-TNEF-Correlator:authentication-results:x-originating-ip: x-ms-publictraffictype:x-ms-office365-filtering-correlation-id: x-ms-traffictypediagnostic:x-ld-processed: x-ms-exchange-transport-forked:x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers:x-ms-exchange-senderadcheck: x-microsoft-antispam:x-microsoft-antispam-message-info: x-forefront-antispam-report:x-ms-exchange-antispam-messagedata: Content-Type:Content-Transfer-Encoding:MIME-Version: X-MS-Exchange-CrossTenant-AuthAs: X-MS-Exchange-CrossTenant-AuthSource: X-MS-Exchange-CrossTenant-Network-Message-Id: X-MS-Exchange-CrossTenant-originalarrivaltime: X-MS-Exchange-CrossTenant-fromentityheader: X-MS-Exchange-CrossTenant-id:X-MS-Exchange-CrossTenant-mailboxtype: X-MS-Exchange-CrossTenant-userprincipalname: X-MS-Exchange-Transport-CrossTenantHeadersStamped:X-OriginatorOrg; b=lXcBN9jJYtKu5hHp2FAyCqsCn51XRQ6vknlBkvTN59AeIGYgh6JwIAQih6zuqBj7G qySHrn6RCwMRMtk+9FHTLFCLEWvWBEPOqZfkUIA6aM8gEStzARBcX6d0lVkOKXvxU/ uDY+w3+l50vHUWS7nmlm2THlG9qylW3vFwH/NFa2L7nRGbgC8wkzW2kmxIGlL4wQ38 3sgXlcJK9k38MNKfa9uALGozu5O2a1koH3falDFvRGX5iHgofC5j3zoo5Gj6IMrN+w B6pYIwb8CzQmg4Ep64zIYMBNuR+dzuRxkr74ri308fO07N8uGjzYkurQscehSP60JL Zvc2DDp3mvzUA== Subject: Re: [dpdk-dev] [PATCH v3 01/10] ethdev: add flow shared action API X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Hi Andrey, You are missing the doc update (rte_flow)=20 PSB for more comments. Best, Ori > -----Original Message----- > From: Andrey Vesnovaty > Sent: Sunday, October 4, 2020 1:06 AM > Subject: [PATCH v3 01/10] ethdev: add flow shared action API >=20 > This commit introduces extension of DPDK flow action API enabling > sharing of single rte_flow_action in multiple flows. The API intended for > PMDs where multiple HW offloaded flows can reuse the same HW > essence/object representing flow action and modification of such an > essence/object effects all the rules using it. >=20 > Motivation and example > =3D=3D=3D > Adding or removing one or more queues to RSS used by multiple flow rules > imposes per rule toll for current DPDK flow API; the scenario requires > for each flow sharing cloned RSS action: > - call `rte_flow_destroy()` > - call `rte_flow_create()` with modified RSS action >=20 > API for sharing action and its in-place update benefits: > - reduce the overhead of multiple RSS flow rules reconfiguration > - optimize resource utilization by sharing action across of multiple > flows >=20 > Change description > =3D=3D=3D >=20 > Shared action > =3D=3D=3D > In order to represent flow action shared by multiple flows new action > type RTE_FLOW_ACTION_TYPE_SHARED is introduced (see `enum > rte_flow_action_type`). > Actually the introduced API decouples action from any specific flow and > enables sharing of single action by its handle across multiple flows. >=20 > Shared action create/use/destroy > =3D=3D=3D > Shared action may be reused by some or none flow rules at any given > moment, i.e. shared action reside outside of the context of any flow. > Shared action represent HW resources/objects used for action offloading > implementation. > API for shared action create (see `rte_flow_shared_action_create()`): > - should allocate HW resources and make related initializations required > for shared action implementation. > - make necessary preparations to maintain shared access to > the action resources, configuration and state. > API for shared action destroy (see `rte_flow_shared_action_destroy()`) > should release HW resources and make related cleanups required for shared > action implementation. >=20 > In order to share some flow action reuse the handle of type > `struct rte_flow_shared_action` returned by > rte_flow_shared_action_create() as a `conf` field of > `struct rte_flow_action` (see "example" section). >=20 > If some shared action not used by any flow rule all resources allocated > by the shared action can be released by rte_flow_shared_action_destroy() > (see "example" section). The shared action handle passed as argument to > destroy API should not be used any further i.e. result of the usage is > undefined. >=20 > Shared action re-configuration > =3D=3D=3D > Shared action behavior defined by its configuration can be updated via > rte_flow_shared_action_update() (see "example" section). The shared > action update operation modifies HW related resources/objects allocated > on the action creation. The number of operations performed by the update > operation should not be dependent on number of flows sharing the related > action. On return of shared action update API action behavior should be > according to updated configuration for all flows sharing the action. >=20 > Shared action query > =3D=3D=3D > Provide separate API to query shared action sate (see I think sate --> state, also it is not clear if we are sharing both configu= ration and state or only configuration. For example what will happen if we create counter an= d attached it to number of flow? Does it count for all flow so counter =3D flow1 + flow2? Or it is only for configuration which means that one each flow gets differe= nt counter? For counter there is a shared bit in the action so this can be used to dete= rment if the state should be shared, but counter doesn't have configuration to share. What happens with aging where we have state and configuration? I'm O.K with starting just with configuration, but it should be clear.=20 > rte_flow_shared_action_update()). Taking a counter as an example: query > returns value aggregating all counter increments across all flow rules > sharing the counter. >=20 > PMD support > =3D=3D=3D > The support of introduced API is pure PMD specific design and > responsibility for each action type (see struct rte_flow_ops). >=20 > testpmd > =3D=3D=3D > In order to utilize introduced API testpmd cli may implement following > extension > create/update/destroy/query shared action accordingly >=20 > flow shared_action (port) create {action_id (id)} (action) / end > flow shared_action (port) update (id) (action) / end > flow shared_action (port) destroy action_id (id) {action_id (id) [...]} > flow shared_action (port) query (id) >=20 > testpmd example > =3D=3D=3D >=20 > configure rss to queues 1 & 2 >=20 > > flow shared_action 0 create action_id 100 rss queues 1 2 end / end >=20 > create flow rule utilizing shared action >=20 > > flow create 0 ingress \ > pattern eth dst is 0c:42:a1:15:fd:ac / ipv6 / tcp / end \ > actions shared 100 / end >=20 > add 2 more queues >=20 > > flow shared_action 0 modify 100 rss queues 1 2 3 4 end / end >=20 > example > =3D=3D=3D >=20 > struct rte_flow_action actions[2]; > struct rte_flow_action action; > /* skipped: initialize action */ > struct rte_flow_shared_action *handle =3D rte_flow_shared_action_create( > port_id, &action, &error); > actions[0].type =3D RTE_FLOW_ACTION_TYPE_SHARED; > actions[0].conf =3D handle; > actions[1].type =3D RTE_FLOW_ACTION_TYPE_END; > /* skipped: init attr0 & pattern0 args */ > struct rte_flow *flow0 =3D rte_flow_create(port_id, &attr0, pattern0, > actions, error); > /* create more rules reusing shared action */ > struct rte_flow *flow1 =3D rte_flow_create(port_id, &attr1, pattern1, > actions, error); > /* skipped: for flows 2 till N */ > struct rte_flow *flowN =3D rte_flow_create(port_id, &attrN, patternN, > actions, error); > /* update shared action */ > struct rte_flow_action updated_action; > /* > * skipped: initialize updated_action according to desired action > * configuration change > */ > rte_flow_shared_action_update(port_id, handle, &updated_action, error); > /* > * from now on all flows 1 till N will act according to configuration of > * updated_action > */ > /* skipped: destroy all flows 1 till N */ > rte_flow_shared_action_destroy(port_id, handle, error); >=20 > Signed-off-by: Andrey Vesnovaty > Signed-off-by: Andrey Vesnovaty > --- > lib/librte_ethdev/rte_ethdev_version.map | 4 + > lib/librte_ethdev/rte_flow.c | 82 +++++++++++++ > lib/librte_ethdev/rte_flow.h | 148 ++++++++++++++++++++++- > lib/librte_ethdev/rte_flow_driver.h | 22 ++++ > 4 files changed, 255 insertions(+), 1 deletion(-) >=20 > diff --git a/lib/librte_ethdev/rte_ethdev_version.map > b/lib/librte_ethdev/rte_ethdev_version.map > index fc47f6472e..168bf7fc12 100644 > --- a/lib/librte_ethdev/rte_ethdev_version.map > +++ b/lib/librte_ethdev/rte_ethdev_version.map > @@ -225,6 +225,10 @@ EXPERIMENTAL { > rte_tm_shared_wred_context_delete; > rte_tm_wred_profile_add; > rte_tm_wred_profile_delete; > + rte_flow_shared_action_create; > + rte_flow_shared_action_destroy; > + rte_flow_shared_action_update; > + rte_flow_shared_action_query; > }; >=20 > INTERNAL { > diff --git a/lib/librte_ethdev/rte_flow.c b/lib/librte_ethdev/rte_flow.c > index f8fdd68fe9..ba3f01f7c7 100644 > --- a/lib/librte_ethdev/rte_flow.c > +++ b/lib/librte_ethdev/rte_flow.c > @@ -174,6 +174,7 @@ static const struct rte_flow_desc_data > rte_flow_desc_action[] =3D { > MK_FLOW_ACTION(SET_IPV4_DSCP, sizeof(struct > rte_flow_action_set_dscp)), > MK_FLOW_ACTION(SET_IPV6_DSCP, sizeof(struct > rte_flow_action_set_dscp)), > MK_FLOW_ACTION(AGE, sizeof(struct rte_flow_action_age)), > + MK_FLOW_ACTION(SHARED, 0), > }; >=20 > int > @@ -1251,3 +1252,84 @@ rte_flow_get_aged_flows(uint16_t port_id, void > **contexts, > RTE_FLOW_ERROR_TYPE_UNSPECIFIED, > NULL, rte_strerror(ENOTSUP)); > } > + > +struct rte_flow_shared_action * > +rte_flow_shared_action_create(uint16_t port_id, > + const struct rte_flow_action *action, > + struct rte_flow_error *error) You are missing the property for direction that we agreed in previous versi= on. > +{ > + struct rte_eth_dev *dev =3D &rte_eth_devices[port_id]; > + struct rte_flow_shared_action *shared_action; > + const struct rte_flow_ops *ops =3D rte_flow_ops_get(port_id, error); > + > + if (unlikely(!ops)) > + return NULL; > + if (likely(!!ops->shared_action_create)) { > + shared_action =3D ops->shared_action_create(dev, action, error); > + if (shared_action =3D=3D NULL) > + flow_err(port_id, -rte_errno, error); > + return shared_action; > + } > + rte_flow_error_set(error, ENOSYS, > RTE_FLOW_ERROR_TYPE_UNSPECIFIED, > + NULL, rte_strerror(ENOSYS)); > + return NULL; > +} > + > +int > +rte_flow_shared_action_destroy(uint16_t port_id, > + struct rte_flow_shared_action *action, > + struct rte_flow_error *error) > +{ > + struct rte_eth_dev *dev =3D &rte_eth_devices[port_id]; > + const struct rte_flow_ops *ops =3D rte_flow_ops_get(port_id, error); > + > + if (unlikely(!ops)) > + return -rte_errno; > + if (likely(!!ops->shared_action_destroy)) > + return flow_err(port_id, > + ops->shared_action_destroy(dev, action, > error), > + error); > + return rte_flow_error_set(error, ENOSYS, > + RTE_FLOW_ERROR_TYPE_UNSPECIFIED, > + NULL, rte_strerror(ENOSYS)); > +} > + > +int > +rte_flow_shared_action_update(uint16_t port_id, > + struct rte_flow_shared_action *action, > + const struct rte_flow_action *update, > + struct rte_flow_error *error) > +{ > + struct rte_eth_dev *dev =3D &rte_eth_devices[port_id]; > + const struct rte_flow_ops *ops =3D rte_flow_ops_get(port_id, error); > + > + if (unlikely(!ops)) > + return -rte_errno; > + if (likely(!!ops->shared_action_update)) > + return flow_err(port_id, ops->shared_action_update(dev, > action, > + update, error), > + error); > + return rte_flow_error_set(error, ENOSYS, > + RTE_FLOW_ERROR_TYPE_UNSPECIFIED, > + NULL, rte_strerror(ENOSYS)); > +} > + > +int > +rte_flow_shared_action_query(uint16_t port_id, > + const struct rte_flow_shared_action *action, > + void *data, > + struct rte_flow_error *error) > +{ > + struct rte_eth_dev *dev =3D &rte_eth_devices[port_id]; > + const struct rte_flow_ops *ops =3D rte_flow_ops_get(port_id, error); > + > + if (unlikely(!ops)) > + return -rte_errno; > + if (likely(!!ops->shared_action_query)) > + return flow_err(port_id, ops->shared_action_query(dev, action, > + data, error), > + error); > + return rte_flow_error_set(error, ENOSYS, > + RTE_FLOW_ERROR_TYPE_UNSPECIFIED, > + NULL, rte_strerror(ENOSYS)); > +} > diff --git a/lib/librte_ethdev/rte_flow.h b/lib/librte_ethdev/rte_flow.h > index da8bfa5489..02391316cb 100644 > --- a/lib/librte_ethdev/rte_flow.h > +++ b/lib/librte_ethdev/rte_flow.h > @@ -1714,7 +1714,8 @@ enum rte_flow_action_type { > /** > * Enables counters for this flow rule. > * > - * These counters can be retrieved and reset through rte_flow_query(), > + * These counters can be retrieved and reset through rte_flow_query() > or > + * rte_flow_shared_action_query() if the action provided via handle, > * see struct rte_flow_query_count. > * > * See struct rte_flow_action_count. > @@ -2132,6 +2133,14 @@ enum rte_flow_action_type { > * see enum RTE_ETH_EVENT_FLOW_AGED > */ > RTE_FLOW_ACTION_TYPE_AGE, > + > + /** > + * Describes action shared a cross multiple flow rules. > + * > + * Enables multiple rules reference the same action by handle (see > + * struct rte_flow_shared_action). > + */ > + RTE_FLOW_ACTION_TYPE_SHARED, > }; >=20 > /** > @@ -2693,6 +2702,20 @@ struct rte_flow_action_set_dscp { > uint8_t dscp; > }; >=20 > + > +/** > + * RTE_FLOW_ACTION_TYPE_SHARED > + * > + * Opaque type returned after successfully creating a shared action. > + * > + * This handle can be used to manage and query the related action: > + * - share it a cross multiple flow rules > + * - update action configuration > + * - query action data > + * - destroy action > + */ > +struct rte_flow_shared_action; > + > /* Mbuf dynamic field offset for metadata. */ > extern int32_t rte_flow_dynf_metadata_offs; >=20 > @@ -3357,6 +3380,129 @@ int > rte_flow_get_aged_flows(uint16_t port_id, void **contexts, > uint32_t nb_contexts, struct rte_flow_error *error); >=20 > +/** > + * @warning > + * @b EXPERIMENTAL: this API may change without prior notice. > + * > + * Create shared action for reuse in multiple flow rules. > + * > + * @param[in] port_id > + * The port identifier of the Ethernet device. > + * @param[in] action > + * Action configuration for shared action creation. > + * @param[out] error > + * Perform verbose error reporting if not NULL. PMDs initialize this > + * structure in case of error only. > + * @return > + * A valid handle in case of success, NULL otherwise and rte_errno is = set > + * to one of the error codes defined: > + * - (ENOSYS) if underlying device does not support this functionality= . > + * - (EIO) if underlying device is removed. > + * - (EINVAL) if *action* invalid. > + * - (ENOTSUP) if *action* valid but unsupported. > + */ > +__rte_experimental > +struct rte_flow_shared_action * > +rte_flow_shared_action_create(uint16_t port_id, > + const struct rte_flow_action *action, > + struct rte_flow_error *error); > + > +/** > + * @warning > + * @b EXPERIMENTAL: this API may change without prior notice. > + * > + * Destroys the shared action by handle. > + * > + * @param[in] port_id > + * The port identifier of the Ethernet device. > + * @param[in] action > + * Handle for the shared action to be destroyed. > + * @param[out] error > + * Perform verbose error reporting if not NULL. PMDs initialize this > + * structure in case of error only. > + * @return > + * - (0) if success. > + * - (-ENOSYS) if underlying device does not support this functionalit= y. > + * - (-EIO) if underlying device is removed. > + * - (-ENOENT) if action pointed by *action* handle was not found. > + * - (-ETOOMANYREFS) if action pointed by *action* handle still used b= y one > or > + * more rules > + * rte_errno is also set. > + */ > +__rte_experimental > +int > +rte_flow_shared_action_destroy(uint16_t port_id, > + struct rte_flow_shared_action *action, > + struct rte_flow_error *error); > + > +/** > + * @warning > + * @b EXPERIMENTAL: this API may change without prior notice. > + * > + * Updates inplace the shared action configuration pointed by *action* h= andle > + * with the configuration provided as *update* argument. > + * The update of the shared action configuration effects all flow rules = reusing > + * the action via handle. > + * > + * @param[in] port_id > + * The port identifier of the Ethernet device. > + * @param[in] action > + * Handle for the shared action to be updated. > + * @param[in] update > + * Action specification used to modify the action pointed by handle. > + * *update* should be of same type with the action pointed by the *act= ion* > + * handle argument, otherwise considered as invalid. > + * @param[out] error > + * Perform verbose error reporting if not NULL. PMDs initialize this > + * structure in case of error only. > + * @return > + * - (0) if success. > + * - (-ENOSYS) if underlying device does not support this functionalit= y. > + * - (-EIO) if underlying device is removed. > + * - (-EINVAL) if *update* invalid. > + * - (-ENOTSUP) if *update* valid but unsupported. > + * - (-ENOENT) if action pointed by *ctx* was not found. > + * rte_errno is also set. > + */ > +__rte_experimental > +int > +rte_flow_shared_action_update(uint16_t port_id, > + struct rte_flow_shared_action *action, > + const struct rte_flow_action *update, > + struct rte_flow_error *error); > + > +/** > + * @warning > + * @b EXPERIMENTAL: this API may change without prior notice. > + * > + * Query the shared action by handle. > + * > + * This function allows retrieving action-specific data such as counters= . > + * Data is gathered by special action which may be present/referenced in > + * more than one flow rule definition. > + * > + * \see RTE_FLOW_ACTION_TYPE_COUNT > + * > + * @param port_id > + * Port identifier of Ethernet device. > + * @param[in] action > + * Handle for the shared action to query. > + * @param[in, out] data > + * Pointer to storage for the associated query data type. > + * @param[out] error > + * Perform verbose error reporting if not NULL. PMDs initialize this > + * structure in case of error only. > + * > + * @return > + * 0 on success, a negative errno value otherwise and rte_errno is set= . > + */ > +__rte_experimental > +int > +rte_flow_shared_action_query(uint16_t port_id, > + const struct rte_flow_shared_action *action, > + void *data, > + struct rte_flow_error *error); > + > #ifdef __cplusplus > } > #endif > diff --git a/lib/librte_ethdev/rte_flow_driver.h > b/lib/librte_ethdev/rte_flow_driver.h > index 3ee871d3eb..72bfc3b7a7 100644 > --- a/lib/librte_ethdev/rte_flow_driver.h > +++ b/lib/librte_ethdev/rte_flow_driver.h > @@ -108,6 +108,28 @@ struct rte_flow_ops { > void **context, > uint32_t nb_contexts, > struct rte_flow_error *err); > + /** See rte_flow_shared_action_create() */ > + struct rte_flow_shared_action *(*shared_action_create) > + (struct rte_eth_dev *dev, > + const struct rte_flow_action *action, > + struct rte_flow_error *error); > + /** See rte_flow_shared_action_destroy() */ > + int (*shared_action_destroy) > + (struct rte_eth_dev *dev, > + struct rte_flow_shared_action *shared_action, > + struct rte_flow_error *error); > + /** See rte_flow_shared_action_update() */ > + int (*shared_action_update) > + (struct rte_eth_dev *dev, > + struct rte_flow_shared_action *shared_action, > + const struct rte_flow_action *update, > + struct rte_flow_error *error); > + /** See rte_flow_shared_action_query() */ > + int (*shared_action_query) > + (struct rte_eth_dev *dev, > + const struct rte_flow_shared_action *shared_action, > + void *data, > + struct rte_flow_error *error); > }; >=20 > /** > -- > 2.26.2