[SRU][N:linux-gke][PULL] Support larger gVNIC queue depth on Gen3+ GCE VMs

Rickey Castillo Valenzuela rickey.castillo.valenzuela at canonical.com
Thu Aug 13 21:25:55 UTC 2026


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

SRU Justification

[Impact]

Currently, the maximum queue depth supported for gVNIC on overcommitted 
Gen3+
VMs such as N4 is 1K, whereas the maximum queue depth supported on 
Gen1/Gen2 VMs
is 2K. Customers who are migrating their workloads from N2 to N4 have 
requested
higher queue depth support on N4 VMs. This patchset was already applied 
on GCP
kernel and now is being added for GKE.

[Fix]

Target patches:
a2f19184014f ("gve: Enable reading max ring size from the device in 
DQO-QPL mode")
07993df56091 ("gve: Update QPL page registration logic")

Noble (6.8):
Several additional patches were included to enable all the features 
required
for the target patches, and reduce how much distance these patches have 
from
upstream. Details on the backport are in each commit message. Generally,
later commits depend on earlier commits. Fixes for any prerequisite 
patches here
were applied after the target commits. This is the patch series that was
included in GCP plus a fix commit (d676c9a73bdc) compared to when GCP PR 
was
submitted. The plan to submit this fix to GCP too.

7cea48b9a4b2 ("gve: Define config structs for queue allocation")
1dfc2e46117e ("gve: Refactor napi add and remove functions")
f13697cc7a19 ("gve: Switch to config-aware queue allocation")
92a6d7a4010c ("gve: Refactor gve_open and gve_close")
5f08cd3d6423 ("gve: Alloc before freeing when adjusting queues")
f3753771e7cc ("gve: Alloc before freeing when changing features")
0b43cf527d1d ("gve: Add header split device option")
5e37d8254e7f ("gve: Add header split data path")
056a70924a02 ("gve: Add header split ethtool stats")
4cbc70f6ec5e ("gve: simplify setting decriptor count defaults")
5dee3c702c20 ("gve: make the completion and buffer ring size equal for 
DQO")
b94d3703c1a6 ("gve: set page count for RX QPL for GQI and DQO queue 
formats")
ed4fb326947d ("gve: add support to read ring size ranges from the device")
834f9458f2fd ("gve: add support to change ring size via ethtool")
fdf412374379 ("gve: Remove qpl_cfg struct since qpl_ids map with queues 
respectively")
087b24de5c82 ("queue_api: define queue api")
dcecfcf21bd1 ("gve: Make the GQ RX free queue funcs idempotent")
242f30fe692e ("gve: Add adminq funcs to add/remove a single Rx queue")
5abc37bdcbc5 ("gve: Make gve_turn(up|down) ignore stopped queues")
864616d97a45 ("gve: Make gve_turnup work for nonempty queues")
9a5e0776d11f ("gve: Avoid rescheduling napi if on wrong cpu")
770f52d5a0ed ("gve: Reset Rx ring state in the ring-stop funcs")
af9bcf910b1f ("gve: Account for stopped queues when reading NIC stats")
ee24284e2a10 ("gve: Alloc and free QPLs with the rings")
c93462b914db ("gve: Implement queue api")
07993df56091 ("gve: Update QPL page registration logic")
a2f19184014f ("gve: Enable reading max ring size from the device in 
DQO-QPL mode")
fba917b169be ("gve: Fix use of netif_carrier_ok()")
de63ac44a527 ("gve: fix XDP allocation path in edge cases")
3d970eda0034 ("gve: defer interrupt enabling until NAPI registration")
d676c9a73bdc ("gve: fix header buffer corruption with header-split and 
HW-GRO")

[Test Plan]

* Compile Tested
* The following output indicates the feature is missing:
     $ sudo ethtool -G ens3 rx 4096
     netlink error: Operation not supported
   So the test plan for Canonical was to confirm that `sudo ethtool -G 
enp0s0 rx
   4096` exits successfully without an error.
* As well as this command, it should return 4096 as max no 1024:
   ethtool -g enp0s0

* This patchset for the GCP version has been in production for a few cycles

[Regression potential]

On Noble, regressions should only be possible when using the gVNIC 
device for
networking (which depends on the gve driver), and could most likely 
result in
networking failures on those configurations.

[Other]

SF: 00433236 (for GCP variants)
PIT: 509371317 (for GKE variants)

---------------------------------------------------------------------------------- 

The following changes since commit 
f5239ce8ce612354420d8f6f89e81dcfd99b664a:

   UBUNTU: Ubuntu-gke-6.8.0-1061.69 (2026-08-10 21:32:33 -0400)

are available in the Git repository at:

git+ssh://git.launchpad.net/~rickeycv/ubuntu/+source/linux-gke/+git/noble 
gve-for-noble-gke-pr

for you to fetch changes up to 6ebf026065c35bf3807ebd8280a473e006c4a83f:

   gve: fix header buffer corruption with header-split and HW-GRO 
(2026-08-12 16:11:18 -0600)

----------------------------------------------------------------
Ankit Garg (2):
       gve: defer interrupt enabling until NAPI registration
       gve: fix header buffer corruption with header-split and HW-GRO

Harshitha Ramamurthy (5):
       gve: simplify setting decriptor count defaults
       gve: make the completion and buffer ring size equal for DQO
       gve: set page count for RX QPL for GQI and DQO queue formats
       gve: add support to read ring size ranges from the device
       gve: add support to change ring size via ethtool

Ian Whitfield (1):
       UBUNTU: SAUCE: Revert "gve: defer interrupt enabling until NAPI 
registration"

Jeroen de Borst (3):
       gve: Add header split device option
       gve: Add header split data path
       gve: Add header split ethtool stats

Joshua Washington (1):
       gve: fix XDP allocation path in edge cases

Matt Olson (2):
       gve: Update QPL page registration logic
       gve: Enable reading max ring size from the device in DQO-QPL mode

Mina Almasry (1):
       queue_api: define queue api

Praveen Kaligineedi (1):
       gve: Fix use of netif_carrier_ok()

Shailend Chand (15):
       gve: Define config structs for queue allocation
       gve: Refactor napi add and remove functions
       gve: Switch to config-aware queue allocation
       gve: Refactor gve_open and gve_close
       gve: Alloc before freeing when adjusting queues
       gve: Alloc before freeing when changing features
       gve: Make the GQ RX free queue funcs idempotent
       gve: Add adminq funcs to add/remove a single Rx queue
       gve: Make gve_turn(up|down) ignore stopped queues
       gve: Make gve_turnup work for nonempty queues
       gve: Avoid rescheduling napi if on wrong cpu
       gve: Reset Rx ring state in the ring-stop funcs
       gve: Account for stopped queues when reading NIC stats
       gve: Alloc and free QPLs with the rings
       gve: Implement queue api

Ziwei Xiao (1):
       gve: Remove qpl_cfg struct since qpl_ids map with queues 
respectively

  drivers/net/ethernet/google/gve/gve.h         |  191 
++++++++++++++++++++------------
  drivers/net/ethernet/google/gve/gve_adminq.c  |  261 
+++++++++++++++++++++++++++-----------------
  drivers/net/ethernet/google/gve/gve_adminq.h  |   64 ++++++++---
  drivers/net/ethernet/google/gve/gve_dqo.h     |   24 +++-
  drivers/net/ethernet/google/gve/gve_ethtool.c |  167 
++++++++++++++++++++++++----
  drivers/net/ethernet/google/gve/gve_main.c    | 1099 
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------------------------------------------------
  drivers/net/ethernet/google/gve/gve_rx.c      |  209 
++++++++++++++++++++++++-----------
  drivers/net/ethernet/google/gve/gve_rx_dqo.c  |  258 
+++++++++++++++++++++++++++++++++++--------
  drivers/net/ethernet/google/gve/gve_tx.c      |  138 
++++++++++++++++-------
  drivers/net/ethernet/google/gve/gve_tx_dqo.c  |  112 ++++++++++++++-----
  drivers/net/ethernet/google/gve/gve_utils.c   |   50 ++++++++-
  drivers/net/ethernet/google/gve/gve_utils.h   |    8 ++
  include/linux/netdevice.h                     |    3 +
  include/net/netdev_queues.h                   |   31 ++++++
  14 files changed, 1827 insertions(+), 788 deletions(-)




More information about the kernel-team mailing list