netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH net-next v3 0/2] gve: Handle alternate miss-completions
@ 2022-11-14 23:35 Jeroen de Borst
  2022-11-14 23:35 ` [PATCH net-next v3 1/2] gve: Adding a new AdminQ command to verify driver Jeroen de Borst
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Jeroen de Borst @ 2022-11-14 23:35 UTC (permalink / raw)
  To: netdev; +Cc: davem, kuba, jesse.brandeburg, Jeroen de Borst

Some versions of the virtual NIC present miss-completions in
an alternative way. Let the diver handle these alternate completions
and announce this capability to the device.

Changed in v3:
- Rewording cover letter
- Added 'Reviewed-by: Jesse Brandeburg <jesse.brandeburg@intel.com>'
Changes in v2:
- Changed the subject to include 'gve:'


Jeroen de Borst (2):
  gve: Adding a new AdminQ command to verify driver
  gve: Handle alternate miss completions

 drivers/net/ethernet/google/gve/gve.h         |  1 +
 drivers/net/ethernet/google/gve/gve_adminq.c  | 19 +++++++
 drivers/net/ethernet/google/gve/gve_adminq.h  | 51 ++++++++++++++++++
 .../net/ethernet/google/gve/gve_desc_dqo.h    |  5 ++
 drivers/net/ethernet/google/gve/gve_main.c    | 52 +++++++++++++++++++
 drivers/net/ethernet/google/gve/gve_tx_dqo.c  | 18 ++++---
 6 files changed, 140 insertions(+), 6 deletions(-)

-- 
2.38.1.431.g37b22c650d-goog


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH net-next v3 1/2] gve: Adding a new AdminQ command to verify driver
  2022-11-14 23:35 [PATCH net-next v3 0/2] gve: Handle alternate miss-completions Jeroen de Borst
@ 2022-11-14 23:35 ` Jeroen de Borst
  2022-11-16  5:34   ` Saeed Mahameed
  2022-11-14 23:35 ` [PATCH net-next v3 2/2] gve: Handle alternate miss completions Jeroen de Borst
  2022-11-16  5:38 ` [PATCH net-next v3 0/2] gve: Handle alternate miss-completions Saeed Mahameed
  2 siblings, 1 reply; 8+ messages in thread
From: Jeroen de Borst @ 2022-11-14 23:35 UTC (permalink / raw)
  To: netdev; +Cc: davem, kuba, jesse.brandeburg, Jeroen de Borst

Check whether the driver is compatible with the device
presented.

Signed-off-by: Jeroen de Borst <jeroendb@google.com>
Reviewed-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
---
 drivers/net/ethernet/google/gve/gve.h        |  1 +
 drivers/net/ethernet/google/gve/gve_adminq.c | 19 +++++++
 drivers/net/ethernet/google/gve/gve_adminq.h | 49 ++++++++++++++++++
 drivers/net/ethernet/google/gve/gve_main.c   | 52 ++++++++++++++++++++
 4 files changed, 121 insertions(+)

diff --git a/drivers/net/ethernet/google/gve/gve.h b/drivers/net/ethernet/google/gve/gve.h
index 5655da9cd236..64eb0442c82f 100644
--- a/drivers/net/ethernet/google/gve/gve.h
+++ b/drivers/net/ethernet/google/gve/gve.h
@@ -563,6 +563,7 @@ struct gve_priv {
 	u32 adminq_report_stats_cnt;
 	u32 adminq_report_link_speed_cnt;
 	u32 adminq_get_ptype_map_cnt;
+	u32 adminq_verify_driver_compatibility_cnt;
 
 	/* Global stats */
 	u32 interface_up_cnt; /* count of times interface turned up since last reset */
diff --git a/drivers/net/ethernet/google/gve/gve_adminq.c b/drivers/net/ethernet/google/gve/gve_adminq.c
index f7621ab672b9..6a12b30a9f87 100644
--- a/drivers/net/ethernet/google/gve/gve_adminq.c
+++ b/drivers/net/ethernet/google/gve/gve_adminq.c
@@ -407,6 +407,9 @@ static int gve_adminq_issue_cmd(struct gve_priv *priv,
 	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:
 		dev_err(&priv->pdev->dev, "unknown AQ command opcode %d\n", opcode);
 	}
@@ -878,6 +881,22 @@ int gve_adminq_report_stats(struct gve_priv *priv, u64 stats_report_len,
 	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 = cpu_to_be32(GVE_ADMINQ_VERIFY_DRIVER_COMPATIBILITY);
+	cmd.verify_driver_compatibility = (struct gve_adminq_verify_driver_compatibility) {
+		.driver_info_len = cpu_to_be64(driver_info_len),
+		.driver_info_addr = cpu_to_be64(driver_info_addr),
+	};
+
+	return gve_adminq_execute_cmd(priv, &cmd);
+}
+
 int gve_adminq_report_link_speed(struct gve_priv *priv)
 {
 	union gve_adminq_command gvnic_cmd;
diff --git a/drivers/net/ethernet/google/gve/gve_adminq.h b/drivers/net/ethernet/google/gve/gve_adminq.h
index 83c0b40cd2d9..b9ee8be73f96 100644
--- a/drivers/net/ethernet/google/gve/gve_adminq.h
+++ b/drivers/net/ethernet/google/gve/gve_adminq.h
@@ -24,6 +24,7 @@ enum gve_adminq_opcodes {
 	GVE_ADMINQ_REPORT_STATS			= 0xC,
 	GVE_ADMINQ_REPORT_LINK_SPEED		= 0xD,
 	GVE_ADMINQ_GET_PTYPE_MAP		= 0xE,
+	GVE_ADMINQ_VERIFY_DRIVER_COMPATIBILITY	= 0xF,
 };
 
 /* Admin queue status codes */
@@ -146,6 +147,49 @@ enum gve_sup_feature_mask {
 
 #define GVE_DEV_OPT_LEN_GQI_RAW_ADDRESSING 0x0
 
+#define GVE_VERSION_STR_LEN 128
+
+enum gve_driver_capbility {
+	gve_driver_capability_gqi_qpl = 0,
+	gve_driver_capability_gqi_rda = 1,
+	gve_driver_capability_dqo_qpl = 2, /* reserved for future use */
+	gve_driver_capability_dqo_rda = 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_CAP4(a) BIT(((int)a) - 192)
+
+#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;	/* 0x01 = Linux */
+	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[GVE_VERSION_STR_LEN];
+	u8 os_version_str2[GVE_VERSION_STR_LEN];
+};
+
+struct gve_adminq_verify_driver_compatibility {
+	__be64 driver_info_len;
+	__be64 driver_info_addr;
+};
+
+static_assert(sizeof(struct gve_adminq_verify_driver_compatibility) == 16);
+
 struct gve_adminq_configure_device_resources {
 	__be64 counter_array;
 	__be64 irq_db_addr;
@@ -345,6 +389,8 @@ union gve_adminq_command {
 			struct gve_adminq_report_stats report_stats;
 			struct gve_adminq_report_link_speed report_link_speed;
 			struct gve_adminq_get_ptype_map get_ptype_map;
+			struct gve_adminq_verify_driver_compatibility
+						verify_driver_compatibility;
 		};
 	};
 	u8 reserved[64];
@@ -372,6 +418,9 @@ int gve_adminq_unregister_page_list(struct gve_priv *priv, u32 page_list_id);
 int gve_adminq_set_mtu(struct gve_priv *priv, u64 mtu);
 int gve_adminq_report_stats(struct gve_priv *priv, u64 stats_report_len,
 			    dma_addr_t stats_report_addr, u64 interval);
+int gve_adminq_verify_driver_compatibility(struct gve_priv *priv,
+					   u64 driver_info_len,
+					   dma_addr_t driver_info_addr);
 int gve_adminq_report_link_speed(struct gve_priv *priv);
 
 struct gve_ptype_lut;
diff --git a/drivers/net/ethernet/google/gve/gve_main.c b/drivers/net/ethernet/google/gve/gve_main.c
index 5a229a01f49d..5b40f9c53196 100644
--- a/drivers/net/ethernet/google/gve/gve_main.c
+++ b/drivers/net/ethernet/google/gve/gve_main.c
@@ -12,6 +12,8 @@
 #include <linux/sched.h>
 #include <linux/timer.h>
 #include <linux/workqueue.h>
+#include <linux/utsname.h>
+#include <linux/version.h>
 #include <net/sch_generic.h>
 #include "gve.h"
 #include "gve_dqo.h"
@@ -30,6 +32,49 @@
 const char gve_version_str[] = GVE_VERSION;
 static const char gve_version_prefix[] = GVE_VERSION_PREFIX;
 
+static int gve_verify_driver_compatibility(struct gve_priv *priv)
+{
+	int err;
+	struct gve_driver_info *driver_info;
+	dma_addr_t driver_info_bus;
+
+	driver_info = dma_alloc_coherent(&priv->pdev->dev,
+					 sizeof(struct gve_driver_info),
+					 &driver_info_bus, GFP_KERNEL);
+	if (!driver_info)
+		return -ENOMEM;
+
+	*driver_info = (struct gve_driver_info) {
+		.os_type = 1, /* Linux */
+		.os_version_major = cpu_to_be32(LINUX_VERSION_MAJOR),
+		.os_version_minor = cpu_to_be32(LINUX_VERSION_SUBLEVEL),
+		.os_version_sub = cpu_to_be32(LINUX_VERSION_PATCHLEVEL),
+		.driver_capability_flags = {
+			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),
+		},
+	};
+	strscpy(driver_info->os_version_str1, utsname()->release,
+		sizeof(driver_info->os_version_str1));
+	strscpy(driver_info->os_version_str2, utsname()->version,
+		sizeof(driver_info->os_version_str2));
+
+	err = gve_adminq_verify_driver_compatibility(priv,
+						     sizeof(struct gve_driver_info),
+						     driver_info_bus);
+
+	/* It's ok if the device doesn't support this */
+	if (err == -EOPNOTSUPP)
+		err = 0;
+
+	dma_free_coherent(&priv->pdev->dev,
+			  sizeof(struct gve_driver_info),
+			  driver_info, driver_info_bus);
+	return err;
+}
+
 static netdev_tx_t gve_start_xmit(struct sk_buff *skb, struct net_device *dev)
 {
 	struct gve_priv *priv = netdev_priv(dev);
@@ -1368,6 +1413,13 @@ static int gve_init_priv(struct gve_priv *priv, bool skip_describe_device)
 		return err;
 	}
 
+	err = gve_verify_driver_compatibility(priv);
+	if (err) {
+		dev_err(&priv->pdev->dev,
+			"Could not verify driver compatibility: err=%d\n", err);
+		goto err;
+	}
+
 	if (skip_describe_device)
 		goto setup_device;
 
-- 
2.38.1.431.g37b22c650d-goog


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH net-next v3 2/2] gve: Handle alternate miss completions
  2022-11-14 23:35 [PATCH net-next v3 0/2] gve: Handle alternate miss-completions Jeroen de Borst
  2022-11-14 23:35 ` [PATCH net-next v3 1/2] gve: Adding a new AdminQ command to verify driver Jeroen de Borst
@ 2022-11-14 23:35 ` Jeroen de Borst
  2022-11-16  5:17   ` Saeed Mahameed
  2022-11-16  5:38 ` [PATCH net-next v3 0/2] gve: Handle alternate miss-completions Saeed Mahameed
  2 siblings, 1 reply; 8+ messages in thread
From: Jeroen de Borst @ 2022-11-14 23:35 UTC (permalink / raw)
  To: netdev; +Cc: davem, kuba, jesse.brandeburg, Jeroen de Borst

The virtual NIC has 2 ways of indicating a miss-path
completion. This handles the alternate.

Signed-off-by: Jeroen de Borst <jeroendb@google.com>
Reviewed-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
---
 drivers/net/ethernet/google/gve/gve_adminq.h   |  4 +++-
 drivers/net/ethernet/google/gve/gve_desc_dqo.h |  5 +++++
 drivers/net/ethernet/google/gve/gve_tx_dqo.c   | 18 ++++++++++++------
 3 files changed, 20 insertions(+), 7 deletions(-)

diff --git a/drivers/net/ethernet/google/gve/gve_adminq.h b/drivers/net/ethernet/google/gve/gve_adminq.h
index b9ee8be73f96..cf29662e6ad1 100644
--- a/drivers/net/ethernet/google/gve/gve_adminq.h
+++ b/drivers/net/ethernet/google/gve/gve_adminq.h
@@ -154,6 +154,7 @@ enum gve_driver_capbility {
 	gve_driver_capability_gqi_rda = 1,
 	gve_driver_capability_dqo_qpl = 2, /* reserved for future use */
 	gve_driver_capability_dqo_rda = 3,
+	gve_driver_capability_alt_miss_compl = 4,
 };
 
 #define GVE_CAP1(a) BIT((int)a)
@@ -164,7 +165,8 @@ enum gve_driver_capbility {
 #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))
+	 GVE_CAP1(gve_driver_capability_dqo_rda) | \
+	 GVE_CAP1(gve_driver_capability_alt_miss_compl))
 
 #define GVE_DRIVER_CAPABILITY_FLAGS2 0x0
 #define GVE_DRIVER_CAPABILITY_FLAGS3 0x0
diff --git a/drivers/net/ethernet/google/gve/gve_desc_dqo.h b/drivers/net/ethernet/google/gve/gve_desc_dqo.h
index e8fe9adef7f2..f79cd0591110 100644
--- a/drivers/net/ethernet/google/gve/gve_desc_dqo.h
+++ b/drivers/net/ethernet/google/gve/gve_desc_dqo.h
@@ -176,6 +176,11 @@ static_assert(sizeof(struct gve_tx_compl_desc) == 8);
 #define GVE_COMPL_TYPE_DQO_MISS 0x1 /* Miss path completion */
 #define GVE_COMPL_TYPE_DQO_REINJECTION 0x3 /* Re-injection completion */
 
+/* The most significant bit in the completion tag can change the completion
+ * type from packet completion to miss path completion.
+ */
+#define GVE_ALT_MISS_COMPL_BIT BIT(15)
+
 /* Descriptor to post buffers to HW on buffer queue. */
 struct gve_rx_desc_dqo {
 	__le16 buf_id; /* ID returned in Rx completion descriptor */
diff --git a/drivers/net/ethernet/google/gve/gve_tx_dqo.c b/drivers/net/ethernet/google/gve/gve_tx_dqo.c
index 588d64819ed5..762915c6063b 100644
--- a/drivers/net/ethernet/google/gve/gve_tx_dqo.c
+++ b/drivers/net/ethernet/google/gve/gve_tx_dqo.c
@@ -953,12 +953,18 @@ int gve_clean_tx_done_dqo(struct gve_priv *priv, struct gve_tx_ring *tx,
 			atomic_set_release(&tx->dqo_compl.hw_tx_head, tx_head);
 		} else if (type == GVE_COMPL_TYPE_DQO_PKT) {
 			u16 compl_tag = le16_to_cpu(compl_desc->completion_tag);
-
-			gve_handle_packet_completion(priv, tx, !!napi,
-						     compl_tag,
-						     &pkt_compl_bytes,
-						     &pkt_compl_pkts,
-						     /*is_reinjection=*/false);
+			if (compl_tag & GVE_ALT_MISS_COMPL_BIT) {
+				compl_tag &= ~GVE_ALT_MISS_COMPL_BIT;
+				gve_handle_miss_completion(priv, tx, compl_tag,
+							   &miss_compl_bytes,
+							   &miss_compl_pkts);
+			} else {
+				gve_handle_packet_completion(priv, tx, !!napi,
+							     compl_tag,
+							     &pkt_compl_bytes,
+							     &pkt_compl_pkts,
+							     /*is_reinjection=*/false);
+			}
 		} else if (type == GVE_COMPL_TYPE_DQO_MISS) {
 			u16 compl_tag = le16_to_cpu(compl_desc->completion_tag);
 
-- 
2.38.1.431.g37b22c650d-goog


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH net-next v3 2/2] gve: Handle alternate miss completions
  2022-11-14 23:35 ` [PATCH net-next v3 2/2] gve: Handle alternate miss completions Jeroen de Borst
@ 2022-11-16  5:17   ` Saeed Mahameed
  2022-11-16 16:23     ` Jeroen de Borst
  0 siblings, 1 reply; 8+ messages in thread
From: Saeed Mahameed @ 2022-11-16  5:17 UTC (permalink / raw)
  To: Jeroen de Borst; +Cc: netdev, davem, kuba, jesse.brandeburg

On 14 Nov 15:35, Jeroen de Borst wrote:
>The virtual NIC has 2 ways of indicating a miss-path
>completion. This handles the alternate.
>
>Signed-off-by: Jeroen de Borst <jeroendb@google.com>
>Reviewed-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
>---
> drivers/net/ethernet/google/gve/gve_adminq.h   |  4 +++-
> drivers/net/ethernet/google/gve/gve_desc_dqo.h |  5 +++++
> drivers/net/ethernet/google/gve/gve_tx_dqo.c   | 18 ++++++++++++------
> 3 files changed, 20 insertions(+), 7 deletions(-)
>
>diff --git a/drivers/net/ethernet/google/gve/gve_adminq.h b/drivers/net/ethernet/google/gve/gve_adminq.h
>index b9ee8be73f96..cf29662e6ad1 100644
>--- a/drivers/net/ethernet/google/gve/gve_adminq.h
>+++ b/drivers/net/ethernet/google/gve/gve_adminq.h
>@@ -154,6 +154,7 @@ enum gve_driver_capbility {
> 	gve_driver_capability_gqi_rda = 1,
> 	gve_driver_capability_dqo_qpl = 2, /* reserved for future use */
> 	gve_driver_capability_dqo_rda = 3,
>+	gve_driver_capability_alt_miss_compl = 4,
> };
>
> #define GVE_CAP1(a) BIT((int)a)
>@@ -164,7 +165,8 @@ enum gve_driver_capbility {
> #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))
>+	 GVE_CAP1(gve_driver_capability_dqo_rda) | \
>+	 GVE_CAP1(gve_driver_capability_alt_miss_compl))
>
> #define GVE_DRIVER_CAPABILITY_FLAGS2 0x0
> #define GVE_DRIVER_CAPABILITY_FLAGS3 0x0
>diff --git a/drivers/net/ethernet/google/gve/gve_desc_dqo.h b/drivers/net/ethernet/google/gve/gve_desc_dqo.h
>index e8fe9adef7f2..f79cd0591110 100644
>--- a/drivers/net/ethernet/google/gve/gve_desc_dqo.h
>+++ b/drivers/net/ethernet/google/gve/gve_desc_dqo.h
>@@ -176,6 +176,11 @@ static_assert(sizeof(struct gve_tx_compl_desc) == 8);
> #define GVE_COMPL_TYPE_DQO_MISS 0x1 /* Miss path completion */
> #define GVE_COMPL_TYPE_DQO_REINJECTION 0x3 /* Re-injection completion */
>
>+/* The most significant bit in the completion tag can change the completion
>+ * type from packet completion to miss path completion.
>+ */
>+#define GVE_ALT_MISS_COMPL_BIT BIT(15)
>+
> /* Descriptor to post buffers to HW on buffer queue. */
> struct gve_rx_desc_dqo {
> 	__le16 buf_id; /* ID returned in Rx completion descriptor */
>diff --git a/drivers/net/ethernet/google/gve/gve_tx_dqo.c b/drivers/net/ethernet/google/gve/gve_tx_dqo.c
>index 588d64819ed5..762915c6063b 100644
>--- a/drivers/net/ethernet/google/gve/gve_tx_dqo.c
>+++ b/drivers/net/ethernet/google/gve/gve_tx_dqo.c
>@@ -953,12 +953,18 @@ int gve_clean_tx_done_dqo(struct gve_priv *priv, struct gve_tx_ring *tx,
> 			atomic_set_release(&tx->dqo_compl.hw_tx_head, tx_head);
> 		} else if (type == GVE_COMPL_TYPE_DQO_PKT) {
> 			u16 compl_tag = le16_to_cpu(compl_desc->completion_tag);
>-
>-			gve_handle_packet_completion(priv, tx, !!napi,
>-						     compl_tag,
>-						     &pkt_compl_bytes,
>-						     &pkt_compl_pkts,
>-						     /*is_reinjection=*/false);
>+			if (compl_tag & GVE_ALT_MISS_COMPL_BIT) {
>+				compl_tag &= ~GVE_ALT_MISS_COMPL_BIT;

nit: __test_and_clear_bit() and reduce to oneline. also you can drop the
braces in the if else statements once you squashed the two lines.

>+				gve_handle_miss_completion(priv, tx, compl_tag,
>+							   &miss_compl_bytes,
>+							   &miss_compl_pkts);
>+			} else {
>+				gve_handle_packet_completion(priv, tx, !!napi,
>+							     compl_tag,
>+							     &pkt_compl_bytes,
>+							     &pkt_compl_pkts,
>+							     /*is_reinjection=*/false);
>+			}
> 		} else if (type == GVE_COMPL_TYPE_DQO_MISS) {
> 			u16 compl_tag = le16_to_cpu(compl_desc->completion_tag);
>
>-- 
>2.38.1.431.g37b22c650d-goog
>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH net-next v3 1/2] gve: Adding a new AdminQ command to verify driver
  2022-11-14 23:35 ` [PATCH net-next v3 1/2] gve: Adding a new AdminQ command to verify driver Jeroen de Borst
@ 2022-11-16  5:34   ` Saeed Mahameed
  0 siblings, 0 replies; 8+ messages in thread
From: Saeed Mahameed @ 2022-11-16  5:34 UTC (permalink / raw)
  To: Jeroen de Borst; +Cc: netdev, davem, kuba, jesse.brandeburg

On 14 Nov 15:35, Jeroen de Borst wrote:
>Check whether the driver is compatible with the device
>presented.
>
>Signed-off-by: Jeroen de Borst <jeroendb@google.com>
>Reviewed-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
>---
> drivers/net/ethernet/google/gve/gve.h        |  1 +
> drivers/net/ethernet/google/gve/gve_adminq.c | 19 +++++++
> drivers/net/ethernet/google/gve/gve_adminq.h | 49 ++++++++++++++++++
> drivers/net/ethernet/google/gve/gve_main.c   | 52 ++++++++++++++++++++
> 4 files changed, 121 insertions(+)
>
>diff --git a/drivers/net/ethernet/google/gve/gve.h b/drivers/net/ethernet/google/gve/gve.h
>index 5655da9cd236..64eb0442c82f 100644
>--- a/drivers/net/ethernet/google/gve/gve.h
>+++ b/drivers/net/ethernet/google/gve/gve.h
>@@ -563,6 +563,7 @@ struct gve_priv {
> 	u32 adminq_report_stats_cnt;
> 	u32 adminq_report_link_speed_cnt;
> 	u32 adminq_get_ptype_map_cnt;
>+	u32 adminq_verify_driver_compatibility_cnt;
>
> 	/* Global stats */
> 	u32 interface_up_cnt; /* count of times interface turned up since last reset */
>diff --git a/drivers/net/ethernet/google/gve/gve_adminq.c b/drivers/net/ethernet/google/gve/gve_adminq.c
>index f7621ab672b9..6a12b30a9f87 100644
>--- a/drivers/net/ethernet/google/gve/gve_adminq.c
>+++ b/drivers/net/ethernet/google/gve/gve_adminq.c
>@@ -407,6 +407,9 @@ static int gve_adminq_issue_cmd(struct gve_priv *priv,
> 	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:
> 		dev_err(&priv->pdev->dev, "unknown AQ command opcode %d\n", opcode);
> 	}
>@@ -878,6 +881,22 @@ int gve_adminq_report_stats(struct gve_priv *priv, u64 stats_report_len,
> 	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 = cpu_to_be32(GVE_ADMINQ_VERIFY_DRIVER_COMPATIBILITY);
>+	cmd.verify_driver_compatibility = (struct gve_adminq_verify_driver_compatibility) {
>+		.driver_info_len = cpu_to_be64(driver_info_len),
>+		.driver_info_addr = cpu_to_be64(driver_info_addr),
>+	};
>+
>+	return gve_adminq_execute_cmd(priv, &cmd);
>+}
>+
> int gve_adminq_report_link_speed(struct gve_priv *priv)
> {
> 	union gve_adminq_command gvnic_cmd;
>diff --git a/drivers/net/ethernet/google/gve/gve_adminq.h b/drivers/net/ethernet/google/gve/gve_adminq.h
>index 83c0b40cd2d9..b9ee8be73f96 100644
>--- a/drivers/net/ethernet/google/gve/gve_adminq.h
>+++ b/drivers/net/ethernet/google/gve/gve_adminq.h
>@@ -24,6 +24,7 @@ enum gve_adminq_opcodes {
> 	GVE_ADMINQ_REPORT_STATS			= 0xC,
> 	GVE_ADMINQ_REPORT_LINK_SPEED		= 0xD,
> 	GVE_ADMINQ_GET_PTYPE_MAP		= 0xE,
>+	GVE_ADMINQ_VERIFY_DRIVER_COMPATIBILITY	= 0xF,
> };
>
> /* Admin queue status codes */
>@@ -146,6 +147,49 @@ enum gve_sup_feature_mask {
>
> #define GVE_DEV_OPT_LEN_GQI_RAW_ADDRESSING 0x0
>
>+#define GVE_VERSION_STR_LEN 128
>+
>+enum gve_driver_capbility {
>+	gve_driver_capability_gqi_qpl = 0,
>+	gve_driver_capability_gqi_rda = 1,
>+	gve_driver_capability_dqo_qpl = 2, /* reserved for future use */
>+	gve_driver_capability_dqo_rda = 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_CAP4(a) BIT(((int)a) - 192)
>+
>+#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;	/* 0x01 = Linux */
>+	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[GVE_VERSION_STR_LEN];
>+	u8 os_version_str2[GVE_VERSION_STR_LEN];
>+};
>+
>+struct gve_adminq_verify_driver_compatibility {
>+	__be64 driver_info_len;
>+	__be64 driver_info_addr;
>+};
>+
>+static_assert(sizeof(struct gve_adminq_verify_driver_compatibility) == 16);
>+
> struct gve_adminq_configure_device_resources {
> 	__be64 counter_array;
> 	__be64 irq_db_addr;
>@@ -345,6 +389,8 @@ union gve_adminq_command {
> 			struct gve_adminq_report_stats report_stats;
> 			struct gve_adminq_report_link_speed report_link_speed;
> 			struct gve_adminq_get_ptype_map get_ptype_map;
>+			struct gve_adminq_verify_driver_compatibility
>+						verify_driver_compatibility;
> 		};
> 	};
> 	u8 reserved[64];
>@@ -372,6 +418,9 @@ int gve_adminq_unregister_page_list(struct gve_priv *priv, u32 page_list_id);
> int gve_adminq_set_mtu(struct gve_priv *priv, u64 mtu);
> int gve_adminq_report_stats(struct gve_priv *priv, u64 stats_report_len,
> 			    dma_addr_t stats_report_addr, u64 interval);
>+int gve_adminq_verify_driver_compatibility(struct gve_priv *priv,
>+					   u64 driver_info_len,
>+					   dma_addr_t driver_info_addr);
> int gve_adminq_report_link_speed(struct gve_priv *priv);
>
> struct gve_ptype_lut;
>diff --git a/drivers/net/ethernet/google/gve/gve_main.c b/drivers/net/ethernet/google/gve/gve_main.c
>index 5a229a01f49d..5b40f9c53196 100644
>--- a/drivers/net/ethernet/google/gve/gve_main.c
>+++ b/drivers/net/ethernet/google/gve/gve_main.c
>@@ -12,6 +12,8 @@
> #include <linux/sched.h>
> #include <linux/timer.h>
> #include <linux/workqueue.h>
>+#include <linux/utsname.h>
>+#include <linux/version.h>
> #include <net/sch_generic.h>
> #include "gve.h"
> #include "gve_dqo.h"
>@@ -30,6 +32,49 @@
> const char gve_version_str[] = GVE_VERSION;
> static const char gve_version_prefix[] = GVE_VERSION_PREFIX;
>
>+static int gve_verify_driver_compatibility(struct gve_priv *priv)
>+{
>+	int err;
>+	struct gve_driver_info *driver_info;
>+	dma_addr_t driver_info_bus;
>+
>+	driver_info = dma_alloc_coherent(&priv->pdev->dev,
>+					 sizeof(struct gve_driver_info),
>+					 &driver_info_bus, GFP_KERNEL);
>+	if (!driver_info)
>+		return -ENOMEM;
>+
>+	*driver_info = (struct gve_driver_info) {
>+		.os_type = 1, /* Linux */
>+		.os_version_major = cpu_to_be32(LINUX_VERSION_MAJOR),
>+		.os_version_minor = cpu_to_be32(LINUX_VERSION_SUBLEVEL),
>+		.os_version_sub = cpu_to_be32(LINUX_VERSION_PATCHLEVEL),
>+		.driver_capability_flags = {
>+			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),
>+		},
>+	};
>+	strscpy(driver_info->os_version_str1, utsname()->release,
>+		sizeof(driver_info->os_version_str1));
>+	strscpy(driver_info->os_version_str2, utsname()->version,
>+		sizeof(driver_info->os_version_str2));
>+
>+	err = gve_adminq_verify_driver_compatibility(priv,
>+						     sizeof(struct gve_driver_info),
>+						     driver_info_bus);
>+
>+	/* It's ok if the device doesn't support this */
>+	if (err == -EOPNOTSUPP)
>+		err = 0;
>+
I always find these exception interesting so i had to attempt and chase this
error code down to the source and couldn't find it. 
I think you meant -ENOTSUPP: which comes from gve_adminq_parse_err()

case GVE_ADMINQ_COMMAND_ERROR_UNIMPLEMENTED:
		return -ENOTSUPP;

because there isn't any path in the code that returns -EOPNOTSUPP;

but isn't there any capability that could tell if driver version
compatibility command is supported by device, prior to issuing the command,
so the code can be more explicit.


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH net-next v3 0/2] gve: Handle alternate miss-completions
  2022-11-14 23:35 [PATCH net-next v3 0/2] gve: Handle alternate miss-completions Jeroen de Borst
  2022-11-14 23:35 ` [PATCH net-next v3 1/2] gve: Adding a new AdminQ command to verify driver Jeroen de Borst
  2022-11-14 23:35 ` [PATCH net-next v3 2/2] gve: Handle alternate miss completions Jeroen de Borst
@ 2022-11-16  5:38 ` Saeed Mahameed
  2 siblings, 0 replies; 8+ messages in thread
From: Saeed Mahameed @ 2022-11-16  5:38 UTC (permalink / raw)
  To: Jeroen de Borst; +Cc: netdev, davem, kuba, jesse.brandeburg

On 14 Nov 15:35, Jeroen de Borst wrote:
>Some versions of the virtual NIC present miss-completions in
>an alternative way. Let the diver handle these alternate completions
>and announce this capability to the device.
>

nit: you missed to document the 1st "new AdminQ command" patch which has
some special logic to validate driver/os version compatibility with the
device and if it's related to this cover-letter title if at all.

>Changed in v3:
>- Rewording cover letter
>- Added 'Reviewed-by: Jesse Brandeburg <jesse.brandeburg@intel.com>'
>Changes in v2:
>- Changed the subject to include 'gve:'
>
>
>Jeroen de Borst (2):
>  gve: Adding a new AdminQ command to verify driver
>  gve: Handle alternate miss completions
>
> drivers/net/ethernet/google/gve/gve.h         |  1 +
> drivers/net/ethernet/google/gve/gve_adminq.c  | 19 +++++++
> drivers/net/ethernet/google/gve/gve_adminq.h  | 51 ++++++++++++++++++
> .../net/ethernet/google/gve/gve_desc_dqo.h    |  5 ++
> drivers/net/ethernet/google/gve/gve_main.c    | 52 +++++++++++++++++++
> drivers/net/ethernet/google/gve/gve_tx_dqo.c  | 18 ++++---
> 6 files changed, 140 insertions(+), 6 deletions(-)
>
>-- 
>2.38.1.431.g37b22c650d-goog
>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH net-next v3 2/2] gve: Handle alternate miss completions
  2022-11-16  5:17   ` Saeed Mahameed
@ 2022-11-16 16:23     ` Jeroen de Borst
  2022-11-16 23:36       ` Saeed Mahameed
  0 siblings, 1 reply; 8+ messages in thread
From: Jeroen de Borst @ 2022-11-16 16:23 UTC (permalink / raw)
  To: Saeed Mahameed; +Cc: netdev, davem, kuba, jesse.brandeburg

Saeed,

Thanks for your review. I like the suggestion, but
__test_and_clear_bit is for unsigned longs, comptag is a short.

Jeroen


On Tue, Nov 15, 2022 at 9:17 PM Saeed Mahameed <saeed@kernel.org> wrote:
>
> On 14 Nov 15:35, Jeroen de Borst wrote:
> >The virtual NIC has 2 ways of indicating a miss-path
> >completion. This handles the alternate.
> >
> >Signed-off-by: Jeroen de Borst <jeroendb@google.com>
> >Reviewed-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
> >---
> > drivers/net/ethernet/google/gve/gve_adminq.h   |  4 +++-
> > drivers/net/ethernet/google/gve/gve_desc_dqo.h |  5 +++++
> > drivers/net/ethernet/google/gve/gve_tx_dqo.c   | 18 ++++++++++++------
> > 3 files changed, 20 insertions(+), 7 deletions(-)
> >
> >diff --git a/drivers/net/ethernet/google/gve/gve_adminq.h b/drivers/net/ethernet/google/gve/gve_adminq.h
> >index b9ee8be73f96..cf29662e6ad1 100644
> >--- a/drivers/net/ethernet/google/gve/gve_adminq.h
> >+++ b/drivers/net/ethernet/google/gve/gve_adminq.h
> >@@ -154,6 +154,7 @@ enum gve_driver_capbility {
> >       gve_driver_capability_gqi_rda = 1,
> >       gve_driver_capability_dqo_qpl = 2, /* reserved for future use */
> >       gve_driver_capability_dqo_rda = 3,
> >+      gve_driver_capability_alt_miss_compl = 4,
> > };
> >
> > #define GVE_CAP1(a) BIT((int)a)
> >@@ -164,7 +165,8 @@ enum gve_driver_capbility {
> > #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))
> >+       GVE_CAP1(gve_driver_capability_dqo_rda) | \
> >+       GVE_CAP1(gve_driver_capability_alt_miss_compl))
> >
> > #define GVE_DRIVER_CAPABILITY_FLAGS2 0x0
> > #define GVE_DRIVER_CAPABILITY_FLAGS3 0x0
> >diff --git a/drivers/net/ethernet/google/gve/gve_desc_dqo.h b/drivers/net/ethernet/google/gve/gve_desc_dqo.h
> >index e8fe9adef7f2..f79cd0591110 100644
> >--- a/drivers/net/ethernet/google/gve/gve_desc_dqo.h
> >+++ b/drivers/net/ethernet/google/gve/gve_desc_dqo.h
> >@@ -176,6 +176,11 @@ static_assert(sizeof(struct gve_tx_compl_desc) == 8);
> > #define GVE_COMPL_TYPE_DQO_MISS 0x1 /* Miss path completion */
> > #define GVE_COMPL_TYPE_DQO_REINJECTION 0x3 /* Re-injection completion */
> >
> >+/* The most significant bit in the completion tag can change the completion
> >+ * type from packet completion to miss path completion.
> >+ */
> >+#define GVE_ALT_MISS_COMPL_BIT BIT(15)
> >+
> > /* Descriptor to post buffers to HW on buffer queue. */
> > struct gve_rx_desc_dqo {
> >       __le16 buf_id; /* ID returned in Rx completion descriptor */
> >diff --git a/drivers/net/ethernet/google/gve/gve_tx_dqo.c b/drivers/net/ethernet/google/gve/gve_tx_dqo.c
> >index 588d64819ed5..762915c6063b 100644
> >--- a/drivers/net/ethernet/google/gve/gve_tx_dqo.c
> >+++ b/drivers/net/ethernet/google/gve/gve_tx_dqo.c
> >@@ -953,12 +953,18 @@ int gve_clean_tx_done_dqo(struct gve_priv *priv, struct gve_tx_ring *tx,
> >                       atomic_set_release(&tx->dqo_compl.hw_tx_head, tx_head);
> >               } else if (type == GVE_COMPL_TYPE_DQO_PKT) {
> >                       u16 compl_tag = le16_to_cpu(compl_desc->completion_tag);
> >-
> >-                      gve_handle_packet_completion(priv, tx, !!napi,
> >-                                                   compl_tag,
> >-                                                   &pkt_compl_bytes,
> >-                                                   &pkt_compl_pkts,
> >-                                                   /*is_reinjection=*/false);
> >+                      if (compl_tag & GVE_ALT_MISS_COMPL_BIT) {
> >+                              compl_tag &= ~GVE_ALT_MISS_COMPL_BIT;
>
> nit: __test_and_clear_bit() and reduce to oneline. also you can drop the
> braces in the if else statements once you squashed the two lines.
>
> >+                              gve_handle_miss_completion(priv, tx, compl_tag,
> >+                                                         &miss_compl_bytes,
> >+                                                         &miss_compl_pkts);
> >+                      } else {
> >+                              gve_handle_packet_completion(priv, tx, !!napi,
> >+                                                           compl_tag,
> >+                                                           &pkt_compl_bytes,
> >+                                                           &pkt_compl_pkts,
> >+                                                           /*is_reinjection=*/false);
> >+                      }
> >               } else if (type == GVE_COMPL_TYPE_DQO_MISS) {
> >                       u16 compl_tag = le16_to_cpu(compl_desc->completion_tag);
> >
> >--
> >2.38.1.431.g37b22c650d-goog
> >

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH net-next v3 2/2] gve: Handle alternate miss completions
  2022-11-16 16:23     ` Jeroen de Borst
@ 2022-11-16 23:36       ` Saeed Mahameed
  0 siblings, 0 replies; 8+ messages in thread
From: Saeed Mahameed @ 2022-11-16 23:36 UTC (permalink / raw)
  To: Jeroen de Borst; +Cc: netdev, davem, kuba, jesse.brandeburg

On 16 Nov 08:23, Jeroen de Borst wrote:
>Saeed,
>
>Thanks for your review. I like the suggestion, but
>__test_and_clear_bit is for unsigned longs, comptag is a short.
>

gcc will up-cast it for you with no problem.
Assuming it's unsigned short.. if not then consider changing it to unsigned
short, or do the casting yourself.

anyway this was just a minor suggestion. 

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2022-11-16 23:36 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-11-14 23:35 [PATCH net-next v3 0/2] gve: Handle alternate miss-completions Jeroen de Borst
2022-11-14 23:35 ` [PATCH net-next v3 1/2] gve: Adding a new AdminQ command to verify driver Jeroen de Borst
2022-11-16  5:34   ` Saeed Mahameed
2022-11-14 23:35 ` [PATCH net-next v3 2/2] gve: Handle alternate miss completions Jeroen de Borst
2022-11-16  5:17   ` Saeed Mahameed
2022-11-16 16:23     ` Jeroen de Borst
2022-11-16 23:36       ` Saeed Mahameed
2022-11-16  5:38 ` [PATCH net-next v3 0/2] gve: Handle alternate miss-completions Saeed Mahameed

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).