Commit a2f19184 authored by Matt Olson's avatar Matt Olson Committed by Jakub Kicinski
Browse files

gve: Enable reading max ring size from the device in DQO-QPL mode



The gVNIC device indicates a device option (MODIFY_RING) to the driver,
which presents a range of ring sizes from which the user is allowed to
select. But in DQO-QPL queue format, the driver ignores the "max" of
this range and instead allows the user to configure the ring size in the
range [min, default]. This was done because increasing the ring size
could result in the number of registered pages being higher than the max
allowed by the device.

In order to support large ring sizes, stop ignoring the "max" of the
range presented in the MODIFY_RING option.

Signed-off-by: default avatarMatt Olson <maolson@google.com>
Signed-off-by: default avatarMax Yuan <maxyuan@google.com>
Reviewed-by: default avatarJordan Rhee <jordanrhee@google.com>
Reviewed-by: default avatarHarshitha Ramamurthy <hramamurthy@google.com>
Reviewed-by: default avatarPraveen Kaligineedi <pkaligineedi@google.com>
Signed-off-by: default avatarJoshua Washington <joshwash@google.com>
Link: https://patch.msgid.link/20260225182342.1049816-3-joshwash@google.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 07993df5
Loading
Loading
Loading
Loading
+4 −6
Original line number Diff line number Diff line
@@ -989,12 +989,10 @@ static void gve_enable_supported_features(struct gve_priv *priv,
	if (dev_op_modify_ring &&
	    (supported_features_mask & GVE_SUP_MODIFY_RING_MASK)) {
		priv->modify_ring_size_enabled = true;

		/* max ring size for DQO QPL should not be overwritten because of device limit */
		if (priv->queue_format != GVE_DQO_QPL_FORMAT) {
			priv->max_rx_desc_cnt = be16_to_cpu(dev_op_modify_ring->max_rx_ring_size);
			priv->max_tx_desc_cnt = be16_to_cpu(dev_op_modify_ring->max_tx_ring_size);
		}
		priv->max_rx_desc_cnt =
			be16_to_cpu(dev_op_modify_ring->max_rx_ring_size);
		priv->max_tx_desc_cnt =
			be16_to_cpu(dev_op_modify_ring->max_tx_ring_size);
		if (priv->default_min_ring_size) {
			/* If device hasn't provided minimums, use default minimums */
			priv->min_tx_desc_cnt = GVE_DEFAULT_MIN_TX_RING_SIZE;