From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id E5D4242A95; Mon, 8 May 2023 08:23:36 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id A01D8410D0; Mon, 8 May 2023 08:23:35 +0200 (CEST) Received: from mail-vk1-f179.google.com (mail-vk1-f179.google.com [209.85.221.179]) by mails.dpdk.org (Postfix) with ESMTP id 7715D40DDC for ; Mon, 8 May 2023 08:23:34 +0200 (CEST) Received: by mail-vk1-f179.google.com with SMTP id 71dfb90a1353d-44ffef66dabso2170711e0c.2 for ; Sun, 07 May 2023 23:23:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1683527014; x=1686119014; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=Qu5AedoZRhIWS7d4oG8ZDvpAjyu+oNRTUQ0i6lNSHtQ=; b=5Cncn6vZropHQoGy+UOFR6jKbcSHPubYivR6kVA3OOEKHhHMb2G3HEG7VJeNqY0usB HXQyei52eW2lC7hI3XpWUBufwKZoN/Ya4UfOkmKGIOrJE2ybGiMyci37o8jk9XxoFqst YI5y2yO4U5/x1pF1v1ZzQMdRBgQcbipM8eAVnF4N+BC444LKkszx9nyx7Uq7O5cFsodg UMBon1BQNEneB4rX/578IBo4Wz59BAoyluPvGqNW4BbDx2Gimv6feL6nvrmat/AxDhuT sHftHHQq6hhHLFZB+S8Og9QtoaRpDtZo6f/GNBvYjsWmeh7cu0bEAn8+Y9va2Y5msKje URPw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1683527014; x=1686119014; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Qu5AedoZRhIWS7d4oG8ZDvpAjyu+oNRTUQ0i6lNSHtQ=; b=IP0Y2/+d2keeD9kr6Po54m0CtfM9d7EDSv80uuE6/X0ke+jwYtiFbrvjSPyWMZr1Hc NYundPydHDi+PjD0cvnFxg/nU/BrNblMF9DxFUWSZfosO8ejYWp9b9R0oscUpaMG+W0+ oVZT4B6+pFccYxC5E/XAb/oMA11OMACNX9SsmFCBJcYpD5YjGD2ahMxASvGEEATpq6cR FETf0NYH2pjMlx1ldvXKmUJ8BgYp2JulX3Aa1G8+eQVnUNjLcwuE2PTcca8lwINKwoXs pUlc7fbOIRqHOhP2MEdASJoDbzQYRp0i9tohtOCwVh735O+FY3bspcdDyJPxxzuZqTT2 uTWQ== X-Gm-Message-State: AC+VfDzEGvMpmfBZsRO14DSrP+ot7CT6nxxXF1fpamHP/crDB6e9JUmy zHa3wEormUOI0LPqg6UK6bTrDOI2dvgwQluLomMKZQ== X-Google-Smtp-Source: ACHHUZ7XD9jDD+ytZdkkYACl0fo7D2Acro7GMHUuTiNqaHQDjvyEfdz4Y9ZvipaNzo6qGOdGkUvBY/zsLcqYVqIvDT8= X-Received: by 2002:a1f:418a:0:b0:451:df12:177a with SMTP id o132-20020a1f418a000000b00451df12177amr1639733vka.14.1683527013536; Sun, 07 May 2023 23:23:33 -0700 (PDT) MIME-Version: 1.0 References: <20230414051454.1245936-1-rushilg@google.com> <20230426213700.2668699-1-rushilg@google.com> In-Reply-To: From: Rushil Gupta Date: Sun, 7 May 2023 23:23:22 -0700 Message-ID: Subject: Re: [PATCH] net/gve: Check whether the driver is compatible with the device presented. To: Ferruh Yigit Cc: qi.z.zhang@intel.com, jingjing.wu@intel.com, junfeng.guo@intel.com, joshwash@google.com, dev@dpdk.org, Jeroen de Borst Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Thanks for reviewing Ferruh Yigit! I wanted to answer your queries before sending the next patch. Please find answers below: On Thu, May 4, 2023 at 8:06=E2=80=AFAM Ferruh Yigit = wrote: > > On 4/26/2023 10:37 PM, Rushil Gupta wrote: > > Change gve_driver_info fields to report DPDK as OS type and DPDK RTE > > version as OS version, reserving driver_version fields for GVE driver > > version based on features. > > > > './devtools/check-git-log.sh' is giving some warnings, can you please > check them? > > Contribution guide documentation may help to fix reported issues: > https://doc.dpdk.org/guides/contributing/patches.html#commit-messages-sub= ject-line > I did run ./devtools/checkpatches.sh but not ./devtools/check-git-log.sh. I will run both before sending the next patch. > > Depends-on: series-27687 > > > > Signed-off-by: Rushil Gupta > > Signed-off-by: Joshua Washington > > Signed-off-by: Junfeng Guo > > Signed-off-by: Jeroen de Borst > > --- > > drivers/net/gve/base/gve.h | 3 -- > > drivers/net/gve/base/gve_adminq.c | 19 +++++++++ > > drivers/net/gve/base/gve_adminq.h | 49 ++++++++++++++++++++++- > > drivers/net/gve/base/gve_osdep.h | 36 +++++++++++++++++ > > drivers/net/gve/gve_ethdev.c | 65 +++++++++++++++++++++++++------ > > drivers/net/gve/gve_ethdev.h | 2 +- > > drivers/net/gve/gve_version.c | 14 +++++++ > > drivers/net/gve/gve_version.h | 25 ++++++++++++ > > drivers/net/gve/meson.build | 1 + > > 9 files changed, 198 insertions(+), 16 deletions(-) > > create mode 100644 drivers/net/gve/gve_version.c > > create mode 100644 drivers/net/gve/gve_version.h > > > > diff --git a/drivers/net/gve/base/gve.h b/drivers/net/gve/base/gve.h > > index 2dc4507acb..89f9654a72 100644 > > --- a/drivers/net/gve/base/gve.h > > +++ b/drivers/net/gve/base/gve.h > > @@ -8,9 +8,6 @@ > > > > #include "gve_desc.h" > > > > -#define GVE_VERSION "1.3.0" > > -#define GVE_VERSION_PREFIX "GVE-" > > - > > #ifndef GOOGLE_VENDOR_ID > > #define GOOGLE_VENDOR_ID 0x1ae0 > > #endif > > diff --git a/drivers/net/gve/base/gve_adminq.c b/drivers/net/gve/base/g= ve_adminq.c > > index e745b709b2..2e5099a5b0 100644 > > --- a/drivers/net/gve/base/gve_adminq.c > > +++ b/drivers/net/gve/base/gve_adminq.c > > @@ -401,6 +401,9 @@ static int gve_adminq_issue_cmd(struct gve_priv *pr= iv, > > case GVE_ADMINQ_GET_PTYPE_MAP: > > priv->adminq_get_ptype_map_cnt++; > > break; > > + case GVE_ADMINQ_VERIFY_DRIVER_COMPATIBILITY: > > + priv->adminq_verify_driver_compatibility_cnt++; > > + break; > > default: > > PMD_DRV_LOG(ERR, "unknown AQ command opcode %d", opcode); > > } > > @@ -465,6 +468,22 @@ int gve_adminq_configure_device_resources(struct g= ve_priv *priv, > > return gve_adminq_execute_cmd(priv, &cmd); > > } > > > > +int gve_adminq_verify_driver_compatibility(struct gve_priv *priv, > > + u64 driver_info_len, > > + dma_addr_t driver_info_addr) > > +{ > > + union gve_adminq_command cmd; > > + > > + memset(&cmd, 0, sizeof(cmd)); > > + cmd.opcode =3D cpu_to_be32(GVE_ADMINQ_VERIFY_DRIVER_COMPATIBILITY= ); > > + cmd.verify_driver_compatibility =3D (struct gve_adminq_verify_dri= ver_compatibility) { > > + .driver_info_len =3D cpu_to_be64(driver_info_len), > > + .driver_info_addr =3D cpu_to_be64(driver_info_addr), > > + }; > > + > > + return gve_adminq_execute_cmd(priv, &cmd); > > +} > > + > > int gve_adminq_deconfigure_device_resources(struct gve_priv *priv) > > { > > union gve_adminq_command cmd; > > diff --git a/drivers/net/gve/base/gve_adminq.h b/drivers/net/gve/base/g= ve_adminq.h > > index 05550119de..edac32f031 100644 > > --- a/drivers/net/gve/base/gve_adminq.h > > +++ b/drivers/net/gve/base/gve_adminq.h > > @@ -1,6 +1,6 @@ > > /* SPDX-License-Identifier: MIT > > * Google Virtual Ethernet (gve) driver > > - * Copyright (C) 2015-2022 Google, Inc. > > + * Copyright (C) 2015-2023 Google, Inc. > > */ > > > > #ifndef _GVE_ADMINQ_H > > @@ -23,6 +23,7 @@ enum gve_adminq_opcodes { > > GVE_ADMINQ_REPORT_STATS =3D 0xC, > > GVE_ADMINQ_REPORT_LINK_SPEED =3D 0xD, > > GVE_ADMINQ_GET_PTYPE_MAP =3D 0xE, > > + GVE_ADMINQ_VERIFY_DRIVER_COMPATIBILITY =3D 0xF, > > }; > > > > /* Admin queue status codes */ > > @@ -145,6 +146,47 @@ enum gve_sup_feature_mask { > > }; > > > > #define GVE_DEV_OPT_LEN_GQI_RAW_ADDRESSING 0x0 > > +enum gve_driver_capbility { > > + gve_driver_capability_gqi_qpl =3D 0, > > + gve_driver_capability_gqi_rda =3D 1, > > + gve_driver_capability_dqo_qpl =3D 2, /* reserved for future use *= / > > + gve_driver_capability_dqo_rda =3D 3, > > +}; > > + > > +#define GVE_CAP1(a) BIT((int)a) > > +#define GVE_CAP2(a) BIT(((int)a) - 64) > > +#define GVE_CAP3(a) BIT(((int)a) - 128) > > +#define GVE_CAP3(a) BIT(((int)a) - 192) > > GVE_CAP2, GVE_CAP3 & GVE_CAP4 seems not used, do we need to add them now? > And I guess '(((int)a) - 64)' usage is to unset some bits, will it be > better to '(a & ~(1 << 6))' ? Sure; I will remove GVE_CAP2, GVE_CAP3 & GVE_CAP4. > > > + > > +#define GVE_DRIVER_CAPABILITY_FLAGS1 \ > > + (GVE_CAP1(gve_driver_capability_gqi_qpl) | \ > > + GVE_CAP1(gve_driver_capability_gqi_rda) | \ > > + GVE_CAP1(gve_driver_capability_dqo_rda)) > > + > > +#define GVE_DRIVER_CAPABILITY_FLAGS2 0x0 > > +#define GVE_DRIVER_CAPABILITY_FLAGS3 0x0 > > +#define GVE_DRIVER_CAPABILITY_FLAGS4 0x0 > > + > > +struct gve_driver_info { > > + u8 os_type; /* 0x05 =3D DPDK */ > > + u8 driver_major; > > + u8 driver_minor; > > + u8 driver_sub; > > + __be32 os_version_major; > > + __be32 os_version_minor; > > + __be32 os_version_sub; > > + __be64 driver_capability_flags[4]; > > + u8 os_version_str1[OS_VERSION_STRLEN]; > > + u8 os_version_str2[OS_VERSION_STRLEN]; > > +}; > > + > > +struct gve_adminq_verify_driver_compatibility { > > + __be64 driver_info_len; > > + __be64 driver_info_addr; > > +}; > > + > > +GVE_CHECK_STRUCT_LEN(16, gve_adminq_verify_driver_compatibility); > > + > > It looks like we need a static assert helper for DPDK, I will try to > send something. > > > > > struct gve_adminq_configure_device_resources { > > __be64 counter_array; > > @@ -345,6 +387,8 @@ union gve_adminq_command { > > struct gve_adminq_report_stats report_stats; > > struct gve_adminq_report_link_speed report_link_s= peed; > > struct gve_adminq_get_ptype_map get_ptype_map; > > + struct gve_adminq_verify_driver_compatibility > > + verify_driver_compatibility; > > }; > > }; > > u8 reserved[64]; > > @@ -378,4 +422,7 @@ struct gve_ptype_lut; > > int gve_adminq_get_ptype_map_dqo(struct gve_priv *priv, > > struct gve_ptype_lut *ptype_lut); > > > > +int gve_adminq_verify_driver_compatibility(struct gve_priv *priv, > > + u64 driver_info_len, > > + dma_addr_t driver_info_addr); > > #endif /* _GVE_ADMINQ_H */ > > diff --git a/drivers/net/gve/base/gve_osdep.h b/drivers/net/gve/base/gv= e_osdep.h > > index 7cb73002f4..a5efa8543e 100644 > > --- a/drivers/net/gve/base/gve_osdep.h > > +++ b/drivers/net/gve/base/gve_osdep.h > > @@ -21,9 +21,14 @@ > > #include > > #include > > #include > > +#include > > > > #include "../gve_logs.h" > > > > +#ifdef __linux__ > > +#include > > +#endif > > + > > typedef uint8_t u8; > > typedef uint16_t u16; > > typedef uint32_t u32; > > @@ -69,6 +74,12 @@ typedef rte_iova_t dma_addr_t; > > > > #define msleep(ms) rte_delay_ms(ms) > > > > +#define OS_VERSION_STRLEN 128 > > +struct os_version_string { > > + char os_version_str1[OS_VERSION_STRLEN]; > > + char os_version_str2[OS_VERSION_STRLEN]; > > +}; > > + > > /* These macros are used to generate compilation errors if a struct/un= ion > > * is not exactly the correct length. It gives a divide by zero error = if > > * the struct/union is not of the correct size, otherwise it creates a= n > > @@ -79,6 +90,12 @@ typedef rte_iova_t dma_addr_t; > > #define GVE_CHECK_UNION_LEN(n, X) enum gve_static_asset_enum_##X \ > > { gve_static_assert_##X =3D (n) / ((sizeof(union X) =3D=3D (n)) ?= 1 : 0) } > > > > +#ifndef LINUX_VERSION_MAJOR > > +#define LINUX_VERSION_MAJOR (((LINUX_VERSION_CODE) >> 16) & 0xff) > > +#define LINUX_VERSION_SUBLEVEL (((LINUX_VERSION_CODE) >> 8) & 0xff) > > +#define LINUX_VERSION_PATCHLEVEL ((LINUX_VERSION_CODE) & 0xff) > > +#endif > > + > > Do we need Linux version macros in DPDK? They are not used at all. You are right. Will remove. > > > static __rte_always_inline u8 > > readb(volatile void *addr) > > { > > @@ -156,4 +173,23 @@ gve_free_dma_mem(struct gve_dma_mem *mem) > > mem->pa =3D 0; > > } > > > > +static inline void > > +populate_driver_version_strings(struct os_version_string *os_version_s= tr) > > +{ > > +#ifdef __linux__ > > + struct utsname uts; > > + if (uname(&uts) >=3D 0) { > > + /* release */ > > + rte_strscpy(os_version_str->os_version_str1, uts.release, > > + sizeof(os_version_str->os_version_str1)); > > + /* version */ > > + rte_strscpy(os_version_str->os_version_str2, uts.version, > > + sizeof(os_version_str->os_version_str2)); > > + } > > Since OS type is reported as DPDK, do we need underlying Linux release > information to the FW? > > If not we can remove #ifdef and 'uname()' to reduce platform specific cod= e. Yes it is a GCE business requirement (to look at DPDK usage by linux kernel version). > > > +#else > > + /* gVNIC is currently not supported on OS like FreeBSD */ > > meson file only disable for Windows, for FreeBSD driver is compiled. > If driver is only supported on Linux, can you change the meson file to > reflec this? > Ok will do. > > + RTE_SET_USED(os_version_str); > > +#endif > > +} > > + > > #endif /* _GVE_OSDEP_H_ */ > > diff --git a/drivers/net/gve/gve_ethdev.c b/drivers/net/gve/gve_ethdev.= c > > index cf28a4a3b7..1d6e134fff 100644 > > --- a/drivers/net/gve/gve_ethdev.c > > +++ b/drivers/net/gve/gve_ethdev.c > > @@ -5,21 +5,13 @@ > > #include "gve_ethdev.h" > > #include "base/gve_adminq.h" > > #include "base/gve_register.h" > > - > > -const char gve_version_str[] =3D GVE_VERSION; > > -static const char gve_version_prefix[] =3D GVE_VERSION_PREFIX; > > +#include "base/gve_osdep.h" > > +#include "gve_version.h" > > > > static void > > gve_write_version(uint8_t *driver_version_register) > > { > > - const char *c =3D gve_version_prefix; > > - > > - while (*c) { > > - writeb(*c, driver_version_register); > > - c++; > > - } > > - > > - c =3D gve_version_str; > > + const char *c =3D gve_version_string(); > > while (*c) { > > writeb(*c, driver_version_register); > > c++; > > @@ -265,6 +257,52 @@ gve_dev_close(struct rte_eth_dev *dev) > > return err; > > } > > > > +static int > > +gve_verify_driver_compatibility(struct gve_priv *priv) > > +{ > > + const struct rte_memzone *driver_info_bus; > > What does '_bus' indicates in the variable name? This seems like a typo. Will correct. > > > + struct gve_driver_info *driver_info; > > + int err; > > + > > + driver_info_bus =3D rte_memzone_reserve_aligned("verify_driver_co= mpatibility", > > + sizeof(struct gve_d= river_info), > > + rte_socket_id(), > > + RTE_MEMZONE_IOVA_CO= NTIG, PAGE_SIZE); > > There is no benefit to use DPDK memory APIs for this usage, a 'malloc()' > will do the work, and maybe better as compilers/static analyzers > recognizes it more. Makes sense. > > > + if (driver_info_bus =3D=3D NULL) { > > + PMD_DRV_LOG(ERR, > > + "Could not alloc memzone for driver compatibi= lity"); > > + return -ENOMEM; > > + } > > + driver_info =3D (struct gve_driver_info *)driver_info_bus->addr; > > + *driver_info =3D (struct gve_driver_info) { > > + .os_type =3D 5, /* DPDK */ > > + .driver_major =3D GVE_VERSION_MAJOR, > > + .driver_minor =3D GVE_VERSION_MINOR, > > + .driver_sub =3D GVE_VERSION_SUB, > > + .os_version_major =3D cpu_to_be32(DPDK_VERSION_MAJOR), > > + .os_version_minor =3D cpu_to_be32(DPDK_VERSION_MINOR), > > + .os_version_sub =3D cpu_to_be32(DPDK_VERSION_SUB), > > + .driver_capability_flags =3D { > > + cpu_to_be64(GVE_DRIVER_CAPABILITY_FLAGS1), > > + cpu_to_be64(GVE_DRIVER_CAPABILITY_FLAGS2), > > + cpu_to_be64(GVE_DRIVER_CAPABILITY_FLAGS3), > > + cpu_to_be64(GVE_DRIVER_CAPABILITY_FLAGS4), > > + }, > > + }; > > + > > + populate_driver_version_strings((struct os_version_string *)&driv= er_info->os_version_str1); > > + > > If you pass two strings as parameter to > 'populate_driver_version_strings()' can you get rid of interim type > "struct os_version_string" and above casting? Ok. > > > + err =3D gve_adminq_verify_driver_compatibility(priv, > > + sizeof(struct gve_driver_info), (dma_addr_t)driver_info_b= us); > > + > > + /* It's ok if the device doesn't support this */ > > + if (err =3D=3D -EOPNOTSUPP) > > + err =3D 0; > > Is this error saying DPDK version is not supported? > Where a change should go to be able to identify and verify DPDK platform > in GVE? Does it require continious update as DPDK get updated? > This means vNIC doesn't support verify and log adminq information (because of older hypervisor). Does it require continuous update : No. This is to make sure we return proper error code for older vNIC. > > + > > + rte_memzone_free(driver_info_bus); > > + return err; > > +} > > + > > static int > > gve_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev= _info) > > { > > @@ -672,6 +710,11 @@ gve_init_priv(struct gve_priv *priv, bool skip_des= cribe_device) > > PMD_DRV_LOG(ERR, "Failed to alloc admin queue: err=3D%d",= err); > > return err; > > } > > + err =3D gve_verify_driver_compatibility(priv); > > + if (err) { > > + PMD_DRV_LOG(ERR, "Could not verify driver compatibility: = err=3D%d", err); > > + goto free_adminq; > > + } > > > > if (skip_describe_device) > > goto setup_device; > > diff --git a/drivers/net/gve/gve_ethdev.h b/drivers/net/gve/gve_ethdev.= h > > index 42a02cf5d4..23ccff37d3 100644 > > --- a/drivers/net/gve/gve_ethdev.h > > +++ b/drivers/net/gve/gve_ethdev.h > > @@ -222,7 +222,7 @@ struct gve_priv { > > uint32_t adminq_report_stats_cnt; > > uint32_t adminq_report_link_speed_cnt; > > uint32_t adminq_get_ptype_map_cnt; > > - > > + uint32_t adminq_verify_driver_compatibility_cnt; > > volatile uint32_t state_flags; > > > > /* Gvnic device link speed from hypervisor. */ > > diff --git a/drivers/net/gve/gve_version.c b/drivers/net/gve/gve_versio= n.c > > new file mode 100644 > > index 0000000000..7eaa689d90 > > --- /dev/null > > +++ b/drivers/net/gve/gve_version.c > > @@ -0,0 +1,14 @@ > > +/* SPDX-License-Identifier: MIT > > + * Google Virtual Ethernet (gve) driver > > + * Copyright (C) 2015-2023 Google, Inc. > > + */ > > This is not base code, but DPDK layer, license should be BSD-3. > Ok > > +#include "gve_version.h" > > + > > +const char *gve_version_string(void) > > +{ > > + static char gve_version[10]; > > + snprintf(gve_version, sizeof(gve_version), "%s%d.%d.%d", > > + GVE_VERSION_PREFIX, GVE_VERSION_MAJOR, GVE_VERSION_MINOR, > > + GVE_VERSION_SUB); > > + return gve_version; > > +} > > diff --git a/drivers/net/gve/gve_version.h b/drivers/net/gve/gve_versio= n.h > > new file mode 100644 > > index 0000000000..9af6a00568 > > --- /dev/null > > +++ b/drivers/net/gve/gve_version.h > > @@ -0,0 +1,25 @@ > > +/* SPDX-License-Identifier: MIT > > + * Google Virtual Ethernet (gve) driver > > + * Copyright (C) 2015-2023 Google, Inc. > > + */ > > + > > This is not base code, but DPDK layer, license should be BSD-3. > Ok > > +#ifndef _GVE_VERSION_H_ > > +#define _GVE_VERSION_H_ > > + > > +#include > > + > > +#define GVE_VERSION_PREFIX "DPDK-" > > +#define GVE_VERSION_MAJOR 1 > > +#define GVE_VERSION_MINOR 0 > > +#define GVE_VERSION_SUB 0 > > + > > Is this GVE base version, or DPDK gve version? > Previous version information was "GVE-1.3.0", now it is becoming > "DPDK-1.0.0", > is this breaking the version link with GVE base version and creating a > new versioning scheme for DPDK GVE driver? > > Btw, documentation still has "v1.3.0. GVE base code", should it be > updated as well? > DPDK-1.0.0 is the DPDK driver version. GVE driver versioning only applies for linux kernel Gvnic driver. Similarly Windows Gvnic driver has different versioning system. > > > +#define DPDK_VERSION_MAJOR (100 * RTE_VER_YEAR + RTE_VER_MONTH) > > +#define DPDK_VERSION_MINOR RTE_VER_MINOR > > +#define DPDK_VERSION_SUB RTE_VER_RELEASE > > + > > RTE_VER_RELEASE is 1 (-rc1), 2 (-rc2), etc... And if it is not release > candidate it is always 99, so it may not be very usefull for the > official releases and changes frequently for the development tree, are > you sure to use this value? > It is ok for our usecase. > > > + > > +const char * > > +gve_version_string(void); > > + > > + > > +#endif /* GVE_VERSION_H */ > > diff --git a/drivers/net/gve/meson.build b/drivers/net/gve/meson.build > > index af0010c01c..a37c4bafa2 100644 > > --- a/drivers/net/gve/meson.build > > +++ b/drivers/net/gve/meson.build > > @@ -12,5 +12,6 @@ sources =3D files( > > 'gve_rx.c', > > 'gve_tx.c', > > 'gve_ethdev.c', > > + 'gve_version.c', > > ) > > includes +=3D include_directories('base') >