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 050FBA04E7; Mon, 2 Nov 2020 07:17:08 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 5C3095AB2; Mon, 2 Nov 2020 07:17:07 +0100 (CET) Received: from nat-hk.nvidia.com (nat-hk.nvidia.com [203.18.50.4]) by dpdk.org (Postfix) with ESMTP id D78FE592B for ; Mon, 2 Nov 2020 07:17:04 +0100 (CET) Received: from HKMAIL102.nvidia.com (Not Verified[10.18.92.77]) by nat-hk.nvidia.com (using TLS: TLSv1.2, AES256-SHA) id ; Mon, 02 Nov 2020 14:17:02 +0800 Received: from HKMAIL104.nvidia.com (10.18.16.13) by HKMAIL102.nvidia.com (10.18.16.11) with Microsoft SMTP Server (TLS) id 15.0.1473.3; Mon, 2 Nov 2020 06:17:02 +0000 Received: from NAM11-DM6-obe.outbound.protection.outlook.com (104.47.57.175) by HKMAIL104.nvidia.com (10.18.16.13) with Microsoft SMTP Server (TLS) id 15.0.1473.3 via Frontend Transport; Mon, 2 Nov 2020 06:17:01 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=OmKkRu1W4791Ov8aqU1qD3aHJJyr3chZWqHbzwzxMciPl4OdLWj4vFLTLt/B6LRO5EkLzubtJdEIZGR7SryhMnR8UsbHbmYiR1c8o5Sol4WLOSWFUBAfPEmQlmKpyW/rBOzSkFvFwO0QzTcag8oABCripDb5i71K+dFsmi6tpqw4CIY5uSgkNqVCldRpvy7EV/7biH1GaRcEbXV9Hc4caUQ5toowW5i6mrb2kxCnuy6mPaVSR848/5a4dc9ooPShzTbdIMEWyuRhOmtQAZNMgvBGGgBymCBcmVS0qrFn1+q3ShqqfgqIUvLIlIxZgnDWPBwE4X0bCmxNqQlltk4h8Q== 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=bFA1oglCEWd858bDo+AhjKo0yz99K/Ar1ZCKIyJtW/8=; b=f6rjvBME8yidwj7EF7rgmp6ba9VGkD+C9LEic/DwRbjNlLLJFRsnrZImsY5iH2FZ11zcJUBjMPY2W3+9kQrVwE1uvkhnUYRH7icX6hZqjAwBACaamC3fmyK66kVLSBuPVe3eZ9h0u+oDHyeRFcNh8gmxyL9g1QTWUszlb0/A4wdVoR0pr5uFqv7aQkB05Mk8YBz2PzQ8YOHIEur2OlbDKECOeRthggeS6nn9TybtmRjmwGqATz+102/M9QFeR9rbjZ5vYT7P6im9ZQ6WjuOxIrESniYgHZYJY8fNWKfE880qTDD8rdSQljEHJdaKVwyRRrRiQY3nVU2m3gG6HxqgbQ== 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 MW2PR12MB2492.namprd12.prod.outlook.com (2603:10b6:907:8::19) by MWHPR12MB1277.namprd12.prod.outlook.com (2603:10b6:300:f::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3499.19; Mon, 2 Nov 2020 06:16:59 +0000 Received: from MW2PR12MB2492.namprd12.prod.outlook.com ([fe80::39f3:2b4b:6018:4b88]) by MW2PR12MB2492.namprd12.prod.outlook.com ([fe80::39f3:2b4b:6018:4b88%7]) with mapi id 15.20.3499.030; Mon, 2 Nov 2020 06:16:59 +0000 From: Matan Azrad To: Matan Azrad , Slava Ovsiienko CC: "dev@dpdk.org" Thread-Topic: [PATCH v2 8/9] net/mlx5: support shared age action Thread-Index: AQHWsHi7FazlCEsoqUKRAzTlb256Z6m0Xadg Date: Mon, 2 Nov 2020 06:16:58 +0000 Message-ID: References: <1604008681-414157-1-git-send-email-matan@nvidia.com> <1604253472-213766-1-git-send-email-matan@nvidia.com> <1604253472-213766-9-git-send-email-matan@nvidia.com> In-Reply-To: <1604253472-213766-9-git-send-email-matan@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: [77.126.110.58] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: eeb77fc3-6c6c-47c4-dff6-08d87ef6e7f4 x-ms-traffictypediagnostic: MWHPR12MB1277: x-ms-exchange-transport-forked: True x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:800; x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: +x7cddN3vAg+H+/3mEog4mNT+lLOUmuzM4xcYV97L8pJ01LPwG6b/CypZMhn6CX5fGoz3oIOggJVIdj5vqrauGd7Hbj7wc5vYgb+sjP6ae1eAvUv6soVFtse58Gjoasp/IIffIO3oiaFasf8yu6UkQvXEuGeDpI4GoxArt8yi7DOUQ8AybZyxo20uGalrXuKcIFuWdq2JHLdpgD/UvhiW/zJfrAZLqOFQeJ7S1f3+yS4i9SrLRG/y9KI27/PYAan6Y+Xw20WmqJUZxRmYGb9tst3R93ZOfJSpMJDDYEMkMXQapudIYcw09XLN9yKRO5GjmMtn0s4ncfWEKC9QwcRZw== x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:MW2PR12MB2492.namprd12.prod.outlook.com; PTR:; CAT:NONE; SFS:(4636009)(39860400002)(396003)(376002)(136003)(366004)(346002)(478600001)(9686003)(5660300002)(52536014)(66476007)(8676002)(2906002)(64756008)(83380400001)(66446008)(76116006)(186003)(26005)(7696005)(66556008)(66946007)(55016002)(4326008)(86362001)(33656002)(8936002)(6636002)(6506007)(71200400001)(30864003)(316002)(110136005); DIR:OUT; SFP:1101; x-ms-exchange-antispam-messagedata: YY/T3EzCDjsMHr+g/dNskKHYa2HSKkTaA9O5Q2YjXlWOMgOOb3Mo26qtgMhP4n0kxZ+vr+nWQixnQbUCLir0gADzhuF7HtJyuw4EOVKokT+9yzfscmMcGIv25tMCMNCRMQj3ChYcD8Aut/QFl5MzkZEo6oJNbB28En6hI1PfPlRKOTHYQVYvOdwbQR/kqay1KsYpxfji1JgFFLA5KVYULkK/jK9y4zjHooO3dhRq0FzuxGWfULhEDSrBMmR7lL7wvkHZuFNaKfTB3+S4A5iivGq1zyUMDs8FOBCuABsEE+u13s9c1xdzN8dHMF49CRJqSxC58FeHzUHm0DlM1fvYB/vEIPBda6Bqg+ZqiqKbJEh5V+Bz9nPvMTwAZQpbeJEc+QAv9EMtiU3UJw+A+V84Fukb44yrlYj2J62rAEylnnsuMQWIBO1zZjVWvMrgkxz2Pffd0/7DuODUq3Nwz9Au6uEw/Z05mpMXzvA1G9alDjrL1OV+Sp28wfMzJQzmhJ8aun5Fmz5esuwrrus3vFuduFX1aFWodLRW485aiJvud6STjUVuKs5ZoDnFyUszOGbWhBYIeRpufzDGJ/FkTythdhLnfQJtPmlEoSe9qlsgqiNC7E8U3lhXBLezPtPzaxbV8DtsgjywOwR5rhvdrYWGyA== 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: MW2PR12MB2492.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: eeb77fc3-6c6c-47c4-dff6-08d87ef6e7f4 X-MS-Exchange-CrossTenant-originalarrivaltime: 02 Nov 2020 06:16:58.9875 (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: eoWnI9unj6ZVazkZkAr+yoPO0VUzLb58AtkosS8alogwIJbbvpz+zrZYXmRkPzvngepaYVq0OFVn1/0eKnWUsg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR12MB1277 X-OriginatorOrg: Nvidia.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nvidia.com; s=n1; t=1604297822; bh=bFA1oglCEWd858bDo+AhjKo0yz99K/Ar1ZCKIyJtW/8=; 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-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=DrLbAhQWOlvLmhHklh8xx7ViY03L0oi2UhQUuOnd1lAYVcpXLAIN5nkmkfUWEgbtg mB41/tm8DYTJYYHTrHe59DNkdwg6yR2STXTI7X6YHQbpzIP8lmzK8bor5ZOXYgiueI qqeX03zQkAiVM3MkNQwkwu08iknVFK0K9rDEv74bhrPHeonhTLoCaHzfjuEmBmutGR J+R6BEbXaIkc5S3OuFP7HyCPNS4OpqzCf6iXJyia7JVdP1gJ7sdFda9+3RXPOK0IiU H53N/gV2rhokkP6NR6r26SP0rVIWjRxdm3pCZRe4ZV5OJCLIZuWzaNdF6mbGMVXBgm nEOCWzI727nww== Subject: Re: [dpdk-dev] [PATCH v2 8/9] net/mlx5: support shared age action 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 Self note From: Matan Azrad: > Add support for rte_flow shared action API for ASO age action. >=20 > First step here to support validate, create, query and destroy. >=20 > The support is only for age ASO mode. >=20 > Signed-off-by: Matan Azrad > Acked-by: Dekel Peled > --- > drivers/net/mlx5/mlx5.h | 1 + > drivers/net/mlx5/mlx5_defs.h | 2 +- > drivers/net/mlx5/mlx5_flow.c | 61 ++++++++++++++-- > drivers/net/mlx5/mlx5_flow.h | 11 +++ > drivers/net/mlx5/mlx5_flow_dv.c | 155 +++++++++++++++++++++++++++++---- > ------- > 5 files changed, 181 insertions(+), 49 deletions(-) >=20 > diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h index > 2bc47d8..a156e5c 100644 > --- a/drivers/net/mlx5/mlx5.h > +++ b/drivers/net/mlx5/mlx5.h > @@ -524,6 +524,7 @@ struct mlx5_aso_sq { struct mlx5_aso_age_action { > LIST_ENTRY(mlx5_aso_age_action) next; > void *dr_action; > + uint32_t refcnt; > /* Following fields relevant only when action is active. */ > uint16_t offset; /* Offset of ASO Flow Hit flag in DevX object. */ > struct mlx5_age_param age_params; > diff --git a/drivers/net/mlx5/mlx5_defs.h b/drivers/net/mlx5/mlx5_defs.h = index > 2657081..4980352 100644 > --- a/drivers/net/mlx5/mlx5_defs.h > +++ b/drivers/net/mlx5/mlx5_defs.h > @@ -197,7 +197,7 @@ > #define MLX5_HAIRPIN_JUMBO_LOG_SIZE (14 + 2) >=20 > /* Maximum number of shared actions supported by rte_flow */ -#define > MLX5_MAX_SHARED_ACTIONS 1 > +#define MLX5_MAX_SHARED_ACTIONS 2 >=20 > /* Definition of static_assert found in /usr/include/assert.h */ #ifnde= f > HAVE_STATIC_ASSERT diff --git a/drivers/net/mlx5/mlx5_flow.c > b/drivers/net/mlx5/mlx5_flow.c index b08ee30..c0a2a04 100644 > --- a/drivers/net/mlx5/mlx5_flow.c > +++ b/drivers/net/mlx5/mlx5_flow.c > @@ -3266,6 +3266,29 @@ struct mlx5_flow_tunnel_info { > return NULL; > } >=20 > +/** > + * Get ASO age action by index. > + * > + * @param[in] dev > + * Pointer to the Ethernet device structure. > + * @param[in] age_idx > + * Index to the ASO age action. > + * > + * @return > + * The specified ASO age action. > + */ > +struct mlx5_aso_age_action* > +flow_aso_age_get_by_idx(struct rte_eth_dev *dev, uint32_t age_idx) { > + uint16_t pool_idx =3D age_idx & UINT16_MAX; > + uint16_t offset =3D (age_idx >> 16) & UINT16_MAX; > + struct mlx5_priv *priv =3D dev->data->dev_private; > + struct mlx5_aso_age_mng *mng =3D priv->sh->aso_age_mng; > + struct mlx5_aso_age_pool *pool =3D mng->pools[pool_idx]; > + > + return &pool->actions[offset - 1]; > +} > + > /* maps shared action to translated non shared in some actions array */ = struct > mlx5_translated_shared_action { > struct rte_flow_shared_action *action; /**< Shared action */ @@ - > 3353,6 +3376,15 @@ struct mlx5_translated_shared_action { > translated[shared->index].conf =3D > &shared_rss->origin; > break; > + case MLX5_SHARED_ACTION_TYPE_AGE: > + if (priv->sh->flow_hit_aso_en) { > + translated[shared->index].type =3D In order not get a warning in compilation for some gcc versions need to add= this conversion to the enum below: (enum rte_flow_action_type) Raslan, let me know if you need more version for all the series for this, o= r you can do it in integration time.... > + > MLX5_RTE_FLOW_ACTION_TYPE_AGE; > + translated[shared->index].conf =3D > + (void *)(uintptr_t)idx; > + break; > + } > + /* Fall-through */ > default: > mlx5_free(translated); > return rte_flow_error_set > @@ -7273,6 +7305,25 @@ struct mlx5_meter_domains_infos * > return fops->action_update(dev, action, action_conf, error); } >=20 > +/* Wrapper for driver action_destroy op callback */ static int > +flow_drv_action_query(struct rte_eth_dev *dev, > + const struct rte_flow_shared_action *action, > + void *data, > + const struct mlx5_flow_driver_ops *fops, > + struct rte_flow_error *error) > +{ > + static const char err_msg[] =3D "shared action query unsupported"; > + > + if (!fops->action_query) { > + DRV_LOG(ERR, "port %u %s.", dev->data->port_id, err_msg); > + rte_flow_error_set(error, ENOTSUP, > RTE_FLOW_ERROR_TYPE_ACTION, > + NULL, err_msg); > + return -rte_errno; > + } > + return fops->action_query(dev, action, data, error); } > + > /** > * Create shared action for reuse in multiple flow rules. > * > @@ -7375,11 +7426,11 @@ struct mlx5_meter_domains_infos * > void *data, > struct rte_flow_error *error) > { > - (void)dev; > - (void)action; > - (void)data; > - return rte_flow_error_set(error, ENOTSUP, > RTE_FLOW_ERROR_TYPE_ACTION, > - NULL, "action type query not supported"); > + struct rte_flow_attr attr =3D { .transfer =3D 0 }; > + const struct mlx5_flow_driver_ops *fops =3D > + flow_get_drv_ops(flow_get_drv_type(dev, &attr)); > + > + return flow_drv_action_query(dev, action, data, fops, error); > } >=20 > /** > diff --git a/drivers/net/mlx5/mlx5_flow.h b/drivers/net/mlx5/mlx5_flow.h > index b77df50..58185fb 100644 > --- a/drivers/net/mlx5/mlx5_flow.h > +++ b/drivers/net/mlx5/mlx5_flow.h > @@ -36,12 +36,14 @@ enum mlx5_rte_flow_action_type { > MLX5_RTE_FLOW_ACTION_TYPE_COPY_MREG, > MLX5_RTE_FLOW_ACTION_TYPE_DEFAULT_MISS, > MLX5_RTE_FLOW_ACTION_TYPE_TUNNEL_SET, > + MLX5_RTE_FLOW_ACTION_TYPE_AGE, > }; >=20 > #define MLX5_SHARED_ACTION_TYPE_OFFSET 30 >=20 > enum { > MLX5_SHARED_ACTION_TYPE_RSS, > + MLX5_SHARED_ACTION_TYPE_AGE, > }; >=20 > /* Matches on selected register. */ > @@ -1165,10 +1167,16 @@ typedef int (*mlx5_flow_action_update_t) > struct rte_flow_shared_action *action, > const void *action_conf, > struct rte_flow_error *error); > +typedef int (*mlx5_flow_action_query_t) > + (struct rte_eth_dev *dev, > + const struct rte_flow_shared_action *action, > + void *data, > + struct rte_flow_error *error); > typedef int (*mlx5_flow_sync_domain_t) > (struct rte_eth_dev *dev, > uint32_t domains, > uint32_t flags); > + > struct mlx5_flow_driver_ops { > mlx5_flow_validate_t validate; > mlx5_flow_prepare_t prepare; > @@ -1189,6 +1197,7 @@ struct mlx5_flow_driver_ops { > mlx5_flow_action_create_t action_create; > mlx5_flow_action_destroy_t action_destroy; > mlx5_flow_action_update_t action_update; > + mlx5_flow_action_query_t action_query; > mlx5_flow_sync_domain_t sync_domain; > }; >=20 > @@ -1457,4 +1466,6 @@ struct mlx5_cache_entry > *flow_dv_dest_array_create_cb > struct mlx5_cache_entry *entry, void > *cb_ctx); void flow_dv_dest_array_remove_cb(struct mlx5_cache_list *list= , > struct mlx5_cache_entry *entry); > +struct mlx5_aso_age_action *flow_aso_age_get_by_idx(struct rte_eth_dev > *dev, > + uint32_t age_idx); > #endif /* RTE_PMD_MLX5_FLOW_H_ */ > diff --git a/drivers/net/mlx5/mlx5_flow_dv.c > b/drivers/net/mlx5/mlx5_flow_dv.c index be93ba9..d60626c 100644 > --- a/drivers/net/mlx5/mlx5_flow_dv.c > +++ b/drivers/net/mlx5/mlx5_flow_dv.c > @@ -5926,6 +5926,10 @@ struct mlx5_hlist_entry * > /* Meter action will add one more TAG action. */ > rw_act_num +=3D MLX5_ACT_NUM_SET_TAG; > break; > + case MLX5_RTE_FLOW_ACTION_TYPE_AGE: > + action_flags |=3D MLX5_FLOW_ACTION_AGE; > + ++actions_n; > + break; > case RTE_FLOW_ACTION_TYPE_AGE: > ret =3D flow_dv_validate_action_age(action_flags, > actions, dev, > @@ -9241,29 +9245,6 @@ struct mlx5_cache_entry * } >=20 > /** > - * Get ASO age action by index. > - * > - * @param[in] dev > - * Pointer to the Ethernet device structure. > - * @param[in] age_idx > - * Index to the ASO age action. > - * > - * @return > - * The specified ASO age action. > - */ > -static struct mlx5_aso_age_action* > -flow_dv_aso_age_get_by_idx(struct rte_eth_dev *dev, uint32_t age_idx) -{ > - uint16_t pool_idx =3D age_idx & UINT16_MAX; > - uint16_t offset =3D (age_idx >> 16) & UINT16_MAX; > - struct mlx5_priv *priv =3D dev->data->dev_private; > - struct mlx5_aso_age_mng *mng =3D priv->sh->aso_age_mng; > - struct mlx5_aso_age_pool *pool =3D mng->pools[pool_idx]; > - > - return &pool->actions[offset - 1]; > -} > - > -/** > * Remove an ASO age action from age actions list. > * > * @param[in] dev > @@ -9295,18 +9276,35 @@ struct mlx5_cache_entry * > } > } >=20 > -static void > +/** > + * Release an ASO age action. > + * > + * @param[in] dev > + * Pointer to the Ethernet device structure. > + * @param[in] age_idx > + * Index of ASO age action to release. > + * @param[in] flow > + * True if the release operation is during flow destroy operation. > + * False if the release operation is during action destroy operation. > + * > + * @return > + * 0 when age action was removed, otherwise the number of references. > + */ > +static int > flow_dv_aso_age_release(struct rte_eth_dev *dev, uint32_t age_idx) { > struct mlx5_priv *priv =3D dev->data->dev_private; > struct mlx5_aso_age_mng *mng =3D priv->sh->aso_age_mng; > - struct mlx5_aso_age_action *age =3D flow_dv_aso_age_get_by_idx(dev, > - age_idx); > + struct mlx5_aso_age_action *age =3D flow_aso_age_get_by_idx(dev, > age_idx); > + uint32_t ret =3D __atomic_sub_fetch(&age->refcnt, 1, > __ATOMIC_RELAXED); >=20 > - flow_dv_aso_age_remove_from_age(dev, age); > - rte_spinlock_lock(&mng->free_sl); > - LIST_INSERT_HEAD(&mng->free, age, next); > - rte_spinlock_unlock(&mng->free_sl); > + if (!ret) { > + flow_dv_aso_age_remove_from_age(dev, age); > + rte_spinlock_lock(&mng->free_sl); > + LIST_INSERT_HEAD(&mng->free, age, next); > + rte_spinlock_unlock(&mng->free_sl); > + } > + return ret; > } >=20 > /** > @@ -9450,6 +9448,7 @@ struct mlx5_cache_entry * > return 0; /* 0 is an error.*/ > } > } > + __atomic_store_n(&age_free->refcnt, 1, __ATOMIC_RELAXED); > return pool->index | ((age_free->offset + 1) << 16); } >=20 > @@ -9469,12 +9468,12 @@ struct mlx5_cache_entry * > const struct rte_flow_action_age *age) { > uint32_t age_idx =3D 0; > - struct mlx5_aso_age_action *aso_age =3D NULL; > + struct mlx5_aso_age_action *aso_age; >=20 > age_idx =3D flow_dv_aso_age_alloc(dev); > if (!age_idx) > return 0; > - aso_age =3D flow_dv_aso_age_get_by_idx(dev, age_idx); > + aso_age =3D flow_aso_age_get_by_idx(dev, age_idx); > aso_age->age_params.context =3D age->context; > aso_age->age_params.timeout =3D age->timeout; > aso_age->age_params.port_id =3D dev->data->port_id; @@ -9638,6 > +9637,7 @@ struct mlx5_cache_entry * > const uint8_t *rss_key; > const struct rte_flow_action_meter *mtr; > struct mlx5_flow_tbl_resource *tbl; > + struct mlx5_aso_age_action *age_act; > uint32_t port_id =3D 0; > struct mlx5_flow_dv_port_id_action_resource > port_id_resource; > int action_type =3D actions->type; > @@ -9774,6 +9774,14 @@ struct mlx5_cache_entry * > action_flags |=3D MLX5_FLOW_ACTION_RSS; > dev_flow->handle->fate_action =3D > MLX5_FLOW_FATE_QUEUE; > break; > + case MLX5_RTE_FLOW_ACTION_TYPE_AGE: > + flow->age =3D (uint32_t)(uintptr_t)(action->conf); > + age_act =3D flow_aso_age_get_by_idx(dev, flow->age); > + __atomic_fetch_add(&age_act->refcnt, 1, > + __ATOMIC_RELAXED); > + dev_flow->dv.actions[actions_n++] =3D age_act- > >dr_action; > + action_flags |=3D MLX5_FLOW_ACTION_AGE; > + break; > case RTE_FLOW_ACTION_TYPE_AGE: > if (priv->sh->flow_hit_aso_en) { > flow->age =3D > flow_dv_translate_create_aso_age @@ -9785,7 +9793,7 @@ struct > mlx5_cache_entry * > NULL, > "can't create age action"); > dev_flow->dv.actions[actions_n++] =3D > - (flow_dv_aso_age_get_by_idx > + (flow_aso_age_get_by_idx > (dev, flow->age))->dr_action; > action_flags |=3D MLX5_FLOW_ACTION_AGE; > break; > @@ -11441,6 +11449,19 @@ struct mlx5_cache_entry * > idx =3D (MLX5_SHARED_ACTION_TYPE_RSS << > MLX5_SHARED_ACTION_TYPE_OFFSET) | ret; > break; > + case RTE_FLOW_ACTION_TYPE_AGE: > + ret =3D flow_dv_translate_create_aso_age(dev, action->conf); > + idx =3D (MLX5_SHARED_ACTION_TYPE_AGE << > + MLX5_SHARED_ACTION_TYPE_OFFSET) | ret; > + if (ret) { > + struct mlx5_aso_age_action *aso_age =3D > + flow_aso_age_get_by_idx(dev, > ret); > + > + if (!aso_age->age_params.context) > + aso_age->age_params.context =3D > + (void *)(uintptr_t)idx; > + } > + break; > default: > rte_flow_error_set(err, ENOTSUP, > RTE_FLOW_ERROR_TYPE_ACTION, > NULL, "action type not supported"); @@ - > 11478,17 +11499,23 @@ struct mlx5_cache_entry * >=20 > switch (type) { > case MLX5_SHARED_ACTION_TYPE_RSS: > - ret =3D __flow_dv_action_rss_release(dev, idx, error); > - break; > + return __flow_dv_action_rss_release(dev, idx, error); > + case MLX5_SHARED_ACTION_TYPE_AGE: > + ret =3D flow_dv_aso_age_release(dev, idx); > + if (ret) > + /* > + * In this case, the last flow has a reference will > + * actually release the age action. > + */ > + DRV_LOG(DEBUG, "Shared age action %" PRIu32 " > was" > + " released with references %d.", idx, ret); > + return 0; > default: > return rte_flow_error_set(error, ENOTSUP, > RTE_FLOW_ERROR_TYPE_ACTION, > NULL, > "action type not supported"); > } > - if (ret) > - return ret; > - return 0; > } >=20 > /** > @@ -11609,9 +11636,41 @@ struct mlx5_cache_entry * > return rte_flow_error_set(err, ENOTSUP, > RTE_FLOW_ERROR_TYPE_ACTION, > NULL, > - "action type not supported"); > + "action type update not supported"); > + } > +} > + > +static int > +flow_dv_action_query(struct rte_eth_dev *dev, > + const struct rte_flow_shared_action *action, void *data, > + struct rte_flow_error *error) > +{ > + struct mlx5_age_param *age_param; > + struct rte_flow_query_age *resp; > + uint32_t act_idx =3D (uint32_t)(uintptr_t)action; > + uint32_t type =3D act_idx >> MLX5_SHARED_ACTION_TYPE_OFFSET; > + uint32_t idx =3D act_idx & ((1u << > MLX5_SHARED_ACTION_TYPE_OFFSET) - 1); > + > + switch (type) { > + case MLX5_SHARED_ACTION_TYPE_AGE: > + age_param =3D &flow_aso_age_get_by_idx(dev, idx)- > >age_params; > + resp =3D data; > + resp->aged =3D __atomic_load_n(&age_param->state, > + __ATOMIC_RELAXED) =3D=3D > AGE_TMOUT ? > + 1 : 0; > + resp->sec_since_last_hit_valid =3D !resp->aged; > + if (resp->sec_since_last_hit_valid) > + resp->sec_since_last_hit =3D __atomic_load_n > + (&age_param->sec_since_last_hit, > __ATOMIC_RELAXED); > + return 0; > + default: > + return rte_flow_error_set(error, ENOTSUP, > + RTE_FLOW_ERROR_TYPE_ACTION, > + NULL, > + "action type query not supported"); > } > } > + > /** > * Query a dv flow rule for its statistics via devx. > * > @@ -11692,7 +11751,7 @@ struct mlx5_cache_entry * >=20 > if (flow->age) { > struct mlx5_aso_age_action *act =3D > - flow_dv_aso_age_get_by_idx(dev, flow- > >age); > + flow_aso_age_get_by_idx(dev, flow->age); >=20 > age_param =3D &act->age_params; > } else if (flow->counter) { > @@ -12402,14 +12461,23 @@ struct mlx5_cache_entry * > flow_dv_action_validate(struct rte_eth_dev *dev, > const struct rte_flow_shared_action_conf *conf, > const struct rte_flow_action *action, > - struct rte_flow_error *error) > + struct rte_flow_error *err) > { > + struct mlx5_priv *priv =3D dev->data->dev_private; > + > RTE_SET_USED(conf); > switch (action->type) { > case RTE_FLOW_ACTION_TYPE_RSS: > - return mlx5_validate_action_rss(dev, action, error); > + return mlx5_validate_action_rss(dev, action, err); > + case RTE_FLOW_ACTION_TYPE_AGE: > + if (!priv->sh->aso_age_mng) > + return rte_flow_error_set(err, ENOTSUP, > + > RTE_FLOW_ERROR_TYPE_UNSPECIFIED, > + NULL, > + "shared age action not supported"); > + return flow_dv_validate_action_age(0, action, dev, err); > default: > - return rte_flow_error_set(error, ENOTSUP, > + return rte_flow_error_set(err, ENOTSUP, > RTE_FLOW_ERROR_TYPE_ACTION, > NULL, > "action type not supported"); > @@ -12461,6 +12529,7 @@ struct mlx5_cache_entry * > .action_create =3D flow_dv_action_create, > .action_destroy =3D flow_dv_action_destroy, > .action_update =3D flow_dv_action_update, > + .action_query =3D flow_dv_action_query, > .sync_domain =3D flow_dv_sync_domain, > }; >=20 > -- > 1.8.3.1