From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by dpdk.space (Postfix) with ESMTP id 6FC53A0679 for ; Mon, 1 Apr 2019 16:38:22 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 655B03572; Mon, 1 Apr 2019 16:38:21 +0200 (CEST) Received: from EUR03-VE1-obe.outbound.protection.outlook.com (mail-eopbgr50049.outbound.protection.outlook.com [40.107.5.49]) by dpdk.org (Postfix) with ESMTP id 5DA9C2B99 for ; Mon, 1 Apr 2019 16:38:19 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Mellanox.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=1sH3yrRHHn7N/bSUzoRUkbAAK3AbnujseskjGWhpzPA=; b=BlfRvCrALEoZsP35cW5mh7hP0vKOjQTTGZbTRZbBRPo/WoQANaYR48dfj/utnCvYfTYCDVianKtoRmZ4CT78a2G1sB15dfkHj7buMqKfiCrw5K2zI6/5xarbIhfocSkrI8mmsf3JCQjSStFGQLO+dmGGyB4Li6wskDlxBNVqltQ= Received: from AM4PR05MB3265.eurprd05.prod.outlook.com (10.171.188.154) by AM4PR05MB3185.eurprd05.prod.outlook.com (10.171.188.11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1750.22; Mon, 1 Apr 2019 14:38:17 +0000 Received: from AM4PR05MB3265.eurprd05.prod.outlook.com ([fe80::11b0:de86:8d93:8b02]) by AM4PR05MB3265.eurprd05.prod.outlook.com ([fe80::11b0:de86:8d93:8b02%3]) with mapi id 15.20.1750.021; Mon, 1 Apr 2019 14:38:17 +0000 From: Slava Ovsiienko To: Ori Kam , Matan Azrad , Yongseok Koh , Shahaf Shuler CC: "dev@dpdk.org" Thread-Topic: [PATCH v2 1/3] net/mlx5: prepare Direct Verbs for Direct Rule Thread-Index: AQHU5YPmqFV83n3A1kmE/+2lpRQFE6YnZclw Date: Mon, 1 Apr 2019 14:38:17 +0000 Message-ID: References: <1553096315-91832-1-git-send-email-orika@mellanox.com> <1553790741-69362-1-git-send-email-orika@mellanox.com> <1553790741-69362-2-git-send-email-orika@mellanox.com> In-Reply-To: <1553790741-69362-2-git-send-email-orika@mellanox.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [95.67.35.250] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 7fdf3b81-3bf6-4d0e-2538-08d6b6afae42 x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: BCL:0; PCL:0; RULEID:(2390118)(7020095)(4652040)(8989299)(5600139)(711020)(4605104)(4618075)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(2017052603328)(7153060)(7193020); SRVR:AM4PR05MB3185; x-ms-traffictypediagnostic: AM4PR05MB3185: authentication-results: spf=none (sender IP is ) smtp.mailfrom=viacheslavo@mellanox.com; x-microsoft-antispam-prvs: x-forefront-prvs: 0994F5E0C5 x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(366004)(136003)(376002)(396003)(346002)(39860400002)(199004)(189003)(13464003)(51234002)(68736007)(53946003)(8676002)(66066001)(71200400001)(6636002)(86362001)(3846002)(6246003)(7696005)(52536014)(106356001)(81166006)(81156014)(53546011)(6506007)(186003)(6116002)(74316002)(229853002)(9686003)(99286004)(76176011)(486006)(26005)(6436002)(102836004)(11346002)(446003)(476003)(55016002)(53936002)(2906002)(7736002)(316002)(110136005)(33656002)(305945005)(256004)(105586002)(8936002)(478600001)(14454004)(30864003)(71190400001)(5660300002)(25786009)(4326008)(97736004)(579004); DIR:OUT; SFP:1101; SCL:1; SRVR:AM4PR05MB3185; H:AM4PR05MB3265.eurprd05.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; A:1; MX:1; received-spf: None (protection.outlook.com: mellanox.com does not designate permitted sender hosts) x-ms-exchange-senderadcheck: 1 x-microsoft-antispam-message-info: ELNxOYERORylPDQMcvD1XlO4gtUca35ZCtav71nDB/Z3gAZyzk2kyR0D9W4VV7raB59x9WtRVHfyEAunHFy9xlgrgdv1aOfBptVt2G09dxJVywxT/56GXDjwa3IJd/zq0uONcd6hgowJcvO6ZWnfpT+RVJr3iqKImCIZjgvsz0A0kPkjbN7jjtxyqL2R23pZ1onuBAuPBXycZP6PdtguBc0t2HjX1L4emLM/8LnfNjbZGkSurpna1XsN1ZE9TZx2amOLNzMAx55r1i5hYkDcW7YTdD4dMhTi7wwuLXIIMSAUCfWJU6PVafjjr3SaqK8+qSW9JzZywJiQha1CoykMWJ6mPOkgE5TDWIVVYqJFLyW+jdH8zNKwjeUGGEZ4kilMcIoOnSfugkDIba6eEyAbBvttD3NtBnyiwqA8d8xq2/4= Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginatorOrg: Mellanox.com X-MS-Exchange-CrossTenant-Network-Message-Id: 7fdf3b81-3bf6-4d0e-2538-08d6b6afae42 X-MS-Exchange-CrossTenant-originalarrivaltime: 01 Apr 2019 14:38:17.7115 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: a652971c-7d2e-4d9b-a6a4-d149256f461b X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM4PR05MB3185 Subject: Re: [dpdk-dev] [PATCH v2 1/3] net/mlx5: prepare Direct Verbs for Direct Rule 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" Message-ID: <20190401143817.zsbQTDz9LKEcwo-9vwWSOtfXUomEviDoOk9fdavj4jo@z> > -----Original Message----- > From: Ori Kam > Sent: Thursday, March 28, 2019 18:33 > To: Matan Azrad ; Yongseok Koh > ; Shahaf Shuler > Cc: dev@dpdk.org; Ori Kam ; Slava Ovsiienko > > Subject: [PATCH v2 1/3] net/mlx5: prepare Direct Verbs for Direct Rule >=20 > This is the first patch of a series that is designed to enable the Direct= Rules > API. >=20 > The main difference between Direct Verbs and Direct Rules from API > prespective, is that in Direct Rules each action has it's own create func= tion > and the object itself is of type void. >=20 > In this patch I'm adding functions to generate actions that currenlty are= done > without create action, and I'm changing the action type to be void *, so = in > next patches only the glue functions will need to change. >=20 > Signed-off-by: Ori Kam Acked-by: Viacheslav Ovsiienko >=20 > --- > drivers/net/mlx5/mlx5.h | 2 + > drivers/net/mlx5/mlx5_flow.h | 17 +++- > drivers/net/mlx5/mlx5_flow_dv.c | 188 ++++++++++++++++++++++++++++--- > --------- > drivers/net/mlx5/mlx5_glue.c | 141 ++++++++++++++++++++++++------ > drivers/net/mlx5/mlx5_glue.h | 26 +++--- > 5 files changed, 278 insertions(+), 96 deletions(-) >=20 > diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h index > 7402798..b587359 100644 > --- a/drivers/net/mlx5/mlx5.h > +++ b/drivers/net/mlx5/mlx5.h > @@ -269,6 +269,8 @@ struct mlx5_priv { > LIST_HEAD(matchers, mlx5_flow_dv_matcher) matchers; > LIST_HEAD(encap_decap, mlx5_flow_dv_encap_decap_resource) > encaps_decaps; > LIST_HEAD(modify_cmd, mlx5_flow_dv_modify_hdr_resource) > modify_cmds; > + LIST_HEAD(tag, mlx5_flow_dv_tag_resource) tags; > + /* Tags resources cache. */ > uint32_t link_speed_capa; /* Link speed capabilities. */ > struct mlx5_xstats_ctrl xstats_ctrl; /* Extended stats control. */ > struct mlx5_stats_ctrl stats_ctrl; /* Stats control. */ diff --git > a/drivers/net/mlx5/mlx5_flow.h b/drivers/net/mlx5/mlx5_flow.h index > e1e798b..4f69ae2 100644 > --- a/drivers/net/mlx5/mlx5_flow.h > +++ b/drivers/net/mlx5/mlx5_flow.h > @@ -214,7 +214,7 @@ struct mlx5_flow_dv_encap_decap_resource { > LIST_ENTRY(mlx5_flow_dv_encap_decap_resource) next; > /* Pointer to next element. */ > rte_atomic32_t refcnt; /**< Reference counter. */ > - struct ibv_flow_action *verbs_action; > + void *verbs_action; > /**< Verbs encap/decap action object. */ > uint8_t buf[MLX5_ENCAP_MAX_LEN]; > size_t size; > @@ -222,6 +222,16 @@ struct mlx5_flow_dv_encap_decap_resource { > uint8_t ft_type; > }; >=20 > +/* Tag resource structure. */ > +struct mlx5_flow_dv_tag_resource { > + LIST_ENTRY(mlx5_flow_dv_tag_resource) next; > + /* Pointer to next element. */ > + rte_atomic32_t refcnt; /**< Reference counter. */ > + void *action; > + /**< Verbs tag action object. */ > + uint32_t tag; /**< the tag value. */ > +}; > + > /* Number of modification commands. */ > #define MLX5_MODIFY_NUM 8 >=20 > @@ -259,7 +269,7 @@ struct mlx5_flow_dv { > /**< Pointer to modify header resource in cache. */ > struct ibv_flow *flow; /**< Installed flow. */ #ifdef > HAVE_IBV_FLOW_DV_SUPPORT > - struct mlx5dv_flow_action_attr > actions[MLX5_DV_MAX_NUMBER_OF_ACTIONS]; > + void *actions[MLX5_DV_MAX_NUMBER_OF_ACTIONS]; > /**< Action list. */ > #endif > int actions_n; /**< number of actions. */ @@ -332,6 +342,7 @@ > struct mlx5_flow_counter { > }; > uint64_t hits; /**< Number of packets matched by the rule. */ > uint64_t bytes; /**< Number of bytes matched by the rule. */ > + void *action; /**< Pointer to the dv action. */ > }; >=20 > /* Flow structure. */ > @@ -339,6 +350,8 @@ struct rte_flow { > TAILQ_ENTRY(rte_flow) next; /**< Pointer to the next flow structure. > */ > enum mlx5_flow_drv_type drv_type; /**< Drvier type. */ > struct mlx5_flow_counter *counter; /**< Holds flow counter. */ > + struct mlx5_flow_dv_tag_resource *tag_resource; > + /**< pointer to the tag action. */ > struct rte_flow_action_rss rss;/**< RSS context. */ > uint8_t key[MLX5_RSS_HASH_KEY_LEN]; /**< RSS hash key. */ > uint16_t (*queue)[]; /**< Destination queues to redirect traffic to. */ > diff --git a/drivers/net/mlx5/mlx5_flow_dv.c > b/drivers/net/mlx5/mlx5_flow_dv.c index 57847fb..b0c50a7 100644 > --- a/drivers/net/mlx5/mlx5_flow_dv.c > +++ b/drivers/net/mlx5/mlx5_flow_dv.c > @@ -32,13 +32,8 @@ > #include "mlx5_prm.h" > #include "mlx5_glue.h" > #include "mlx5_flow.h" > - > #ifdef HAVE_IBV_FLOW_DV_SUPPORT >=20 > -#ifndef HAVE_IBV_FLOW_DEVX_COUNTERS > -#define MLX5DV_FLOW_ACTION_COUNTER_DEVX 0 -#endif > - > union flow_dv_attr { > struct { > uint32_t valid:1; > @@ -1537,6 +1532,11 @@ struct field_modify_info modify_tcp[] =3D { > .id =3D id, > .dcs =3D dcs, > }; > + tmpl.action =3D mlx5_glue->dv_create_flow_action_counter(dcs->obj, > 0); > + if (!tmpl.action) { > + ret =3D errno; > + goto error_exit; > + } > *cnt =3D tmpl; > LIST_INSERT_HEAD(&priv->flow_counters, cnt, next); > return cnt; > @@ -2828,6 +2828,97 @@ struct field_modify_info modify_tcp[] =3D { } >=20 > /** > + * Find existing tag resource or create and register a new one. > + * > + * @param dev[in, out] > + * Pointer to rte_eth_dev structure. > + * @param[in, out] resource > + * Pointer to tag resource. > + * @parm[in, out] dev_flow > + * Pointer to the dev_flow. > + * @param[out] error > + * pointer to error structure. > + * > + * @return > + * 0 on success otherwise -errno and errno is set. > + */ > +static int > +flow_dv_tag_resource_register > + (struct rte_eth_dev *dev, > + struct mlx5_flow_dv_tag_resource *resource, > + struct mlx5_flow *dev_flow, > + struct rte_flow_error *error) > +{ > + struct mlx5_priv *priv =3D dev->data->dev_private; > + struct mlx5_flow_dv_tag_resource *cache_resource; > + > + /* Lookup a matching resource from cache. */ > + LIST_FOREACH(cache_resource, &priv->tags, next) { > + if (resource->tag =3D=3D cache_resource->tag) { > + DRV_LOG(DEBUG, "tag resource %p: refcnt %d++", > + (void *)cache_resource, > + rte_atomic32_read(&cache_resource- > >refcnt)); > + rte_atomic32_inc(&cache_resource->refcnt); > + dev_flow->flow->tag_resource =3D cache_resource; > + return 0; > + } > + } > + /* Register new resource. */ > + cache_resource =3D rte_calloc(__func__, 1, sizeof(*cache_resource), 0); > + if (!cache_resource) > + return rte_flow_error_set(error, ENOMEM, > + > RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL, > + "cannot allocate resource > memory"); > + *cache_resource =3D *resource; > + cache_resource->action =3D mlx5_glue->dv_create_flow_action_tag > + (resource->tag); > + if (!cache_resource->action) { > + rte_free(cache_resource); > + return rte_flow_error_set(error, ENOMEM, > + > RTE_FLOW_ERROR_TYPE_UNSPECIFIED, > + NULL, "cannot create action"); > + } > + rte_atomic32_init(&cache_resource->refcnt); > + rte_atomic32_inc(&cache_resource->refcnt); > + LIST_INSERT_HEAD(&priv->tags, cache_resource, next); > + dev_flow->flow->tag_resource =3D cache_resource; > + DRV_LOG(DEBUG, "new tag resource %p: refcnt %d++", > + (void *)cache_resource, > + rte_atomic32_read(&cache_resource->refcnt)); > + return 0; > +} > + > +/** > + * Release the tag. > + * > + * @param dev > + * Pointer to Ethernet device. > + * @param flow > + * Pointer to mlx5_flow. > + * > + * @return > + * 1 while a reference on it exists, 0 when freed. > + */ > +static int > +flow_dv_tag_release(struct rte_eth_dev *dev, > + struct mlx5_flow_dv_tag_resource *tag) { > + assert(tag); > + DRV_LOG(DEBUG, "port %u tag %p: refcnt %d--", > + dev->data->port_id, (void *)tag, > + rte_atomic32_read(&tag->refcnt)); > + if (rte_atomic32_dec_and_test(&tag->refcnt)) { > + claim_zero(mlx5_glue->destroy_flow_action(tag->action)); > + LIST_REMOVE(tag, next); > + DRV_LOG(DEBUG, "port %u tag %p: removed", > + dev->data->port_id, (void *)tag); > + rte_free(tag); > + return 0; > + } > + return 1; > +} > + > +/** > * Fill the flow with DV spec. > * > * @param[in] dev > @@ -2872,6 +2963,7 @@ struct field_modify_info modify_tcp[] =3D { >=20 > MLX5DV_FLOW_TABLE_TYPE_NIC_RX > }; > union flow_dv_attr flow_attr =3D { .attr =3D 0 }; > + struct mlx5_flow_dv_tag_resource tag_resource; >=20 > if (priority =3D=3D MLX5_FLOW_PRIO_RSVD) > priority =3D priv->config.flow_prio - 1; @@ -2886,26 +2978,29 > @@ struct field_modify_info modify_tcp[] =3D { > case RTE_FLOW_ACTION_TYPE_VOID: > break; > case RTE_FLOW_ACTION_TYPE_FLAG: > - dev_flow->dv.actions[actions_n].type =3D > - MLX5DV_FLOW_ACTION_TAG; > - dev_flow->dv.actions[actions_n].tag_value =3D > + tag_resource.tag =3D >=20 > mlx5_flow_mark_set(MLX5_FLOW_MARK_DEFAULT); > - actions_n++; > + if (!flow->tag_resource) > + if (flow_dv_tag_resource_register > + (dev, &tag_resource, dev_flow, error)) > + return errno; > + dev_flow->dv.actions[actions_n++] =3D > + flow->tag_resource->action; > action_flags |=3D MLX5_FLOW_ACTION_FLAG; > break; > case RTE_FLOW_ACTION_TYPE_MARK: > - dev_flow->dv.actions[actions_n].type =3D > - MLX5DV_FLOW_ACTION_TAG; > - dev_flow->dv.actions[actions_n].tag_value =3D > - mlx5_flow_mark_set > - (((const struct rte_flow_action_mark *) > - (actions->conf))->id); > - actions_n++; > + tag_resource.tag =3D mlx5_flow_mark_set > + (((const struct rte_flow_action_mark *) > + (actions->conf))->id); > + if (!flow->tag_resource) > + if (flow_dv_tag_resource_register > + (dev, &tag_resource, dev_flow, error)) > + return errno; > + dev_flow->dv.actions[actions_n++] =3D > + flow->tag_resource->action; > action_flags |=3D MLX5_FLOW_ACTION_MARK; > break; > case RTE_FLOW_ACTION_TYPE_DROP: > - dev_flow->dv.actions[actions_n].type =3D > - MLX5DV_FLOW_ACTION_DROP; > action_flags |=3D MLX5_FLOW_ACTION_DROP; > break; > case RTE_FLOW_ACTION_TYPE_QUEUE: > @@ -2933,17 +3028,13 @@ struct field_modify_info modify_tcp[] =3D { > rte_errno =3D ENOTSUP; > goto cnt_err; > } > - flow->counter =3D > - flow_dv_counter_new(dev, > - count->shared, count->id); > + flow->counter =3D flow_dv_counter_new(dev, count- > >shared, > + count->id); > if (flow->counter =3D=3D NULL) > goto cnt_err; > - dev_flow->dv.actions[actions_n].type =3D > - > MLX5DV_FLOW_ACTION_COUNTER_DEVX; > - dev_flow->dv.actions[actions_n].obj =3D > - flow->counter->dcs->obj; > + dev_flow->dv.actions[actions_n++] =3D > + flow->counter->action; > action_flags |=3D MLX5_FLOW_ACTION_COUNT; > - ++actions_n; > break; > cnt_err: > if (rte_errno =3D=3D ENOTSUP) > @@ -2964,11 +3055,8 @@ struct field_modify_info modify_tcp[] =3D { > if (flow_dv_create_action_l2_encap(dev, actions, > dev_flow, error)) > return -rte_errno; > - dev_flow->dv.actions[actions_n].type =3D > - > MLX5DV_FLOW_ACTION_IBV_FLOW_ACTION; > - dev_flow->dv.actions[actions_n].action =3D > + dev_flow->dv.actions[actions_n++] =3D > dev_flow->dv.encap_decap->verbs_action; > - actions_n++; > action_flags |=3D actions->type =3D=3D >=20 > RTE_FLOW_ACTION_TYPE_VXLAN_ENCAP ? > MLX5_FLOW_ACTION_VXLAN_ENCAP > : > @@ -2979,11 +3067,8 @@ struct field_modify_info modify_tcp[] =3D { > if (flow_dv_create_action_l2_decap(dev, dev_flow, > error)) > return -rte_errno; > - dev_flow->dv.actions[actions_n].type =3D > - > MLX5DV_FLOW_ACTION_IBV_FLOW_ACTION; > - dev_flow->dv.actions[actions_n].action =3D > + dev_flow->dv.actions[actions_n++] =3D > dev_flow->dv.encap_decap->verbs_action; > - actions_n++; > action_flags |=3D actions->type =3D=3D >=20 > RTE_FLOW_ACTION_TYPE_VXLAN_DECAP ? > MLX5_FLOW_ACTION_VXLAN_DECAP > : > @@ -2995,9 +3080,7 @@ struct field_modify_info modify_tcp[] =3D { > if (flow_dv_create_action_raw_encap > (dev, actions, dev_flow, attr, error)) > return -rte_errno; > - dev_flow->dv.actions[actions_n].type =3D > - > MLX5DV_FLOW_ACTION_IBV_FLOW_ACTION; > - dev_flow->dv.actions[actions_n].action =3D > + dev_flow->dv.actions[actions_n++] =3D > dev_flow->dv.encap_decap- > >verbs_action; > } else { > /* Handle encap without preceding decap. */ > @@ -3005,12 +3088,9 @@ struct field_modify_info modify_tcp[] =3D { > dev_flow, > error)) > return -rte_errno; > - dev_flow->dv.actions[actions_n].type =3D > - > MLX5DV_FLOW_ACTION_IBV_FLOW_ACTION; > - dev_flow->dv.actions[actions_n].action =3D > + dev_flow->dv.actions[actions_n++] =3D > dev_flow->dv.encap_decap- > >verbs_action; > } > - actions_n++; > action_flags |=3D MLX5_FLOW_ACTION_RAW_ENCAP; > break; > case RTE_FLOW_ACTION_TYPE_RAW_DECAP: > @@ -3025,11 +3105,8 @@ struct field_modify_info modify_tcp[] =3D { > dev_flow, > error)) > return -rte_errno; > - dev_flow->dv.actions[actions_n].type =3D > - > MLX5DV_FLOW_ACTION_IBV_FLOW_ACTION; > - dev_flow->dv.actions[actions_n].action =3D > + dev_flow->dv.actions[actions_n++] =3D > dev_flow->dv.encap_decap- > >verbs_action; > - actions_n++; > } > /* If decap is followed by encap, handle it at encap. > */ > action_flags |=3D MLX5_FLOW_ACTION_RAW_DECAP; > @@ -3098,11 +3175,8 @@ struct field_modify_info modify_tcp[] =3D { > dev_flow, > error)) > return -rte_errno; > - dev_flow->dv.actions[actions_n].type =3D > - > MLX5DV_FLOW_ACTION_IBV_FLOW_ACTION; > - dev_flow->dv.actions[actions_n].action =3D > + dev_flow->dv.actions[actions_n++] =3D > dev_flow->dv.modify_hdr- > >verbs_action; > - actions_n++; > } > break; > default: > @@ -3277,9 +3351,9 @@ struct field_modify_info modify_tcp[] =3D { > "cannot get drop hash queue"); > goto error; > } > - dv->actions[n].type =3D > MLX5DV_FLOW_ACTION_DEST_IBV_QP; > - dv->actions[n].qp =3D dv->hrxq->qp; > - n++; > + dv->actions[n++] =3D > + mlx5_glue- > >dv_create_flow_action_dest_ibv_qp > + (dv->hrxq->qp); > } else if (flow->actions & > (MLX5_FLOW_ACTION_QUEUE | > MLX5_FLOW_ACTION_RSS)) { > struct mlx5_hrxq *hrxq; > @@ -3304,9 +3378,9 @@ struct field_modify_info modify_tcp[] =3D { > goto error; > } > dv->hrxq =3D hrxq; > - dv->actions[n].type =3D > MLX5DV_FLOW_ACTION_DEST_IBV_QP; > - dv->actions[n].qp =3D hrxq->qp; > - n++; > + dv->actions[n++] =3D > + mlx5_glue- > >dv_create_flow_action_dest_ibv_qp > + (dv->hrxq->qp); > } > dv->flow =3D > mlx5_glue->dv_create_flow(dv->matcher- > >matcher_object, > @@ -3484,6 +3558,10 @@ struct field_modify_info modify_tcp[] =3D { > flow_dv_counter_release(flow->counter); > flow->counter =3D NULL; > } > + if (flow->tag_resource) { > + flow_dv_tag_release(dev, flow->tag_resource); > + flow->tag_resource =3D NULL; > + } > while (!LIST_EMPTY(&flow->dev_flows)) { > dev_flow =3D LIST_FIRST(&flow->dev_flows); > LIST_REMOVE(dev_flow, next); > diff --git a/drivers/net/mlx5/mlx5_glue.c b/drivers/net/mlx5/mlx5_glue.c > index c817d86..cfd939d 100644 > --- a/drivers/net/mlx5/mlx5_glue.c > +++ b/drivers/net/mlx5/mlx5_glue.c > @@ -175,10 +175,20 @@ > } >=20 > static int > -mlx5_glue_destroy_flow_action(struct ibv_flow_action *action) > +mlx5_glue_destroy_flow_action(void *action) > { > #ifdef HAVE_IBV_FLOW_DV_SUPPORT > - return ibv_destroy_flow_action(action); > + struct mlx5dv_flow_action_attr *attr =3D action; > + int res =3D 0; > + switch (attr->type) { > + case MLX5DV_FLOW_ACTION_TAG: > + break; > + default: > + res =3D ibv_destroy_flow_action(attr->action); > + break; > + } > + free(action); > + return res; > #else > (void)action; > return ENOTSUP; > @@ -430,16 +440,23 @@ > mlx5_glue_dv_create_flow(struct mlx5dv_flow_matcher *matcher, > struct mlx5dv_flow_match_parameters > *match_value, > size_t num_actions, > - struct mlx5dv_flow_action_attr *actions_attr) > + void *actions[]) > { > #ifdef HAVE_IBV_FLOW_DV_SUPPORT > + struct mlx5dv_flow_action_attr actions_attr[8]; > + > + if (num_actions > 8) > + return NULL; > + for (size_t i =3D 0; i < num_actions; i++) > + actions_attr[i] =3D > + *((struct mlx5dv_flow_action_attr *)(actions[i])); > return mlx5dv_create_flow(matcher, match_value, > num_actions, actions_attr); > #else > (void)matcher; > (void)match_value; > (void)num_actions; > - (void)actions_attr; > + (void)actions; > return NULL; > #endif > } > @@ -455,31 +472,45 @@ > #endif > } >=20 > -static struct ibv_flow_action * > -mlx5_glue_dv_create_flow_action_packet_reformat > - (struct ibv_context *ctx, > - size_t data_sz, > - void *data, > - enum mlx5dv_flow_action_packet_reformat_type > reformat_type, > - enum mlx5dv_flow_table_type ft_type) > +static void * > +mlx5_glue_dv_create_flow_action_counter(void *counter_obj, uint32_t > +offset) > { > #ifdef HAVE_IBV_FLOW_DV_SUPPORT > - return mlx5dv_create_flow_action_packet_reformat(ctx, > - data_sz, > - data, > - reformat_type, > - ft_type); > + struct mlx5dv_flow_action_attr *action; > + > + (void)offset; > + action =3D malloc(sizeof(*action)); > + if (!action) > + return NULL; > + action->type =3D MLX5DV_FLOW_ACTION_COUNTER_DEVX; > + action->obj =3D counter_obj; > + return action; > #else > - (void)ctx; > - (void)data_sz; > - (void)data; > - (void)reformat_type; > - (void)ft_type; > + (void)counter_obj; > + (void)offset; > return NULL; > #endif > } >=20 > -static struct ibv_flow_action * > +static void * > +mlx5_glue_dv_create_flow_action_dest_ibv_qp(void *qp) { #ifdef > +HAVE_IBV_FLOW_DV_SUPPORT > + struct mlx5dv_flow_action_attr *action; > + > + action =3D malloc(sizeof(*action)); > + if (!action) > + return NULL; > + action->type =3D MLX5DV_FLOW_ACTION_DEST_IBV_QP; > + action->obj =3D qp; > + return action; > +#else > + (void)qp; > + return NULL; > +#endif > +} > + > +static void * > mlx5_glue_dv_create_flow_action_modify_header > (struct ibv_context *ctx, > size_t actions_sz, > @@ -487,8 +518,15 @@ > enum mlx5dv_flow_table_type > ft_type) { #ifdef HAVE_IBV_FLOW_DV_SUPPORT > - return mlx5dv_create_flow_action_modify_header(ctx, actions_sz, > - actions, ft_type); > + struct mlx5dv_flow_action_attr *action; > + > + action =3D malloc(sizeof(*action)); > + if (!action) > + return NULL; > + action->type =3D MLX5DV_FLOW_ACTION_IBV_FLOW_ACTION; > + action->action =3D mlx5dv_create_flow_action_modify_header > + (ctx, actions_sz, actions, ft_type); > + return action; > #else > (void)ctx; > (void)actions_sz; > @@ -498,6 +536,50 @@ > #endif > } >=20 > +static void * > +mlx5_glue_dv_create_flow_action_packet_reformat > + (struct ibv_context *ctx, > + size_t data_sz, > + void *data, > + enum mlx5dv_flow_action_packet_reformat_type > reformat_type, > + enum mlx5dv_flow_table_type ft_type) { #ifdef > +HAVE_IBV_FLOW_DV_SUPPORT > + struct mlx5dv_flow_action_attr *action; > + > + action =3D malloc(sizeof(*action)); > + if (!action) > + return NULL; > + action->type =3D MLX5DV_FLOW_ACTION_IBV_FLOW_ACTION; > + action->action =3D mlx5dv_create_flow_action_packet_reformat > + (ctx, data_sz, data, reformat_type, ft_type); > + return action; > +#else > + (void)ctx; > + (void)data_sz; > + (void)data; > + (void)reformat_type; > + (void)ft_type; > + return NULL; > +#endif > +} > + > +static void * > +mlx5_glue_dv_create_flow_action_tag(uint32_t tag) { #ifdef > +HAVE_IBV_FLOW_DV_SUPPORT > + struct mlx5dv_flow_action_attr *action; > + action =3D malloc(sizeof(*action)); > + if (!action) > + return NULL; > + action->type =3D MLX5DV_FLOW_ACTION_TAG; > + action->tag_value =3D tag; > + return action; > +#endif > + (void)tag; > + return NULL; > +} > + > static struct ibv_context * > mlx5_glue_dv_open_device(struct ibv_device *device) { @@ -645,10 > +727,15 @@ > .dv_create_flow_matcher =3D mlx5_glue_dv_create_flow_matcher, > .dv_destroy_flow_matcher =3D mlx5_glue_dv_destroy_flow_matcher, > .dv_create_flow =3D mlx5_glue_dv_create_flow, > - .dv_create_flow_action_packet_reformat =3D > - mlx5_glue_dv_create_flow_action_packet_reformat, > + .dv_create_flow_action_counter =3D > + mlx5_glue_dv_create_flow_action_counter, > + .dv_create_flow_action_dest_ibv_qp =3D > + mlx5_glue_dv_create_flow_action_dest_ibv_qp, > .dv_create_flow_action_modify_header =3D > - mlx5_glue_dv_create_flow_action_modify_header, > + mlx5_glue_dv_create_flow_action_modify_header, > + .dv_create_flow_action_packet_reformat =3D > + mlx5_glue_dv_create_flow_action_packet_reformat, > + .dv_create_flow_action_tag =3D > mlx5_glue_dv_create_flow_action_tag, > .dv_open_device =3D mlx5_glue_dv_open_device, > .devx_obj_create =3D mlx5_glue_devx_obj_create, > .devx_obj_destroy =3D mlx5_glue_devx_obj_destroy, diff --git > a/drivers/net/mlx5/mlx5_glue.h b/drivers/net/mlx5/mlx5_glue.h index > b118960..167f1f7 100644 > --- a/drivers/net/mlx5/mlx5_glue.h > +++ b/drivers/net/mlx5/mlx5_glue.h > @@ -55,6 +55,10 @@ > enum mlx5dv_flow_table_type { flow_table_type =3D 0, }; #endif >=20 > +#ifndef HAVE_IBV_FLOW_DEVX_COUNTERS > +#define MLX5DV_FLOW_ACTION_COUNTER_DEVX 0 #endif > + > #ifndef HAVE_IBV_DEVX_OBJ > struct mlx5dv_devx_obj; > #endif > @@ -98,7 +102,7 @@ struct mlx5_glue { > struct ibv_flow *(*create_flow)(struct ibv_qp *qp, > struct ibv_flow_attr *flow); > int (*destroy_flow)(struct ibv_flow *flow_id); > - int (*destroy_flow_action)(struct ibv_flow_action *action); > + int (*destroy_flow_action)(void *action); > struct ibv_qp *(*create_qp)(struct ibv_pd *pd, > struct ibv_qp_init_attr *qp_init_attr); > struct ibv_qp *(*create_qp_ex) > @@ -160,19 +164,17 @@ struct mlx5_glue { > int (*dv_destroy_flow_matcher)(struct mlx5dv_flow_matcher > *matcher); > struct ibv_flow *(*dv_create_flow)(struct mlx5dv_flow_matcher > *matcher, > struct mlx5dv_flow_match_parameters > *match_value, > - size_t num_actions, > - struct mlx5dv_flow_action_attr *actions_attr); > - struct ibv_flow_action *(*dv_create_flow_action_packet_reformat) > - (struct ibv_context *ctx, > - size_t data_sz, > - void *data, > + size_t num_actions, void *actions[]); > + void *(*dv_create_flow_action_counter)(void *obj, uint32_t offset); > + void *(*dv_create_flow_action_dest_ibv_qp)(void *qp); > + void *(*dv_create_flow_action_modify_header) > + (struct ibv_context *ctx, size_t actions_sz, uint64_t actions[], > + enum mlx5dv_flow_table_type ft_type); > + void *(*dv_create_flow_action_packet_reformat) > + (struct ibv_context *ctx, size_t data_sz, void *data, > enum mlx5dv_flow_action_packet_reformat_type > reformat_type, > enum mlx5dv_flow_table_type ft_type); > - struct ibv_flow_action *(*dv_create_flow_action_modify_header) > - (struct ibv_context *ctx, > - size_t actions_sz, > - uint64_t actions[], > - enum mlx5dv_flow_table_type > ft_type); > + void *(*dv_create_flow_action_tag)(uint32_t tag); > struct ibv_context *(*dv_open_device)(struct ibv_device *device); > struct mlx5dv_devx_obj *(*devx_obj_create) > (struct ibv_context *ctx, > -- > 1.8.3.1