<div dir="ltr"><div dir="ltr">Thanks for reviewing. Here is v3: <a href="http://patchwork.dpdk.org/project/dpdk/patch/20230518174005.1377467-1-rushilg@google.com/">http://patchwork.dpdk.org/project/dpdk/patch/20230518174005.1377467-1-rushilg@google.com/</a></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, May 17, 2023 at 9:59 AM Ferruh Yigit <<a href="mailto:ferruh.yigit@amd.com" target="_blank">ferruh.yigit@amd.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On 5/8/2023 8:15 PM, Rushil Gupta wrote:<br>
> Change gve_driver_info fields to report DPDK as OS type and DPDK RTE<br>
> version as OS version, reserving driver_version fields for GVE driver<br>
> version based on features.<br>
> <br>
> Signed-off-by: Rushil Gupta <<a href="mailto:rushilg@google.com" target="_blank">rushilg@google.com</a>><br>
> Signed-off-by: Joshua Washington <<a href="mailto:joshwash@google.com" target="_blank">joshwash@google.com</a>><br>
> Signed-off-by: Junfeng Guo <<a href="mailto:junfeng.guo@intel.com" target="_blank">junfeng.guo@intel.com</a>><br>
> Signed-off-by: Jeroen de Borst <<a href="mailto:jeroendb@google.com" target="_blank">jeroendb@google.com</a>><br>
> ---<br>
>  drivers/net/gve/base/gve.h        |  3 --<br>
>  drivers/net/gve/base/gve_adminq.c | 19 ++++++++++<br>
>  drivers/net/gve/base/gve_adminq.h | 46 ++++++++++++++++++++++-<br>
>  drivers/net/gve/base/gve_osdep.h  | 24 ++++++++++++<br>
>  drivers/net/gve/gve_ethdev.c      | 61 +++++++++++++++++++++++++------<br>
>  drivers/net/gve/gve_ethdev.h      |  2 +-<br>
>  drivers/net/gve/gve_version.c     | 14 +++++++<br>
>  drivers/net/gve/gve_version.h     | 25 +++++++++++++<br>
>  drivers/net/gve/meson.build       |  7 ++++<br>
>  9 files changed, 185 insertions(+), 16 deletions(-)<br>
>  create mode 100644 drivers/net/gve/gve_version.c<br>
>  create mode 100644 drivers/net/gve/gve_version.h<br>
> <br>
<br>
'doc/guides/nics/gve.rst' has following reference to Linux kernel version:<br>
<br>
"<br>
The base code is under MIT license and based on GVE kernel driver v1.3.0.<br>
"<br>
<br>
Previously you mentioned that Linux kernel code has nothing to do with<br>
DPDK version, should above note removed or updated?<br>
<br></blockquote><div>I will address this in the license patch 23.11. We will port all of our MIT licenses to BSD.</div><div><a href="http://patchwork.dpdk.org/project/dpdk/patch/20230411045908.844901-2-rushilg@google.com/">http://patchwork.dpdk.org/project/dpdk/patch/20230411045908.844901-2-rushilg@google.com/</a><br></div><div>For now let's keep this change separate from license update/removal.</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<...><br>
<br>
> +static int<br>
> +gve_verify_driver_compatibility(struct gve_priv *priv)<br>
> +{<br>
> +     struct gve_driver_info *driver_info;<br>
> +     int err;<br>
> +<br>
> +     driver_info = rte_zmalloc("driver info", sizeof(struct gve_driver_info), 0);<br>
<br>
Can use calloc(), no need to use DPDK memory APIs.<br>
This memory is not for datapath, and only used for short time.<br></blockquote><div>Done </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
> +     if (driver_info == NULL) {<br>
> +             PMD_DRV_LOG(ERR,<br>
> +                         "Could not alloc for driver compatibility");<br>
<br>
Message can be misleading, adding 'verify' may help.<br></blockquote><div>Done </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
> +             return -ENOMEM;<br>
> +     }<br>
> +     *driver_info = (struct gve_driver_info) {<br>
> +             .os_type = 5, /* DPDK */<br>
> +             .driver_major = GVE_VERSION_MAJOR,<br>
> +             .driver_minor = GVE_VERSION_MINOR,<br>
> +             .driver_sub = GVE_VERSION_SUB,<br>
> +             .os_version_major = cpu_to_be32(DPDK_VERSION_MAJOR),<br>
> +             .os_version_minor = cpu_to_be32(DPDK_VERSION_MINOR),<br>
> +             .os_version_sub = cpu_to_be32(DPDK_VERSION_SUB),<br>
> +             .driver_capability_flags = {<br>
> +                     cpu_to_be64(GVE_DRIVER_CAPABILITY_FLAGS1),<br>
> +                     cpu_to_be64(GVE_DRIVER_CAPABILITY_FLAGS2),<br>
> +                     cpu_to_be64(GVE_DRIVER_CAPABILITY_FLAGS3),<br>
> +                     cpu_to_be64(GVE_DRIVER_CAPABILITY_FLAGS4),<br>
> +             },<br>
> +     };<br>
> +<br>
> +     populate_driver_version_strings((char *)driver_info->os_version_str1,<br>
> +                     (char *)driver_info->os_version_str2);<br>
> +<br>
<br>
Is it accepted by adminq_verify if 'os_version_str1' & 'os_version_str2'<br>
is not set? If not 'populate_driver_version_strings()' should return<br>
success/error value.<br></blockquote><div>It is acceptable if  'os_version_str1' & 'os_version_str2' are not set.</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
> +     err = gve_adminq_verify_driver_compatibility(priv,<br>
> +             sizeof(struct gve_driver_info), (dma_addr_t)driver_info);<br>
> +<br>
> +     /* It's ok if the device doesn't support this */<br>
> +     if (err == -EOPNOTSUPP)<br>
> +             err = 0;<br>
> +<br>
> +     rte_free(driver_info);<br>
> +     return err;<br>
> +}<br>
> +<br>
>  static int<br>
>  gve_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)<br>
>  {<br>
> @@ -672,6 +706,11 @@ gve_init_priv(struct gve_priv *priv, bool skip_describe_device)<br>
>               PMD_DRV_LOG(ERR, "Failed to alloc admin queue: err=%d", err);<br>
>               return err;<br>
>       }<br>
> +     err = gve_verify_driver_compatibility(priv);<br>
> +     if (err) {<br>
> +             PMD_DRV_LOG(ERR, "Could not verify driver compatibility: err=%d", err);<br>
> +             goto free_adminq;<br>
> +     }<br>
>  <br>
>       if (skip_describe_device)<br>
>               goto setup_device;<br>
> diff --git a/drivers/net/gve/gve_ethdev.h b/drivers/net/gve/gve_ethdev.h<br>
> index 42a02cf5d4..23ccff37d3 100644<br>
> --- a/drivers/net/gve/gve_ethdev.h<br>
> +++ b/drivers/net/gve/gve_ethdev.h<br>
> @@ -222,7 +222,7 @@ struct gve_priv {<br>
>       uint32_t adminq_report_stats_cnt;<br>
>       uint32_t adminq_report_link_speed_cnt;<br>
>       uint32_t adminq_get_ptype_map_cnt;<br>
> -<br>
> +     uint32_t adminq_verify_driver_compatibility_cnt;<br>
>       volatile uint32_t state_flags;<br>
>  <br>
>       /* Gvnic device link speed from hypervisor. */<br>
> diff --git a/drivers/net/gve/gve_version.c b/drivers/net/gve/gve_version.c<br>
> new file mode 100644<br>
> index 0000000000..f02b4f696f<br>
> --- /dev/null<br>
> +++ b/drivers/net/gve/gve_version.c<br>
> @@ -0,0 +1,14 @@<br>
> +/* SPDX-License-Identifier: BSD-3-Clause<br>
> + * Google Virtual Ethernet (gve) driver<br>
<br>
Is above line added intentionally?<br>
Normally SPDX tag only contains license and copyright information,<br>
please check 'gve_ethdev.c' for sample tag.<br></blockquote><div>Fixed. </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
> + * Copyright (C) 2015-2023 Google, Inc.<br>
> + */<br>
> +#include "gve_version.h"<br>
> +<br>
> +const char *gve_version_string(void)<br>
> +{<br>
> +     static char gve_version[10];<br>
<br>
DPDK-1.0.0 => 10 chars, it doesn't left room for terminating NULL, but<br>
at least 'gve_write_version()' seems expecting to have one.<br></blockquote><div>Great catch! Fixed. </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
> +     snprintf(gve_version, sizeof(gve_version), "%s%d.%d.%d",<br>
> +             GVE_VERSION_PREFIX, GVE_VERSION_MAJOR, GVE_VERSION_MINOR,<br>
> +             GVE_VERSION_SUB);<br>
<br>
'snprintf()' adds terminating NULL, truncating version string, need more<br>
space in the 'gve_version' array.<br>
<br>
> +     return gve_version;<br>
> +}<br>
> diff --git a/drivers/net/gve/gve_version.h b/drivers/net/gve/gve_version.h<br>
> new file mode 100644<br>
> index 0000000000..eca717d64b<br>
> --- /dev/null<br>
> +++ b/drivers/net/gve/gve_version.h<br>
> @@ -0,0 +1,25 @@<br>
> +/* SPDX-License-Identifier: BSD-3-Clause<br>
> + * Google Virtual Ethernet (gve) driver<br>
<br>
Ditto<br></blockquote><div>Fixed. </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
> + * Copyright (C) 2015-2023 Google, Inc.<br>
> + */<br>
> +<br>
> +#ifndef _GVE_VERSION_H_<br>
> +#define _GVE_VERSION_H_<br>
> +<br>
> +#include <rte_version.h><br>
> +<br>
> +#define GVE_VERSION_PREFIX "DPDK-"<br>
> +#define GVE_VERSION_MAJOR 1<br>
> +#define GVE_VERSION_MINOR 0<br>
> +#define GVE_VERSION_SUB 0<br>
> +<br>
> +#define DPDK_VERSION_MAJOR (100 * RTE_VER_YEAR + RTE_VER_MONTH)<br>
> +#define DPDK_VERSION_MINOR RTE_VER_MINOR<br>
> +#define DPDK_VERSION_SUB RTE_VER_RELEASE<br>
> +<br>
> +<br>
> +const char *<br>
> +gve_version_string(void);<br>
> +<br>
> +<br>
> +#endif /* GVE_VERSION_H */<br>
> diff --git a/drivers/net/gve/meson.build b/drivers/net/gve/meson.build<br>
> index af0010c01c..62ab02d0dc 100644<br>
> --- a/drivers/net/gve/meson.build<br>
> +++ b/drivers/net/gve/meson.build<br>
> @@ -7,10 +7,17 @@ if is_windows<br>
>      subdir_done()<br>
>  endif<br>
>  <br>
> +if is_freebsd<br>
> +    build = false<br>
> +    reason = 'not supported on FreeBSD'<br>
> +    subdir_done()<br>
> +endif<br>
> +<br>
<br>
instead of both 'is_windows' & 'is_freebsd' checks,<br>
can check as "not is_linux":<br>
<br>
if not is_linux<br>
    build = false<br>
    reason = 'only supported on Linux'<br>
endif<br></blockquote><div>Fixed. </div></div></div>