[SRU][J][PATCH 5/5] gve: Remove dependency on 4k page size.

Ian Whitfield ian.whitfield at canonical.com
Tue Apr 29 16:16:30 UTC 2025


From: John Fraker <jfraker at google.com>

BugLink: https://bugs.launchpad.net/bugs/2109537

Prior to this change, gve crashes when attempting to run in kernels with
page sizes other than 4k. This change removes unnecessary references to
PAGE_SIZE and replaces them with more meaningful constants.

Signed-off-by: Jordan Kimbrough <jrkim at google.com>
Signed-off-by: John Fraker <jfraker at google.com>
Reviewed-by: Willem de Bruijn <willemb at google.com>
Link: https://lore.kernel.org/r/20231128002648.320892-6-jfraker@google.com
Signed-off-by: Jakub Kicinski <kuba at kernel.org>
(backported from commit da7d4b42caf1b4d6ba3447bfd9ed185479fb0fe4)
[ijwhitfield: Ignored context and functions added by missing commits:
75eaae158b1b ("gve: Add XDP DROP and TX support for GQI-QPL format")
fd8e40321a123 ("gve: Add AF_XDP zero-copy support for GQI-QPL format")
37149e9374bf ("gve: Implement packet continuation for RX.")
82fd151d38d9f ("gve: Reduce alloc and copy costs in the GQ rx path")
39a7f4aa3e4a7 ("gve: Add XDP REDIRECT support for GQI-QPL format")
Some uses of PAGE_SIZE remain which would have been removed by
37149e9374bf, but they appear to not affect the behavior of MTU sizes
or immediately observable gVNIC behavior when comparing 4k and 64k
flavors.]
Signed-off-by: Ian Whitfield <ian.whitfield at canonical.com>
---
 drivers/net/ethernet/google/gve/gve.h         | 4 +++-
 drivers/net/ethernet/google/gve/gve_ethtool.c | 2 +-
 drivers/net/ethernet/google/gve/gve_main.c    | 2 +-
 drivers/net/ethernet/google/gve/gve_rx.c      | 4 ++--
 drivers/net/ethernet/google/gve/gve_tx.c      | 2 +-
 5 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/drivers/net/ethernet/google/gve/gve.h b/drivers/net/ethernet/google/gve/gve.h
index d7de150717e4..8768e4a8793c 100644
--- a/drivers/net/ethernet/google/gve/gve.h
+++ b/drivers/net/ethernet/google/gve/gve.h
@@ -48,7 +48,9 @@
 /* PTYPEs are always 10 bits. */
 #define GVE_NUM_PTYPES	1024
 
-#define GVE_RX_BUFFER_SIZE_DQO 2048
+#define GVE_DEFAULT_RX_BUFFER_SIZE 2048
+
+#define GVE_DEFAULT_RX_BUFFER_OFFSET 2048
 
 #define GVE_GQ_TX_MIN_PKT_DESC_BYTES 182
 
diff --git a/drivers/net/ethernet/google/gve/gve_ethtool.c b/drivers/net/ethernet/google/gve/gve_ethtool.c
index 1f8cc722aae3..e890785c4f22 100644
--- a/drivers/net/ethernet/google/gve/gve_ethtool.c
+++ b/drivers/net/ethernet/google/gve/gve_ethtool.c
@@ -463,7 +463,7 @@ static int gve_set_tunable(struct net_device *netdev,
 	case ETHTOOL_RX_COPYBREAK:
 	{
 		u32 max_copybreak = gve_is_gqi(priv) ?
-			(PAGE_SIZE / 2) : priv->data_buffer_size_dqo;
+			GVE_DEFAULT_RX_BUFFER_SIZE : priv->data_buffer_size_dqo;
 
 		len = *(u32 *)value;
 		if (len > max_copybreak)
diff --git a/drivers/net/ethernet/google/gve/gve_main.c b/drivers/net/ethernet/google/gve/gve_main.c
index 2e2069e8130b..56e194f0bda2 100644
--- a/drivers/net/ethernet/google/gve/gve_main.c
+++ b/drivers/net/ethernet/google/gve/gve_main.c
@@ -932,7 +932,7 @@ static int gve_open(struct net_device *dev)
 		/* Hard code this for now. This may be tuned in the future for
 		 * performance.
 		 */
-		priv->data_buffer_size_dqo = GVE_RX_BUFFER_SIZE_DQO;
+		priv->data_buffer_size_dqo = GVE_DEFAULT_RX_BUFFER_SIZE;
 	}
 	err = gve_create_rings(priv);
 	if (err)
diff --git a/drivers/net/ethernet/google/gve/gve_rx.c b/drivers/net/ethernet/google/gve/gve_rx.c
index a295bffd6e7d..582cb1127a06 100644
--- a/drivers/net/ethernet/google/gve/gve_rx.c
+++ b/drivers/net/ethernet/google/gve/gve_rx.c
@@ -281,10 +281,10 @@ static struct sk_buff *gve_rx_add_frags(struct napi_struct *napi,
 
 static void gve_rx_flip_buff(struct gve_rx_slot_page_info *page_info, __be64 *slot_addr)
 {
-	const __be64 offset = cpu_to_be64(PAGE_SIZE / 2);
+	const __be64 offset = cpu_to_be64(GVE_DEFAULT_RX_BUFFER_OFFSET);
 
 	/* "flip" to other packet buffer on this page */
-	page_info->page_offset ^= PAGE_SIZE / 2;
+	page_info->page_offset ^= GVE_DEFAULT_RX_BUFFER_OFFSET;
 	*(slot_addr) ^= offset;
 }
 
diff --git a/drivers/net/ethernet/google/gve/gve_tx.c b/drivers/net/ethernet/google/gve/gve_tx.c
index 0abfeba83725..a1d5033dee37 100644
--- a/drivers/net/ethernet/google/gve/gve_tx.c
+++ b/drivers/net/ethernet/google/gve/gve_tx.c
@@ -607,7 +607,7 @@ netdev_tx_t gve_tx(struct sk_buff *skb, struct net_device *dev)
 	return NETDEV_TX_OK;
 }
 
-#define GVE_TX_START_THRESH	PAGE_SIZE
+#define GVE_TX_START_THRESH	4096
 
 static int gve_clean_tx_done(struct gve_priv *priv, struct gve_tx_ring *tx,
 			     u32 to_do, bool try_to_wake)
-- 
2.43.0




More information about the kernel-team mailing list