From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR04-VI1-obe.outbound.protection.outlook.com (mail-eopbgr80042.outbound.protection.outlook.com [40.107.8.42]) by dpdk.org (Postfix) with ESMTP id 064CF1B552 for ; Tue, 9 Oct 2018 15:45:14 +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=Gwo1vSwh4Tsq6HbmsccuI1Ys6pWvNiJ2kvyuhjW8QS0=; b=ZLdqTP7qA+24UUD5tKTqtSY1bw1RqBgfuyKG1TyNu+FLFsrinciiDP2w19Vf0jCBY3Tr6kcxmkfXPUzzJf//TDEbnQUvTBO36TlWsSeV4gyHWAD+IH5BSNXvycx7ZvR6q9PfMbYELiG0mb5ztSdwKSn8xlXPmO8I8xe8GureXgM= Received: from VI1PR05MB4431.eurprd05.prod.outlook.com (52.133.13.26) by VI1PR05MB5087.eurprd05.prod.outlook.com (20.177.52.88) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1207.21; Tue, 9 Oct 2018 13:45:13 +0000 Received: from VI1PR05MB4431.eurprd05.prod.outlook.com ([fe80::80:564f:9ae9:ed9]) by VI1PR05MB4431.eurprd05.prod.outlook.com ([fe80::80:564f:9ae9:ed9%2]) with mapi id 15.20.1207.024; Tue, 9 Oct 2018 13:45:13 +0000 From: Shahaf Shuler To: Yongseok Koh , Slava Ovsiienko CC: "dev@dpdk.org" Thread-Topic: [dpdk-dev] [PATCH] net/mlx5: flow counters support on the Linux-rdma v19 base Thread-Index: AQHUWy3WSyEABNWoG0uRjf7PlVeGG6UOMMIAgAi9YpA= Date: Tue, 9 Oct 2018 13:45:13 +0000 Message-ID: References: <1534772079-6514-1-git-send-email-viacheslavo@mellanox.com> <1538580540-2224-1-git-send-email-viacheslavo@mellanox.com> <20181003234810.GH26206@mtidpdk.mti.labs.mlnx> In-Reply-To: <20181003234810.GH26206@mtidpdk.mti.labs.mlnx> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: spf=none (sender IP is ) smtp.mailfrom=shahafs@mellanox.com; x-originating-ip: [193.47.165.251] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1; VI1PR05MB5087; 6:j8+ACDfnMx3OY0ljO20f+yDvZ+d9BNKFIvUO8chWYag+ZCf60RT2M3bkyb91Szsllh7m0Kt9hrt4p2qiBrxeeSh3RTe+JsZdWtPwoh/YwQkK61Swme9tUJuZfoup2fTYEd0VZ3Be6kz/QBrwwS9UN6mhpj0cGd6Bk8BUBdF+XzbNg2fPkatdCz8gwp0UZ90xsqFOXAIrKGMcgfHwdSZhYeiQHjFwBL8yjF3c4vCqkzjfhRSTCokWQsoLluGNyWzKghsFDZkEdw9LJU9lyB3yx8d+kjsw3T/WPPlUgEkkNNi0fntLeQQNhV3ymc3Pd4/ZjlRN59xn9jBpAERzwbkfIUSgr6dQB7C/s7HeVmn7EuibniEGyr9sFTid/5MsHyU/JpK6plIp4qPBpYY6WNtV55pWHkUgwwOjzocB8al6pPvQ9AMsfmI4neWbHFtZDWkMice4SFauhcGIBQAwUrACJg==; 5:5LnjeyvEVeKTvSJ4bixiJWhaVlkgS/bt4Y77EuYmKQkAsiK10QQQHhFY3sk2jRn1yEWdF6vuNUTdGkuESJsLoYd5d1zl7HCgC9sRkrW1FgbdyB8iynoHqm1t51HyCCCftL2l9AP8BTL4QIwgXCTg2hHrs7TlP9+nnSLFxMdTvDk=; 7:Rk47Tec47ioDTv4nbMhEGW3wvnd0QkB/rLs4k9IwOn/SwUhG80ZHFHtkjfbmnvDce9/hgpMGaN2vQ6PZ+MNJ2TqwVeeG9ZC+wOXIZldqOQP/vEnKxJ7k4xvwtK7uGTaRFeMiHfLZTXHn+INWWpQBcKLYRj2eYj3ZTyyw05JoBamep2M1MHibng/nVNVdGm0kAYEbrHcE07ZNUkJW0Q53pNn0NY0acWYjxHL5QTs2MLO8kf95WPRwJh/ypyYRrsSn x-ms-exchange-antispam-srfa-diagnostics: SOS; x-ms-office365-filtering-correlation-id: 5cb50c48-b2ab-41d2-99b5-08d62ded7078 x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: BCL:0; PCL:0; RULEID:(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600074)(711020)(4618075)(2017052603328)(7153060)(7193020); SRVR:VI1PR05MB5087; x-ms-traffictypediagnostic: VI1PR05MB5087: x-microsoft-antispam-prvs: x-exchange-antispam-report-test: UriScan:(17755550239193); x-ms-exchange-senderadcheck: 1 x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(5005006)(8121501046)(10201501046)(3231355)(944501410)(52105095)(93006095)(93001095)(3002001)(6055026)(149066)(150057)(6041310)(20161123558120)(20161123562045)(20161123564045)(20161123560045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(201708071742011)(7699051); SRVR:VI1PR05MB5087; BCL:0; PCL:0; RULEID:; SRVR:VI1PR05MB5087; x-forefront-prvs: 08200063E9 x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(396003)(366004)(376002)(346002)(39860400002)(136003)(199004)(189003)(6506007)(6116002)(81156014)(81166006)(3846002)(14444005)(256004)(8676002)(26005)(229853002)(186003)(8936002)(5250100002)(68736007)(97736004)(486006)(476003)(6636002)(2900100001)(5660300001)(446003)(478600001)(11346002)(4326008)(5024004)(25786009)(105586002)(106356001)(14454004)(305945005)(7736002)(74316002)(102836004)(33656002)(316002)(86362001)(6436002)(110136005)(55016002)(2906002)(99286004)(4744004)(76176011)(66066001)(53936002)(7696005)(9686003)(71190400001)(6246003)(71200400001)(309714004); DIR:OUT; SFP:1101; SCL:1; SRVR:VI1PR05MB5087; H:VI1PR05MB4431.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-microsoft-antispam-message-info: h6tohyRgRNBBiiw6lRzLpxuCwOaKSLlfuQT/9H3PZGgYAZiTxuS3ubqo8BSV7TRoKHJmQ5O37tRq8iU2aYHO4Y2gbRE16/Hi+/tztMMxa+kOvdHZEgazKqlpsgEIFKKULUlb4Cl81giIyjEiiOpGegkE85xbUrGEj/Y6JRlz7LJOybPry2PVbS/7BiY/nuWZLxnD6QjbO5ORC3gu+44j2I90D0lm3x6+axegKs0DCZa2yNQs9RQiPZsm3jY+cgOGbgWjeOd7sxeua7/JZ1V/gX7u1ib5QVw49uoJRxePdUulaHdIJFGMiu8+jqz6bg7q8Tl7X0ulEwBVsqsNFFKcZshhpoIIIBa67jGRVSZHsg4= spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginatorOrg: Mellanox.com X-MS-Exchange-CrossTenant-Network-Message-Id: 5cb50c48-b2ab-41d2-99b5-08d62ded7078 X-MS-Exchange-CrossTenant-originalarrivaltime: 09 Oct 2018 13:45:13.5861 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: a652971c-7d2e-4d9b-a6a4-d149256f461b X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR05MB5087 Subject: Re: [dpdk-dev] [PATCH] net/mlx5: flow counters support on the Linux-rdma v19 base 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: , X-List-Received-Date: Tue, 09 Oct 2018 13:45:15 -0000 Hi Slava, Adding some more comments, Thursday, October 4, 2018 2:48 AM, Yongseok Koh: > Subject: Re: [dpdk-dev] [PATCH] net/mlx5: flow counters support on the > Linux-rdma v19 base >=20 > On Wed, Oct 03, 2018 at 03:29:12PM +0000, Slava Ovsiienko wrote: > > Mellanox mlx5 PMD supports Flow Counters via Verbs library. > > The current implementation is based on the Mellanox proprietary Verbs > > library included in MLNX OFED packages. The Flow Counter support is > > recently added into linux-rdma release (v19), so the mlx5 PMD update > > is needed to provide Counter feature on the base of linux-rdma. > > > > mlx5 PMD can be compiled with MLNX OFED or linux-rdma v19+ and > provide > > flow counters for both. > > > > Signed-off-by: Viacheslav Ovsiienko > > --- > > drivers/net/mlx5/Makefile | 10 ++++++++ > > drivers/net/mlx5/mlx5.c | 6 +++++ > > drivers/net/mlx5/mlx5_flow.c | 9 ++++++- > > drivers/net/mlx5/mlx5_flow.h | 4 +++ > > drivers/net/mlx5/mlx5_flow_verbs.c | 52 > ++++++++++++++++++++++++++++++-------- > > drivers/net/mlx5/mlx5_glue.c | 41 > ++++++++++++++++++++++++++++++ > > drivers/net/mlx5/mlx5_glue.h | 16 ++++++++++++ > > 7 files changed, 127 insertions(+), 11 deletions(-) > > > > diff --git a/drivers/net/mlx5/Makefile b/drivers/net/mlx5/Makefile > > index ca1de9f..e3d2156 100644 > > --- a/drivers/net/mlx5/Makefile > > +++ b/drivers/net/mlx5/Makefile > > @@ -162,6 +162,16 @@ mlx5_autoconf.h.new: > $(RTE_SDK)/buildtools/auto-config-h.sh > > type 'struct ibv_counter_set_init_attr' \ > > $(AUTOCONF_OUTPUT) > > $Q sh -- '$<' '$@' \ > > + HAVE_IBV_DEVICE_COUNTERS_SET_SUPPORT \ > > + infiniband/verbs.h \ > > + type 'struct ibv_counters_init_attr' \ > > + $(AUTOCONF_OUTPUT) > > + $Q sh -- '$<' '$@' \ > > + HAVE_IBV_DEVICE_COUNTERS_SET_SUPPORT_V45 \ > > + infiniband/verbs.h \ > > + type 'struct ibv_counters_init_attr' \ > > + $(AUTOCONF_OUTPUT) > > + $Q sh -- '$<' '$@' \ >=20 > I still don't understand what is different between the two. These are exa= ctly > same checking, then why do you need to have two different macros? From > this script, HAVE_IBV_DEVICE_COUNTERS_SET_SUPPORT is same as > HAVE_IBV_DEVICE_COUNTERS_SET_SUPPORT_V45, isn't it? >=20 > And if you make some changes in Makefile, you should also make > corresponding changes for the meson build. >=20 > > HAVE_RDMA_NL_NLDEV \ > > rdma/rdma_netlink.h \ > > enum RDMA_NL_NLDEV \ > > diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c index > > 4be6a1c..81f6ba1 100644 > > --- a/drivers/net/mlx5/mlx5.c > > +++ b/drivers/net/mlx5/mlx5.c > > @@ -739,8 +739,10 @@ > > unsigned int mprq_min_stride_num_n =3D 0; > > unsigned int mprq_max_stride_num_n =3D 0; #ifdef > > HAVE_IBV_DEVICE_COUNTERS_SET_SUPPORT > > +#ifndef HAVE_IBV_DEVICE_COUNTERS_SET_SUPPORT_V45 Is there really a rdma-core version on which both types of counters exists = together?=20 > > struct ibv_counter_set_description cs_desc =3D { .counter_type =3D 0 = }; > > #endif > > +#endif > > struct ether_addr mac; > > char name[RTE_ETH_NAME_MAX_LEN]; > > int own_domain_id =3D 0; > > @@ -1009,11 +1011,15 @@ > > DRV_LOG(DEBUG, "checksum offloading is %ssupported", > > (config.hw_csum ? "" : "not ")); > > #ifdef HAVE_IBV_DEVICE_COUNTERS_SET_SUPPORT > > +#ifndef HAVE_IBV_DEVICE_COUNTERS_SET_SUPPORT_V45 > > config.flow_counter_en =3D !!attr.max_counter_sets; > > mlx5_glue->describe_counter_set(ctx, 0, &cs_desc); > > DRV_LOG(DEBUG, "counter type =3D %d, num of cs =3D %ld, attributes = =3D > %d", > > cs_desc.counter_type, cs_desc.num_of_cs, > > cs_desc.attributes); > > +#else > > + config.flow_counter_en =3D 1; > > +#endif > > #endif > > config.ind_table_max_size =3D > > attr.rss_caps.max_rwq_indirection_table_size; > > diff --git a/drivers/net/mlx5/mlx5_flow.c > > b/drivers/net/mlx5/mlx5_flow.c index 8007bf1..652580c 100644 > > --- a/drivers/net/mlx5/mlx5_flow.c > > +++ b/drivers/net/mlx5/mlx5_flow.c > > @@ -2306,6 +2306,13 @@ struct rte_flow * > > if (flow->actions & MLX5_ACTION_COUNT) { > > struct rte_flow_query_count *qc =3D data; > > uint64_t counters[2] =3D {0, 0}; > > +#ifdef HAVE_IBV_DEVICE_COUNTERS_SET_SUPPORT_V45 > > + int err =3D mlx5_glue->query_counter_set( > > + flow->counter->cs, > > + counters, > > + RTE_DIM(counters), > > + > IBV_READ_COUNTERS_ATTR_PREFER_CACHED); > > +#else This part is under #ifdef HAVE_IBV_DEVICE_COUNTERS_SET_SUPPORT. So on rdma-= core versions were the "old" counters are not supported anymore this code w= il never be reached.=20 > > struct ibv_query_counter_set_attr query_cs_attr =3D { > > .cs =3D flow->counter->cs, > > .query_flags =3D IBV_COUNTER_SET_FORCE_UPDATE, > @@ -2316,7 +2323,7 @@ > > struct rte_flow * > > }; > > int err =3D mlx5_glue->query_counter_set(&query_cs_attr, > > &query_out); > > - > > +#endif > > if (err) > > return rte_flow_error_set > > (error, err, > > diff --git a/drivers/net/mlx5/mlx5_flow.h > > b/drivers/net/mlx5/mlx5_flow.h index 10d700a..a3b82dd 100644 > > --- a/drivers/net/mlx5/mlx5_flow.h > > +++ b/drivers/net/mlx5/mlx5_flow.h > > @@ -222,7 +222,11 @@ struct mlx5_flow_counter { > > uint32_t shared:1; /**< Share counter ID with other flow rules. */ > > uint32_t ref_cnt:31; /**< Reference counter. */ > > uint32_t id; /**< Counter ID. */ > > +#ifdef HAVE_IBV_DEVICE_COUNTERS_SET_SUPPORT_V45 > > + struct ibv_counters *cs; /**< Holds the counters for the rule. */ > > +#else > > struct ibv_counter_set *cs; /**< Holds the counters for the rule. */ > > +#endif > > uint64_t hits; /**< Number of packets matched by the rule. */ > > uint64_t bytes; /**< Number of bytes matched by the rule. */ }; > > diff --git a/drivers/net/mlx5/mlx5_flow_verbs.c > > b/drivers/net/mlx5/mlx5_flow_verbs.c > > index 05ab5fd..1c8bdba 100644 > > --- a/drivers/net/mlx5/mlx5_flow_verbs.c > > +++ b/drivers/net/mlx5/mlx5_flow_verbs.c > > @@ -48,27 +48,32 @@ > > static struct mlx5_flow_counter * > > flow_verbs_counter_new(struct rte_eth_dev *dev, uint32_t shared, > > uint32_t id) { > > +#ifdef HAVE_IBV_DEVICE_COUNTERS_SET_SUPPORT I don't understand why you choose to move the ifdef.=20 > > struct priv *priv =3D dev->data->dev_private; > > struct mlx5_flow_counter *cnt; > > > > - LIST_FOREACH(cnt, &priv->flow_counters, next) { > > - if (!cnt->shared || cnt->shared !=3D shared) > > - continue; > > - if (cnt->id !=3D id) > > - continue; > > - cnt->ref_cnt++; > > - return cnt; > > + if (shared) { > > + LIST_FOREACH(cnt, &priv->flow_counters, next) > > + if (cnt->shared && cnt->id =3D=3D id) { > > + cnt->ref_cnt++; > > + return cnt; > > + } Nor this code. Is it related to the support patch or you are fixing bug on = the way. If bug fix it deserve a separate commit.=20 > > } > > -#ifdef HAVE_IBV_DEVICE_COUNTERS_SET_SUPPORT > > > > struct mlx5_flow_counter tmpl =3D { > > .shared =3D shared, > > .id =3D id, > > +#ifdef HAVE_IBV_DEVICE_COUNTERS_SET_SUPPORT_V45 Same - you will never reach this code if the old flow count is not supporte= d on the underlying rdma-core version.=20 > > + .cs =3D mlx5_glue->create_counter_set > > + (priv->ctx, > > + &(struct ibv_counters_init_attr){0}), #else > > .cs =3D mlx5_glue->create_counter_set > > (priv->ctx, > > &(struct ibv_counter_set_init_attr){ > > .counter_set_id =3D id, > > }), Here from the old counters perspective the counter is created... > > +#endif > > .hits =3D 0, > > .bytes =3D 0, > > }; > > @@ -77,17 +82,40 @@ > > rte_errno =3D errno; > > return NULL; > > } > > + > > +#ifdef HAVE_IBV_DEVICE_COUNTERS_SET_SUPPORT_V45 > > + struct ibv_counter_attach_attr attach_attr =3D {0}; > > + int ret; > > + > > + attach_attr.counter_desc =3D IBV_COUNTER_PACKETS; > > + attach_attr.index =3D 0; > > + ret =3D ibv_attach_counters_point_flow(tmpl.cs, &attach_attr, NULL); > > + if (!ret) { > > + attach_attr.counter_desc =3D IBV_COUNTER_BYTES; > > + attach_attr.index =3D 1; > > + ret =3D ibv_attach_counters_point_flow(tmpl.cs, > > + &attach_attr, > > + NULL); Here it is the end of the counter creation on the new API. My suggestion is= to have a single ifdef which create the new/old counter (and not two).=20 > > + } > > + if (ret) { > > + claim_zero(mlx5_glue->destroy_counter_set(tmpl.cs)); > > + rte_errno =3D ret; > > + return NULL; > > + } > > +#endif > > cnt =3D rte_calloc(__func__, 1, sizeof(*cnt), 0); > > if (!cnt) { > > + claim_zero(mlx5_glue->destroy_counter_set(tmpl.cs)); Another bug fix?=20 > > rte_errno =3D ENOMEM; > > return NULL; > > } > > *cnt =3D tmpl; > > LIST_INSERT_HEAD(&priv->flow_counters, cnt, next); > > return cnt; > > -#endif > > +#else > > rte_errno =3D ENOTSUP; > > return NULL; > > +#endif > > } > > > > /** > > @@ -947,7 +975,7 @@ > > flow->counter =3D flow_verbs_counter_new(dev, count- > >shared, > > count->id); > > if (!flow->counter) > > - return rte_flow_error_set(error, ENOTSUP, > > + return rte_flow_error_set(error, rte_errno, > > > RTE_FLOW_ERROR_TYPE_ACTION, > > action, > > "cannot get counter" > > @@ -955,7 +983,11 @@ > > } > > *action_flags |=3D MLX5_ACTION_COUNT; > > #ifdef HAVE_IBV_DEVICE_COUNTERS_SET_SUPPORT > > +#ifdef HAVE_IBV_DEVICE_COUNTERS_SET_SUPPORT_V45 Same comment about the code never reached.=20 > > + counter.counters =3D flow->counter->cs; #else > > counter.counter_set_handle =3D flow->counter->cs->handle; > > +#endif > > flow_verbs_spec_add(dev_flow, &counter, size); #endif > > return 0; > > diff --git a/drivers/net/mlx5/mlx5_glue.c > > b/drivers/net/mlx5/mlx5_glue.c index 48590df..785234c 100644 > > --- a/drivers/net/mlx5/mlx5_glue.c > > +++ b/drivers/net/mlx5/mlx5_glue.c > > @@ -211,6 +211,39 @@ > > return ibv_dereg_mr(mr); > > } > > > > +#ifdef HAVE_IBV_DEVICE_COUNTERS_SET_SUPPORT_V45 > > +static struct ibv_counters * > > +mlx5_glue_create_counters(struct ibv_context *context, > > + struct ibv_counters_init_attr *init_attr) { > > + return ibv_create_counters(context, init_attr); } > > + > > +static int > > +mlx5_glue_destroy_counters(struct ibv_counters *counters) { > > + return ibv_destroy_counters(counters); } > > + > > +static int > > +mlx5_glue_attach_counters(struct ibv_counters *counters, > > + struct ibv_counter_attach_attr *attr, > > + struct ibv_flow *flow) > > +{ > > + return ibv_attach_counters_point_flow(counters, attr, flow); } > > + > > +static int > > +mlx5_glue_query_counters(struct ibv_counters *counters, > > + uint64_t *counters_value, > > + uint32_t ncounters, > > + uint32_t flags) > > +{ > > + return ibv_read_counters(counters, counters_value, ncounters, > > +flags); } #endif > > + > > +#ifndef HAVE_IBV_DEVICE_COUNTERS_SET_SUPPORT_V45 > > static struct ibv_counter_set * > > mlx5_glue_create_counter_set(struct ibv_context *context, > > struct ibv_counter_set_init_attr *init_attr) @@ - > 262,6 +295,7 > > @@ > > return ibv_query_counter_set(query_attr, cs_data); #endif } > > +#endif > > > > static void > > mlx5_glue_ack_async_event(struct ibv_async_event *event) @@ -420,10 > > +454,17 @@ > > .modify_qp =3D mlx5_glue_modify_qp, > > .reg_mr =3D mlx5_glue_reg_mr, > > .dereg_mr =3D mlx5_glue_dereg_mr, > > +#ifdef HAVE_IBV_DEVICE_COUNTERS_SET_SUPPORT_V45 > > + .create_counter_set =3D mlx5_glue_create_counters, > > + .destroy_counter_set =3D mlx5_glue_destroy_counters, > > + .attach_counter_set =3D mlx5_glue_attach_counters, > > + .query_counter_set =3D mlx5_glue_query_counters, #else > > .create_counter_set =3D mlx5_glue_create_counter_set, > > .destroy_counter_set =3D mlx5_glue_destroy_counter_set, > > .describe_counter_set =3D mlx5_glue_describe_counter_set, > > .query_counter_set =3D mlx5_glue_query_counter_set, > > +#endif > > .ack_async_event =3D mlx5_glue_ack_async_event, > > .get_async_event =3D mlx5_glue_get_async_event, > > .port_state_str =3D mlx5_glue_port_state_str, diff --git > > a/drivers/net/mlx5/mlx5_glue.h b/drivers/net/mlx5/mlx5_glue.h index > > f6e4e38..504d487 100644 > > --- a/drivers/net/mlx5/mlx5_glue.h > > +++ b/drivers/net/mlx5/mlx5_glue.h > > @@ -96,6 +96,21 @@ struct mlx5_glue { > > struct ibv_mr *(*reg_mr)(struct ibv_pd *pd, void *addr, > > size_t length, int access); > > int (*dereg_mr)(struct ibv_mr *mr); > > +#ifdef HAVE_IBV_DEVICE_COUNTERS_SET_SUPPORT_V45 > > + struct ibv_counters *(*create_counter_set) > > + (struct ibv_context *context, > > + struct ibv_counters_init_attr *init_attr); > > + int (*destroy_counter_set)(struct ibv_counters *cs); > > + int (*attach_counter_set) > > + (struct ibv_counters *cs, > > + struct ibv_counter_attach_attr *attr, > > + struct ibv_flow *flow); > > + int (*query_counter_set) > > + (struct ibv_counters *cs, > > + uint64_t *counters_value, > > + uint32_t ncounters, > > + uint32_t flags); > > +#else > > struct ibv_counter_set *(*create_counter_set) > > (struct ibv_context *context, > > struct ibv_counter_set_init_attr *init_attr); @@ -106,6 > +121,7 @@ > > struct mlx5_glue { > > struct ibv_counter_set_description *cs_desc); > > int (*query_counter_set)(struct ibv_query_counter_set_attr > *query_attr, > > struct ibv_counter_set_data *cs_data); > > +#endif Pay attention to how the old counter supported was added to the mlx5_glue l= ib. There are no ifdefs of the function pointer declaration nor on the function= declaration. This was because it was causing link issues between this lib = to verbs.=20 Same should be for the new counters. Need to declare all needed structs if = not declared on the mlx5_glue.h file, and always the function pointer and t= he declaration.=20 The ifdef is only inside the function implementation.=20 > > void (*ack_async_event)(struct ibv_async_event *event); > > int (*get_async_event)(struct ibv_context *context, > > struct ibv_async_event *event); > > -- > > 1.8.3.1 > >