From nobody Sat Sep 26 06:20:32 2026 Received: from mail-pl1-f198.google.com (mail-pl1-f198.google.com [209.85.214.198]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 05F63427FA2 for ; Thu, 3 Sep 2026 21:56:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.198 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788472572; cv=none; b=Rhdw956Kg4BYqyoUJrYZEC0hPL9TcMQ0oHS0+0waBTudh8azhYGDaIgvLA6ehuo1cCRCLbeWNXs2oJRvxnOzvt6CUD0NuPdxVIX7FhC9YPqBCZ7+QvJrx9Yco40JJhk/w+KWsaqsgT6ees4rfWQjJNlEmj+kqMcwqZP9AubWFKE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788472572; c=relaxed/simple; bh=OyzjXZblqUtKAJeFwgPVYOZOLzQC5vyt/7+Nac32u8k=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=cYFxbjoqfXK6OQ5vhj4z5BGFX3EHSCAEZGmqZnl6X4zp5AG99E2Jx5JZZf9Doqi8TaiGeflcu/0NYKnL1mYMYqHcefISDIYQ+KAxY0q8MShqSKttFZtnKaH+pkOZdw19yy5+xRNLMvTcGhAgDWVadpoeKMyIhJLgeNHPlVQYj9g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--hramamurthy.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=p8AKNYDs; arc=none smtp.client-ip=209.85.214.198 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--hramamurthy.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="p8AKNYDs" Received: by mail-pl1-f198.google.com with SMTP id d9443c01a7336-2ce7dfd33ffso4162385ad.0 for ; Thu, 03 Sep 2026 14:56:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1788472569; x=1789077369; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=AqYG+kT2i7n9rfT/llCgGrJF7/D5sIm21z0UoIh3dYg=; b=p8AKNYDsX+XgQkflecgq7XaUViEZTHz5KsykWQOVGNiePvyDaB6DOgWSi8r4H3PFgV ua6MOUCC+ZVn+7QN0V5yxlVo1q3tYv8DYhFW7kSSFsoX2P4YI7Y0Uj7JUu5nugTN1va8 7WLPTFrYhOwITbsKWrCcGo8dQeU7RheMJJi6TXFg660pTG//vwCn55yagT5qeX6DSWzg 1Oz2GLEATgUil+PdflbZBV+CtlBS1UcTZW4UDBkMdcpkvXkj/TXk5jLXUIiKAZaWevmt 1MTf0Agzz0T+6eK0AJ0Mmqiu9Uft+JDmtdpVCSgdwOqp3NZM/2UMhtmEczuu3gCV6iC+ 8CQg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788472569; x=1789077369; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=AqYG+kT2i7n9rfT/llCgGrJF7/D5sIm21z0UoIh3dYg=; b=F/1jAMT+bSPLc136bAp2dZ88YwijloxH3WOsd+pvsDBg13VO1nHGt+N438FEB0h6OZ ZaNZSDZgUD1W4uJOQn2Qdd9ICNEnRlAOTLDORarG8DUrwSPm+H+pPl2rzZQ98kbEhdOf jfoIjDos4fLdup9mLA6PYTESG5i01Un8rXIQQf865rU2XUyEIBzY8CNaSx7LWXX+27ZQ XSzyCj/nIdOgY0QAuUfG+R7QrAUo81XczxvZvrqHJDFAdUNNdORpJMdRSKAJRendcoTR 7jnB1NklEpvvs2dy9DbzxFWn5ELdP7CcE28eqIfemNKoFugZPYRi414hmsbw+wrTtPDZ FUOg== X-Forwarded-Encrypted: i=1; AKwUvBwc9QNdqSEbWFsyp34EPOvLUr0hkCFzuQXNoymRcHJVRvEeA8Qhk2TcB1NtT7qqJZxK0miAKVSAJeKL6qc=@vger.kernel.org X-Gm-Message-State: AFuF++mGvjsHRurApmqvZVua4lKs9PouE0JBYCSzAFn4tPVlFdbhHmWn qBvNMwU0iGSAwA/5j6hQPoodO80AYyVQSIBi1Aclz21hVFFUjh8I8JAMSNAdjzygGHa14b8YUtp s5JNEwDWxm8L+e52kOOYHxDM46g== X-Received: from pldv10.prod.google.com ([2002:a17:902:ca8a:b0:2ca:ceab:34ae]) (user=hramamurthy job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:d48b:b0:2d8:d4cc:be62 with SMTP id d9443c01a7336-2db12840380mr26913285ad.15.1788472569044; Thu, 03 Sep 2026 14:56:09 -0700 (PDT) Date: Thu, 3 Sep 2026 21:55:55 +0000 In-Reply-To: <20260903215606.31633-1-hramamurthy@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260903215606.31633-1-hramamurthy@google.com> X-Mailer: git-send-email 2.55.0.979.g7e5102b832-goog Message-ID: <20260903215606.31633-2-hramamurthy@google.com> Subject: [PATCH net-next v5 01/12] gve: add struct gve_device_info to hold device properties From: Harshitha Ramamurthy To: netdev@vger.kernel.org Cc: joshwash@google.com, hramamurthy@google.com, andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, ast@kernel.org, daniel@iogearbox.net, hawk@kernel.org, john.fastabend@gmail.com, sdf@fomichev.me, jordanrhee@google.com, willemb@google.com, nktgrg@google.com, maolson@google.com, thostet@google.com, jacob.e.keller@intel.com, debarghyak@google.com, kees@kernel.org, bpf@vger.kernel.org, linux-kernel@vger.kernel.org, przemyslaw.kitszel@intel.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" In the current AdminQ mode, device properties are written into struct gve_device_descriptor that is allocated in shared memory between the driver and device. In the upcoming MailboxQ mode, these properties will be returned in the response of a mailbox message. Hence, add struct gve_device_info as the structure that holds all the properties that are negotiated with the device in either mode. Change the AdminQ mode method gve_adminq_describe_device() and its children to fill up device information into this newly introduced struct gve_device_info. Move a few helper functions and code that set device properties in the priv structure into gve_init_priv(). So now gve_init_priv() calls/does the following: - gve_set_mtu() - gve_set_mac() - gve_set_queue_properties() - gve_set_buf_sizes() - set flow steering and RSS properties - set other priv properties When MailboxQ support is added, device information will be filled into the same structure and the same gve_init_priv() path would be used to set device properties to ensure common code reusage. These changes are refactors only, no functional change. Reviewed-by: Willem de Bruijn Reviewed-by: Jordan Rhee Reviewed-by: Przemek Kitszel Signed-off-by: Harshitha Ramamurthy --- v5: - ensure using default_tx/rx_queues (Sashiko) - honor device provided rx buffer size correctly (Sashiko) v4: - reuse mtu variable v3: - Read default_min_ring_size from device info instead of priv drivers/net/ethernet/google/gve/gve.h | 29 +++++ drivers/net/ethernet/google/gve/gve_adminq.c | 128 +++++++++++-------- drivers/net/ethernet/google/gve/gve_adminq.h | 6 - drivers/net/ethernet/google/gve/gve_main.c | 86 +++++++++---- 4 files changed, 169 insertions(+), 80 deletions(-) diff --git a/drivers/net/ethernet/google/gve/gve.h b/drivers/net/ethernet/g= oogle/gve/gve.h index c280ff35ee77..021adb9108df 100644 --- a/drivers/net/ethernet/google/gve/gve.h +++ b/drivers/net/ethernet/google/gve/gve.h @@ -797,6 +797,34 @@ struct gve_ptp { struct gve_priv *priv; }; =20 +struct gve_device_info { + enum gve_queue_format queue_format; + u16 default_tx_queues; + u16 default_rx_queues; + u16 max_tx_queues; + u16 max_rx_queues; + u16 default_tx_ring_size; + u16 default_rx_ring_size; + u16 max_tx_ring_size; + u16 max_rx_ring_size; + u16 min_tx_ring_size; + u16 min_rx_ring_size; + u16 max_mtu; + u8 mac[ETH_ALEN]; + u16 max_rx_buffer_size; + u16 header_buf_size; + u32 max_flow_rules; + u16 rss_key_size; + u16 rss_lut_size; + u16 tx_pages_per_qpl; + u16 num_event_counters; + u64 max_registered_pages; + bool default_min_ring_size; + bool nic_timestamp_supported; + bool modify_ring_size_enabled; + bool cache_rss_config; +}; + struct gve_priv { struct net_device *dev; struct gve_tx_ring *tx; /* array of tx_cfg.num_queues */ @@ -929,6 +957,7 @@ struct gve_priv { struct gve_nic_ts_report *nic_ts_report; dma_addr_t nic_ts_report_bus; u64 last_sync_nic_counter; /* Clock counter from last NIC TS report */ + struct gve_device_info device_info; }; =20 enum gve_service_task_flags_bit { diff --git a/drivers/net/ethernet/google/gve/gve_adminq.c b/drivers/net/eth= ernet/google/gve/gve_adminq.c index f05f4895f4c7..512349c5517f 100644 --- a/drivers/net/ethernet/google/gve/gve_adminq.c +++ b/drivers/net/ethernet/google/gve/gve_adminq.c @@ -70,7 +70,7 @@ void gve_parse_device_option(struct gve_priv *priv, =20 dev_info(&priv->pdev->dev, "Gqi raw addressing device option enabled.\n"); - priv->queue_format =3D GVE_GQI_RDA_FORMAT; + priv->device_info.queue_format =3D GVE_GQI_RDA_FORMAT; break; case GVE_DEV_OPT_ID_GQI_RDA: if (option_length < sizeof(**dev_op_gqi_rda) || @@ -190,7 +190,7 @@ void gve_parse_device_option(struct gve_priv *priv, =20 /* device has not provided min ring size */ if (option_length =3D=3D GVE_DEVICE_OPTION_NO_MIN_RING_SIZE) - priv->default_min_ring_size =3D true; + priv->device_info.default_min_ring_size =3D true; break; case GVE_DEV_OPT_ID_FLOW_STEERING: if (option_length < sizeof(**dev_op_flow_steering) || @@ -922,10 +922,13 @@ int gve_adminq_destroy_rx_queues(struct gve_priv *pri= v, u32 num_queues) =20 static void gve_set_default_rss_sizes(struct gve_priv *priv) { - if (!gve_is_gqi(priv)) { - priv->rss_key_size =3D GVE_RSS_KEY_SIZE; - priv->rss_lut_size =3D GVE_RSS_INDIR_SIZE; - priv->cache_rss_config =3D true; + struct gve_device_info *device_info =3D &priv->device_info; + + if (device_info->queue_format =3D=3D GVE_DQO_RDA_FORMAT || + device_info->queue_format =3D=3D GVE_DQO_QPL_FORMAT) { + device_info->rss_key_size =3D GVE_RSS_KEY_SIZE; + device_info->rss_lut_size =3D GVE_RSS_INDIR_SIZE; + device_info->cache_rss_config =3D true; } } =20 @@ -946,77 +949,105 @@ static void gve_enable_supported_features(struct gve= _priv *priv, const struct gve_device_option_modify_ring *dev_op_modify_ring) { + struct gve_device_info *info =3D &priv->device_info; + /* Before control reaches this point, the page-size-capped max MTU from * the gve_device_descriptor field has already been stored in - * priv->dev->max_mtu. We overwrite it with the true max MTU below. + * device_info->max_mtu. We overwrite it with the true max MTU below. */ if (dev_op_jumbo_frames && (supported_features_mask & GVE_SUP_JUMBO_FRAMES_MASK)) { dev_info(&priv->pdev->dev, "JUMBO FRAMES device option enabled.\n"); - priv->dev->max_mtu =3D be16_to_cpu(dev_op_jumbo_frames->max_mtu); + info->max_mtu =3D be16_to_cpu(dev_op_jumbo_frames->max_mtu); } =20 if (dev_op_buffer_sizes && (supported_features_mask & GVE_SUP_BUFFER_SIZES_MASK)) { - priv->max_rx_buffer_size =3D + info->max_rx_buffer_size =3D be16_to_cpu(dev_op_buffer_sizes->packet_buffer_size); - priv->header_buf_size =3D + info->header_buf_size =3D be16_to_cpu(dev_op_buffer_sizes->header_buffer_size); dev_info(&priv->pdev->dev, "BUFFER SIZES device option enabled with max_rx_buffer_size of %u, hea= der_buf_size of %u.\n", - priv->max_rx_buffer_size, priv->header_buf_size); - if (gve_is_dqo(priv) && - priv->max_rx_buffer_size > GVE_DEFAULT_RX_BUFFER_SIZE) - priv->rx_cfg.packet_buffer_size =3D - priv->max_rx_buffer_size; + info->max_rx_buffer_size, info->header_buf_size); } =20 /* Read and store ring size ranges given by device */ if (dev_op_modify_ring && (supported_features_mask & GVE_SUP_MODIFY_RING_MASK)) { - priv->modify_ring_size_enabled =3D true; - priv->max_rx_desc_cnt =3D + info->modify_ring_size_enabled =3D true; + info->max_rx_ring_size =3D be16_to_cpu(dev_op_modify_ring->max_rx_ring_size); - priv->max_tx_desc_cnt =3D + info->max_tx_ring_size =3D be16_to_cpu(dev_op_modify_ring->max_tx_ring_size); - if (priv->default_min_ring_size) { + if (info->default_min_ring_size) { /* If device hasn't provided minimums, use default minimums */ - priv->min_tx_desc_cnt =3D GVE_DEFAULT_MIN_TX_RING_SIZE; - priv->min_rx_desc_cnt =3D GVE_DEFAULT_MIN_RX_RING_SIZE; + info->min_tx_ring_size =3D GVE_DEFAULT_MIN_TX_RING_SIZE; + info->min_rx_ring_size =3D GVE_DEFAULT_MIN_RX_RING_SIZE; } else { - priv->min_rx_desc_cnt =3D be16_to_cpu(dev_op_modify_ring->min_rx_ring_s= ize); - priv->min_tx_desc_cnt =3D be16_to_cpu(dev_op_modify_ring->min_tx_ring_s= ize); + info->min_rx_ring_size =3D + be16_to_cpu(dev_op_modify_ring->min_rx_ring_size); + info->min_tx_ring_size =3D + be16_to_cpu(dev_op_modify_ring->min_tx_ring_size); } } =20 if (dev_op_flow_steering && (supported_features_mask & GVE_SUP_FLOW_STEERING_MASK)) { if (dev_op_flow_steering->max_flow_rules) { - priv->max_flow_rules =3D + info->max_flow_rules =3D be32_to_cpu(dev_op_flow_steering->max_flow_rules); - priv->dev->hw_features |=3D NETIF_F_NTUPLE; dev_info(&priv->pdev->dev, "FLOW STEERING device option enabled with max rule limit of %u.\n", - priv->max_flow_rules); + info->max_flow_rules); } } =20 if (dev_op_rss_config && (supported_features_mask & GVE_SUP_RSS_CONFIG_MASK)) { - priv->rss_key_size =3D + info->rss_key_size =3D be16_to_cpu(dev_op_rss_config->hash_key_size); - priv->rss_lut_size =3D + info->rss_lut_size =3D be16_to_cpu(dev_op_rss_config->hash_lut_size); - priv->cache_rss_config =3D false; + info->cache_rss_config =3D false; dev_dbg(&priv->pdev->dev, "RSS device option enabled with key size of %u, lut size of %u.\n", - priv->rss_key_size, priv->rss_lut_size); + info->rss_key_size, info->rss_lut_size); } =20 if (dev_op_nic_timestamp && (supported_features_mask & GVE_SUP_NIC_TIMESTAMP_MASK)) - priv->nic_timestamp_supported =3D true; + info->nic_timestamp_supported =3D true; +} + +static void gve_fill_device_info(struct gve_priv *priv, + struct gve_device_descriptor *descriptor) +{ + struct gve_device_info *device_info =3D &priv->device_info; + u16 default_num_queues; + + device_info->tx_pages_per_qpl =3D + be16_to_cpu(descriptor->tx_pages_per_qpl); + device_info->max_registered_pages =3D + be64_to_cpu(descriptor->max_registered_pages); + device_info->num_event_counters =3D be16_to_cpu(descriptor->counters); + ether_addr_copy(device_info->mac, descriptor->mac); + device_info->max_mtu =3D be16_to_cpu(descriptor->mtu); + + default_num_queues =3D be16_to_cpu(descriptor->default_num_queues); + device_info->default_tx_queues =3D default_num_queues; + device_info->default_rx_queues =3D default_num_queues; + device_info->default_tx_ring_size =3D + be16_to_cpu(descriptor->tx_queue_entries); + device_info->default_rx_ring_size =3D + be16_to_cpu(descriptor->rx_queue_entries); + + /* set default ranges */ + device_info->max_tx_ring_size =3D device_info->default_tx_ring_size; + device_info->max_rx_ring_size =3D device_info->default_rx_ring_size; + device_info->min_tx_ring_size =3D device_info->default_tx_ring_size; + device_info->min_rx_ring_size =3D device_info->default_rx_ring_size; } =20 int gve_adminq_describe_device(struct gve_priv *priv) @@ -1027,6 +1058,7 @@ int gve_adminq_describe_device(struct gve_priv *priv) struct gve_device_option_jumbo_frames *dev_op_jumbo_frames =3D NULL; struct gve_device_option_modify_ring *dev_op_modify_ring =3D NULL; struct gve_device_option_rss_config *dev_op_rss_config =3D NULL; + struct gve_device_info *device_info =3D &priv->device_info; struct gve_device_option_gqi_rda *dev_op_gqi_rda =3D NULL; struct gve_device_option_gqi_qpl *dev_op_gqi_qpl =3D NULL; struct gve_device_option_dqo_rda *dev_op_dqo_rda =3D NULL; @@ -1070,26 +1102,26 @@ int gve_adminq_describe_device(struct gve_priv *pri= v) * DqoRda, DqoQpl, GqiRda, GqiQpl. Use GqiQpl as default. */ if (dev_op_dqo_rda) { - priv->queue_format =3D GVE_DQO_RDA_FORMAT; + device_info->queue_format =3D GVE_DQO_RDA_FORMAT; dev_info(&priv->pdev->dev, "Driver is running with DQO RDA queue format.\n"); supported_features_mask =3D be32_to_cpu(dev_op_dqo_rda->supported_features_mask); } else if (dev_op_dqo_qpl) { - priv->queue_format =3D GVE_DQO_QPL_FORMAT; + device_info->queue_format =3D GVE_DQO_QPL_FORMAT; supported_features_mask =3D be32_to_cpu(dev_op_dqo_qpl->supported_features_mask); } else if (dev_op_gqi_rda) { - priv->queue_format =3D GVE_GQI_RDA_FORMAT; + device_info->queue_format =3D GVE_GQI_RDA_FORMAT; dev_info(&priv->pdev->dev, "Driver is running with GQI RDA queue format.\n"); supported_features_mask =3D be32_to_cpu(dev_op_gqi_rda->supported_features_mask); - } else if (priv->queue_format =3D=3D GVE_GQI_RDA_FORMAT) { + } else if (device_info->queue_format =3D=3D GVE_GQI_RDA_FORMAT) { dev_info(&priv->pdev->dev, "Driver is running with GQI RDA queue format.\n"); } else { - priv->queue_format =3D GVE_GQI_QPL_FORMAT; + device_info->queue_format =3D GVE_GQI_QPL_FORMAT; if (dev_op_gqi_qpl) supported_features_mask =3D be32_to_cpu(dev_op_gqi_qpl->supported_features_mask); @@ -1097,18 +1129,9 @@ int gve_adminq_describe_device(struct gve_priv *priv) "Driver is running with GQI QPL queue format.\n"); } =20 + gve_fill_device_info(priv, descriptor); gve_set_default_rss_sizes(priv); =20 - err =3D gve_set_mtu(priv, descriptor); - if (err) - goto free_device_descriptor; - - priv->num_event_counters =3D be16_to_cpu(descriptor->counters); - - gve_set_mac(priv, descriptor); - - gve_set_queue_properties(priv, descriptor); - gve_enable_supported_features(priv, supported_features_mask, dev_op_jumbo_frames, dev_op_dqo_qpl, dev_op_buffer_sizes, dev_op_flow_steering, @@ -1595,6 +1618,8 @@ int gve_set_num_ntfy_blks(struct gve_priv *priv) =20 void gve_set_num_queues(struct gve_priv *priv) { + struct gve_device_info *device_info =3D &priv->device_info; + priv->tx_cfg.max_queues =3D min_t(int, priv->tx_cfg.max_queues, priv->num_ntfy_blks / 2); priv->rx_cfg.max_queues =3D @@ -1602,10 +1627,13 @@ void gve_set_num_queues(struct gve_priv *priv) =20 priv->tx_cfg.num_queues =3D priv->tx_cfg.max_queues; priv->rx_cfg.num_queues =3D priv->rx_cfg.max_queues; - if (priv->default_num_queues > 0) { - priv->tx_cfg.num_queues =3D min_t(int, priv->default_num_queues, + if (device_info->default_tx_queues > 0) + priv->tx_cfg.num_queues =3D min_t(int, + device_info->default_tx_queues, priv->tx_cfg.num_queues); - priv->rx_cfg.num_queues =3D min_t(int, priv->default_num_queues, + + if (device_info->default_rx_queues > 0) + priv->rx_cfg.num_queues =3D min_t(int, + device_info->default_rx_queues, priv->rx_cfg.num_queues); - } } diff --git a/drivers/net/ethernet/google/gve/gve_adminq.h b/drivers/net/eth= ernet/google/gve/gve_adminq.h index 68c63ce75505..a17af755b454 100644 --- a/drivers/net/ethernet/google/gve/gve_adminq.h +++ b/drivers/net/ethernet/google/gve/gve_adminq.h @@ -658,10 +658,4 @@ int gve_adminq_get_ptype_map_dqo(struct gve_priv *priv, struct gve_ptype_lut *ptype_lut); int gve_set_num_ntfy_blks(struct gve_priv *priv); void gve_set_num_queues(struct gve_priv *priv); -void gve_set_queue_properties(struct gve_priv *priv, - struct gve_device_descriptor *descriptor); -int gve_set_mtu(struct gve_priv *priv, - struct gve_device_descriptor *descriptor); -void gve_set_mac(struct gve_priv *priv, - struct gve_device_descriptor *descriptor); #endif /* _GVE_ADMINQ_H */ diff --git a/drivers/net/ethernet/google/gve/gve_main.c b/drivers/net/ether= net/google/gve/gve_main.c index 9cc343a16271..d3882de584e3 100644 --- a/drivers/net/ethernet/google/gve/gve_main.c +++ b/drivers/net/ethernet/google/gve/gve_main.c @@ -2398,57 +2398,71 @@ static const struct xdp_metadata_ops gve_xdp_metada= ta_ops =3D { .xmo_rx_timestamp =3D gve_xdp_rx_timestamp, }; =20 -static void gve_set_default_desc_cnt(struct gve_priv *priv, - const struct gve_device_descriptor *descriptor) +static void gve_set_desc_cnt(struct gve_priv *priv) { - priv->tx_desc_cnt =3D be16_to_cpu(descriptor->tx_queue_entries); - priv->rx_desc_cnt =3D be16_to_cpu(descriptor->rx_queue_entries); + struct gve_device_info *device_info =3D &priv->device_info; =20 - /* set default ranges */ - priv->max_tx_desc_cnt =3D priv->tx_desc_cnt; - priv->max_rx_desc_cnt =3D priv->rx_desc_cnt; - priv->min_tx_desc_cnt =3D priv->tx_desc_cnt; - priv->min_rx_desc_cnt =3D priv->rx_desc_cnt; + priv->tx_desc_cnt =3D device_info->default_tx_ring_size; + priv->rx_desc_cnt =3D device_info->default_rx_ring_size; + priv->max_tx_desc_cnt =3D device_info->max_tx_ring_size; + priv->max_rx_desc_cnt =3D device_info->max_rx_ring_size; + priv->min_tx_desc_cnt =3D device_info->min_tx_ring_size; + priv->min_rx_desc_cnt =3D device_info->min_rx_ring_size; } =20 -void gve_set_queue_properties(struct gve_priv *priv, - struct gve_device_descriptor *descriptor) +static void gve_set_queue_properties(struct gve_priv *priv) { - /* set default descriptor counts */ - gve_set_default_desc_cnt(priv, descriptor); + struct gve_device_info *device_info =3D &priv->device_info; =20 - priv->max_registered_pages =3D be64_to_cpu(descriptor->max_registered_pag= es); - priv->tx_pages_per_qpl =3D be16_to_cpu(descriptor->tx_pages_per_qpl); - priv->default_num_queues =3D be16_to_cpu(descriptor->default_num_queues); + gve_set_desc_cnt(priv); + priv->max_registered_pages =3D device_info->max_registered_pages; + priv->tx_pages_per_qpl =3D device_info->tx_pages_per_qpl; } =20 -int gve_set_mtu(struct gve_priv *priv, - struct gve_device_descriptor *descriptor) +static int gve_set_mtu(struct gve_priv *priv) { + struct gve_device_info *device_info =3D &priv->device_info; u16 mtu; =20 - mtu =3D be16_to_cpu(descriptor->mtu); + mtu =3D device_info->max_mtu; if (mtu < ETH_MIN_MTU) { dev_err(&priv->pdev->dev, "MTU %d below minimum MTU\n", mtu); return -EINVAL; } priv->dev->max_mtu =3D mtu; + priv->dev->mtu =3D mtu; =20 return 0; } =20 -void gve_set_mac(struct gve_priv *priv, - struct gve_device_descriptor *descriptor) +static void gve_set_mac(struct gve_priv *priv) { + struct gve_device_info *device_info =3D &priv->device_info; u8 *mac; =20 - mac =3D descriptor->mac; + mac =3D device_info->mac; eth_hw_addr_set(priv->dev, mac); dev_info(&priv->pdev->dev, "MAC addr: %pM\n", mac); } =20 +static void gve_set_buf_sizes(struct gve_priv *priv) +{ + struct gve_device_info *device_info =3D &priv->device_info; + + if (device_info->max_rx_buffer_size) + priv->max_rx_buffer_size =3D device_info->max_rx_buffer_size; + + if (gve_is_dqo(priv) && + priv->max_rx_buffer_size > GVE_DEFAULT_RX_BUFFER_SIZE) + priv->rx_cfg.packet_buffer_size =3D priv->max_rx_buffer_size; + + if (device_info->header_buf_size) + priv->header_buf_size =3D device_info->header_buf_size; +} + static int gve_init_priv(struct gve_priv *priv, bool skip_describe_device) { + struct gve_device_info *device_info =3D &priv->device_info; int err; =20 /* Set up the adminq */ @@ -2471,7 +2485,7 @@ static int gve_init_priv(struct gve_priv *priv, bool = skip_describe_device) if (skip_describe_device) goto setup_device; =20 - priv->queue_format =3D GVE_QUEUE_FORMAT_UNSPECIFIED; + device_info->queue_format =3D GVE_QUEUE_FORMAT_UNSPECIFIED; /* Get the initial information we need from the device */ err =3D gve_adminq_describe_device(priv); if (err) { @@ -2480,6 +2494,8 @@ static int gve_init_priv(struct gve_priv *priv, bool = skip_describe_device) goto err; } =20 + priv->queue_format =3D priv->device_info.queue_format; + err =3D gve_set_num_ntfy_blks(priv); if (err) { dev_err(&priv->pdev->dev, @@ -2507,12 +2523,34 @@ static int gve_init_priv(struct gve_priv *priv, boo= l skip_describe_device) netif_set_tso_max_size(priv->dev, GVE_DQO_TX_MAX); } =20 - priv->dev->mtu =3D priv->dev->max_mtu; + if (gve_set_mtu(priv)) { + err =3D -EINVAL; + goto err; + } + + priv->num_event_counters =3D device_info->num_event_counters; + + gve_set_mac(priv); + + gve_set_queue_properties(priv); + priv->modify_ring_size_enabled =3D device_info->modify_ring_size_enabled; + + gve_set_buf_sizes(priv); + + priv->max_flow_rules =3D device_info->max_flow_rules; + if (priv->max_flow_rules) + priv->dev->hw_features |=3D NETIF_F_NTUPLE; + + priv->rss_key_size =3D device_info->rss_key_size; + priv->rss_lut_size =3D device_info->rss_lut_size; + priv->cache_rss_config =3D device_info->cache_rss_config; + priv->numa_node =3D dev_to_node(&priv->pdev->dev); priv->tx_cfg.num_xdp_queues =3D 0; priv->rx_copybreak =3D GVE_DEFAULT_RX_COPYBREAK; priv->ts_config.tx_type =3D HWTSTAMP_TX_OFF; priv->ts_config.rx_filter =3D HWTSTAMP_FILTER_NONE; + priv->nic_timestamp_supported =3D device_info->nic_timestamp_supported; =20 setup_device: priv->xsk_pools =3D bitmap_zalloc(priv->rx_cfg.max_queues, GFP_KERNEL); --=20 2.55.0.979.g7e5102b832-goog From nobody Sat Sep 26 06:20:32 2026 Received: from mail-pl1-f200.google.com (mail-pl1-f200.google.com [209.85.214.200]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 122894398E4 for ; Thu, 3 Sep 2026 21:56:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.200 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788472572; cv=none; b=EFsKqxsG9I/fVY/RRTT6MvNagOpDh3zygr55O8kzZJM9R+M1UwP2E+BD14AvOw/bTZxIR5nduYCddKplZvxHuoXO+EBQLl+nWgAcCdnv9ONyJK6Yo8+cwGhILx0/waQCKnC6nIa+CuGqXmpB3zLeV5vQwxSMUkNLQOF8UHvcvFU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788472572; c=relaxed/simple; bh=umMQp8zGXdLq1DZeQJFY0Bp+bTYuZEF5kBxA87lvmPs=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=LOmzjrPsdvHrUXBIXzcO1nOr0JWzuHA7eWXKbMGOxWebExFk6nWcdANqIfDpfVbB9ly8FALkoSDMqvENo3OPR/i4q+uAvToLlP5pM10LrPKvKBV/U2967Mk6ZaketK/KEkXOdlb+S5cMQ/3YMQql6x/cIAw07L3kyAO0Kjf6ofQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--hramamurthy.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=BoCcRi60; arc=none smtp.client-ip=209.85.214.200 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--hramamurthy.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="BoCcRi60" Received: by mail-pl1-f200.google.com with SMTP id d9443c01a7336-2cfc52ddc55so4541955ad.3 for ; Thu, 03 Sep 2026 14:56:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1788472570; x=1789077370; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=OEDyiaPigd2rAb1GhJrPbGRzg7qQSqdD8/0OuAo0tWo=; b=BoCcRi60wzZo5nh5XdWX+CEoIAkE2z/bpWvnDtSPEuPlt7Hj+586O2x33GKY1CjgQr /Lfpp3zlJIUpFXVWOeI8q7TDADCXoIa9K+l0iTS+KvgrsGjxg0DjdfWBIlFqbjibGVsF Zpjg4SCgg9gUlfphRnDSqYV2VoXYLu+Eh1nPo3z8tS3fOt1qXUzntdaFkZxCSHz1vlxF 7kWBe431mya0PKsfw3zstxyBbj4G0Pj7OPPsxNCpu1VBvRSpJWEWESPfG3HCVYVZHSaY e/YoB1NgNgxKcmRnRAF3BnLaamZMfAR+tGUYAI6EbbbpNNlX0mIHzLD+2TIAPkJ/JuwM CeFw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788472570; x=1789077370; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=OEDyiaPigd2rAb1GhJrPbGRzg7qQSqdD8/0OuAo0tWo=; b=r2M1M6i6aCYnhxy4ywJXAV5pZ9RXHThL4/HU885ueGvdlBEAD4nAppAFkKvWQ4iRNn EurJ25MOpBhdaUalV6KNDZzZJKLZAMXHXuku56QWM3qc/JisamM4VPnv+enNeAB4gQnO oWCxd2YcLvIMp78DTiUuiE22HYX6uEK/nDxxTZ5ZEx76MO3LCt4IRVro7EsaquAUad4q qUgsCfBZ0pgSbiGmL9zVA0qqe+U063zTNSsZBeG4gfRp7MbT5VXvH8yPUjIw/ZfNK7cz CU91rNeDyPXmOSqnp9aRhDhQBldJRCsk1uNd5Uidxwbcs9FfQmZafMk/Lz5ikDizUI1Q DF8Q== X-Forwarded-Encrypted: i=1; AKwUvBxT44aqqQCi7+FggVXk9YZKt0bp0n9Xc4TgoyvJKa1RHtl/IBcW7nLMud61gnNwyZcSaCW2yXBDBo2Yh1M=@vger.kernel.org X-Gm-Message-State: AFuF++m/FZPXZ+oDrCaaUe2ZZVUFNUsvxU28n6BO4hrZagukuawVAcNn Vdmia/QgcO+QwYGm6e9QYESLqTqAzErIJdxrie/rj6vAwxWbvR5SLvM+JsPNmL5MuLEpV1ZkOL8 HEcbQiS9bmnLiXDfjaZGWhdu5hA== X-Received: from plble11.prod.google.com ([2002:a17:902:fb0b:b0:2d9:5294:a36a]) (user=hramamurthy job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:3804:b0:2cf:9347:f445 with SMTP id d9443c01a7336-2db126d8a54mr32180495ad.10.1788472569912; Thu, 03 Sep 2026 14:56:09 -0700 (PDT) Date: Thu, 3 Sep 2026 21:55:56 +0000 In-Reply-To: <20260903215606.31633-1-hramamurthy@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260903215606.31633-1-hramamurthy@google.com> X-Mailer: git-send-email 2.55.0.979.g7e5102b832-goog Message-ID: <20260903215606.31633-3-hramamurthy@google.com> Subject: [PATCH net-next v5 02/12] gve: introduce control plane operations structure From: Harshitha Ramamurthy To: netdev@vger.kernel.org Cc: joshwash@google.com, hramamurthy@google.com, andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, ast@kernel.org, daniel@iogearbox.net, hawk@kernel.org, john.fastabend@gmail.com, sdf@fomichev.me, jordanrhee@google.com, willemb@google.com, nktgrg@google.com, maolson@google.com, thostet@google.com, jacob.e.keller@intel.com, debarghyak@google.com, kees@kernel.org, bpf@vger.kernel.org, linux-kernel@vger.kernel.org, przemyslaw.kitszel@intel.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" To abstract out the difference in implementation of control plane operations between the existing Adminq ABI and the upcoming Mailbox ABI, introduce a new gve_ctrl_ops structure which will contain the basic operations. At probe, these ops will be set based on the ABI and the corresponding ops will be called in relevant places. As of this patch, only Adminq ops are set. In future patches, corresponding ops will be set for the new mailbox mode. Implement a ctrl op to map/unmap the doorbell bar. Since this functionality has moved to a control op, call this op after control ops are set for AdminQ mode. Reviewed-by: Willem de Bruijn Reviewed-by: Jordan Rhee Reviewed-by: Przemek Kitszel Signed-off-by: Harshitha Ramamurthy --- drivers/net/ethernet/google/gve/gve.h | 11 ++++++ drivers/net/ethernet/google/gve/gve_adminq.c | 21 ++++++++++++ drivers/net/ethernet/google/gve/gve_adminq.h | 2 ++ drivers/net/ethernet/google/gve/gve_main.c | 36 +++++++++++--------- 4 files changed, 54 insertions(+), 16 deletions(-) diff --git a/drivers/net/ethernet/google/gve/gve.h b/drivers/net/ethernet/g= oogle/gve/gve.h index 021adb9108df..56148ea3cfbf 100644 --- a/drivers/net/ethernet/google/gve/gve.h +++ b/drivers/net/ethernet/google/gve/gve.h @@ -825,6 +825,16 @@ struct gve_device_info { bool cache_rss_config; }; =20 +/** + * struct gve_ctrl_ops - Control plane operations structure + * @map_db_bar: Maps the doorbell BAR for the device and store in @priv. + * @unmap_db_bar: Unmaps the doorbell BAR previously mapped by @map_db_bar. + */ +struct gve_ctrl_ops { + int (*map_db_bar)(struct gve_priv *priv); + void (*unmap_db_bar)(struct gve_priv *priv); +}; + struct gve_priv { struct net_device *dev; struct gve_tx_ring *tx; /* array of tx_cfg.num_queues */ @@ -958,6 +968,7 @@ struct gve_priv { dma_addr_t nic_ts_report_bus; u64 last_sync_nic_counter; /* Clock counter from last NIC TS report */ struct gve_device_info device_info; + const struct gve_ctrl_ops *ctrl_ops; }; =20 enum gve_service_task_flags_bit { diff --git a/drivers/net/ethernet/google/gve/gve_adminq.c b/drivers/net/eth= ernet/google/gve/gve_adminq.c index 512349c5517f..08d8e49d563e 100644 --- a/drivers/net/ethernet/google/gve/gve_adminq.c +++ b/drivers/net/ethernet/google/gve/gve_adminq.c @@ -1637,3 +1637,24 @@ void gve_set_num_queues(struct gve_priv *priv) device_info->default_rx_queues, priv->rx_cfg.num_queues); } + +int gve_adminq_map_db_bar(struct gve_priv *priv) +{ + struct pci_dev *pdev =3D priv->pdev; + void __iomem *db_bar; + + db_bar =3D pci_iomap(pdev, GVE_DOORBELL_BAR, 0); + if (!db_bar) { + dev_err(&pdev->dev, "Failed to map doorbell bar!\n"); + return -ENOMEM; + } + priv->db_bar2 =3D db_bar; + return 0; +} + +void gve_adminq_unmap_db_bar(struct gve_priv *priv) +{ + struct pci_dev *pdev =3D priv->pdev; + + pci_iounmap(pdev, priv->db_bar2); +} diff --git a/drivers/net/ethernet/google/gve/gve_adminq.h b/drivers/net/eth= ernet/google/gve/gve_adminq.h index a17af755b454..93d3cabb67f1 100644 --- a/drivers/net/ethernet/google/gve/gve_adminq.h +++ b/drivers/net/ethernet/google/gve/gve_adminq.h @@ -658,4 +658,6 @@ int gve_adminq_get_ptype_map_dqo(struct gve_priv *priv, struct gve_ptype_lut *ptype_lut); int gve_set_num_ntfy_blks(struct gve_priv *priv); void gve_set_num_queues(struct gve_priv *priv); +int gve_adminq_map_db_bar(struct gve_priv *priv); +void gve_adminq_unmap_db_bar(struct gve_priv *priv); #endif /* _GVE_ADMINQ_H */ diff --git a/drivers/net/ethernet/google/gve/gve_main.c b/drivers/net/ether= net/google/gve/gve_main.c index d3882de584e3..93b714e1d130 100644 --- a/drivers/net/ethernet/google/gve/gve_main.c +++ b/drivers/net/ethernet/google/gve/gve_main.c @@ -2460,6 +2460,11 @@ static void gve_set_buf_sizes(struct gve_priv *priv) priv->header_buf_size =3D device_info->header_buf_size; } =20 +static const struct gve_ctrl_ops gve_adminq_ops =3D { + .map_db_bar =3D gve_adminq_map_db_bar, + .unmap_db_bar =3D gve_adminq_unmap_db_bar, +}; + static int gve_init_priv(struct gve_priv *priv, bool skip_describe_device) { struct gve_device_info *device_info =3D &priv->device_info; @@ -2861,7 +2866,6 @@ static int gve_probe(struct pci_dev *pdev, const stru= ct pci_device_id *ent) { int max_tx_queues, max_rx_queues; struct net_device *dev; - __be32 __iomem *db_bar; struct gve_registers __iomem *reg_bar; struct gve_priv *priv; int err; @@ -2889,13 +2893,6 @@ static int gve_probe(struct pci_dev *pdev, const str= uct pci_device_id *ent) goto abort_with_pci_region; } =20 - db_bar =3D pci_iomap(pdev, GVE_DOORBELL_BAR, 0); - if (!db_bar) { - dev_err(&pdev->dev, "Failed to map doorbell bar!\n"); - err =3D -ENOMEM; - goto abort_with_reg_bar; - } - gve_write_version(®_bar->driver_version); /* Get max queues to alloc etherdev */ max_tx_queues =3D ioread32be(®_bar->max_tx_queues); @@ -2905,7 +2902,7 @@ static int gve_probe(struct pci_dev *pdev, const stru= ct pci_device_id *ent) if (!dev) { dev_err(&pdev->dev, "could not allocate netdev\n"); err =3D -ENOMEM; - goto abort_with_db_bar; + goto abort_with_reg_bar; } SET_NETDEV_DEV(dev, &pdev->dev); pci_set_drvdata(pdev, dev); @@ -2937,19 +2934,27 @@ static int gve_probe(struct pci_dev *pdev, const st= ruct pci_device_id *ent) priv->pdev =3D pdev; priv->msg_enable =3D DEFAULT_MSG_LEVEL; priv->reg_bar0 =3D reg_bar; - priv->db_bar2 =3D db_bar; priv->service_task_flags =3D 0x0; priv->state_flags =3D 0x0; priv->ethtool_flags =3D 0x0; priv->rx_cfg.packet_buffer_size =3D GVE_DEFAULT_RX_BUFFER_SIZE; priv->max_rx_buffer_size =3D GVE_DEFAULT_RX_BUFFER_SIZE; =20 + /* Set adminq ctrl ops */ + priv->ctrl_ops =3D &gve_adminq_ops; + + err =3D priv->ctrl_ops->map_db_bar(priv); + if (err) { + err =3D -ENOMEM; + goto abort_with_netdev; + } + gve_set_probe_in_progress(priv); priv->gve_wq =3D alloc_ordered_workqueue("gve", 0); if (!priv->gve_wq) { dev_err(&pdev->dev, "Could not allocate workqueue"); err =3D -ENOMEM; - goto abort_with_netdev; + goto abort_with_unmap_db_bar; } INIT_WORK(&priv->service_task, gve_service_task); INIT_WORK(&priv->stats_report_task, gve_stats_report_task); @@ -2979,12 +2984,12 @@ static int gve_probe(struct pci_dev *pdev, const st= ruct pci_device_id *ent) abort_with_wq: destroy_workqueue(priv->gve_wq); =20 +abort_with_unmap_db_bar: + priv->ctrl_ops->unmap_db_bar(priv); + abort_with_netdev: free_netdev(dev); =20 -abort_with_db_bar: - pci_iounmap(pdev, db_bar); - abort_with_reg_bar: pci_iounmap(pdev, reg_bar); =20 @@ -3000,14 +3005,13 @@ static void gve_remove(struct pci_dev *pdev) { struct net_device *netdev =3D pci_get_drvdata(pdev); struct gve_priv *priv =3D netdev_priv(netdev); - __be32 __iomem *db_bar =3D priv->db_bar2; void __iomem *reg_bar =3D priv->reg_bar0; =20 unregister_netdev(netdev); gve_teardown_priv_resources(priv); destroy_workqueue(priv->gve_wq); + priv->ctrl_ops->unmap_db_bar(priv); free_netdev(netdev); - pci_iounmap(pdev, db_bar); pci_iounmap(pdev, reg_bar); pci_release_regions(pdev); pci_disable_device(pdev); --=20 2.55.0.979.g7e5102b832-goog From nobody Sat Sep 26 06:20:32 2026 Received: from mail-pl1-f198.google.com (mail-pl1-f198.google.com [209.85.214.198]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CCCC9441625 for ; Thu, 3 Sep 2026 21:56:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.198 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788472573; cv=none; b=uWXbNSFEkV9dgrROu7+yaHhptKBZPkcC4txyQmPNh2V/8t5wmsWXyf3UnLVxgso+IgJD2g8Z1UO3Y9iaWynLr1lf4Qn3TCDpq9KnKXLs8edxuH4DeBVuFiHzT+jyyM2NojnlHRYtUSp6JVSq7997BEIbshFdX0idt2Kxt2AuYCw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788472573; c=relaxed/simple; bh=zSrs7aYz+vAgCwpZvQmhCs38kjUmXW9um680axBmA2M=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=j1IJ6oQPmceUDL1Bq4CdKvO3VeW1bx1WVWeAwiY0+juI9JTkeYnlfHSX8lGCGLv7l+u/Kj8A2twG3eEztLp4DMd5SF/HXbWhAjbAAWXOU4GSdNUBGbN4KUPKoybUQ65QTxq3r388BM7rzjovB6B3QPrAYr4b8RkW78WN/fhyU6Y= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--hramamurthy.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=l2UGuOzx; arc=none smtp.client-ip=209.85.214.198 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--hramamurthy.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="l2UGuOzx" Received: by mail-pl1-f198.google.com with SMTP id d9443c01a7336-2d6df0a1e18so5382395ad.1 for ; Thu, 03 Sep 2026 14:56:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1788472571; x=1789077371; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=TG+S/OoFd1G/hm1kf3lv7fyXNZ72KOsUxRjVSuHUUFQ=; b=l2UGuOzxEH6P+V2hOpRiPSMWBvg4LEdQy8+a9bdLjEukSo9k2wk51rNeNwWVmKZxW4 jbYsNh9bcvJC3rWe/vAlMhe6B1xmtKNHeg8hG/0Xx4VQinP+zU7WTV3djJkBGdO4fgOF diO0sx4K+FRwjyrQlZ+aon0lyYKRxrBrQbVMidrVxScZYoEpWEqXKEKoMfGSvHbLIdEX FeqSEhruj8gAaBrIgIIICcDHBoEbqPTmcYWKHXAeHpCnlzGu3yXPfWDUc+Qa9wQX0qfU Mel7Zzr2l3SoBFONuiZ0Is/GAhvGvbYR/A5H7P1nKSz0N1ti6HtwIXEhq+R7X2fNdXsR +vOA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788472571; x=1789077371; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=TG+S/OoFd1G/hm1kf3lv7fyXNZ72KOsUxRjVSuHUUFQ=; b=E1VqqHFw8n++d/moa2wRTMs8UlVPAm/1KxZvlAzoI6Ssxvn/Gc4QOcx5nJqBoUqyDT MfoCJ3QbLn7O3XV/BU2Gxgs5wepneOumEsw4GZnrLv4SbQVjbr0hMlbxn4WURNSgn5E7 5HQMdeBFntT0aUx9nKoIOMOAHOR78JDmeUcEz3BOoGx4MJj09FCgIZc2vfkQflE/pc1n N9ZeETQtfoRp5aNZlUPQ3t8baMRQDuOd6s4UD3tdcQI1dqGx9MoT7ErfX/W6SO6B8did qGqxKvCJtFSBS5ALjeeRwKXYtNo9NvQh1BBrm45czz3f3KuONZvy0qovlh02TI9+3Hf2 myOw== X-Forwarded-Encrypted: i=1; AKwUvBxHQgZzgEHAc4bhugXW5Fa05OayBKaksonBhiLL91GIKgVAhuZrl3e7cSv8/g5I1EebsO55JV6pon6mhmg=@vger.kernel.org X-Gm-Message-State: AFuF++nlvuYy81JN7x0bYOGQ2R420jmnZV8huI8aD83yWrHERhYQRh+k oQF+BsfIlzgp8bE/bdOU9xIGcTpncsSSYds1zz8WnSy2bv5X9OplmK7xS4bpIBnVusAjA3Gt7HF BQNs8k/Z/l+BlN4ElIWwmKjDUAA== X-Received: from pldd22.prod.google.com ([2002:a17:902:c196:b0:2d9:3358:3fa8]) (user=hramamurthy job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:2349:b0:2d0:cc92:f7a3 with SMTP id d9443c01a7336-2db125a5535mr27494035ad.2.1788472570755; Thu, 03 Sep 2026 14:56:10 -0700 (PDT) Date: Thu, 3 Sep 2026 21:55:57 +0000 In-Reply-To: <20260903215606.31633-1-hramamurthy@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260903215606.31633-1-hramamurthy@google.com> X-Mailer: git-send-email 2.55.0.979.g7e5102b832-goog Message-ID: <20260903215606.31633-4-hramamurthy@google.com> Subject: [PATCH net-next v5 03/12] gve: introduce ctrl ops to set vectors and Qs From: Harshitha Ramamurthy To: netdev@vger.kernel.org Cc: joshwash@google.com, hramamurthy@google.com, andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, ast@kernel.org, daniel@iogearbox.net, hawk@kernel.org, john.fastabend@gmail.com, sdf@fomichev.me, jordanrhee@google.com, willemb@google.com, nktgrg@google.com, maolson@google.com, thostet@google.com, jacob.e.keller@intel.com, debarghyak@google.com, kees@kernel.org, bpf@vger.kernel.org, linux-kernel@vger.kernel.org, przemyslaw.kitszel@intel.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Introduce following ctrl ops for Adminq mode. - set_num_queues to set maximum and default TX/RX queues in the alloc structures used in the initialization flow. - set_num_ntfy_blks op to set number of vectors(ntfy_blks) in the initialization flow. This is done by attaching the adminq_ prefix to the existing functions placed in the gve_adminq.c file. Reviewed-by: Willem de Bruijn Reviewed-by: Jordan Rhee Reviewed-by: Przemek Kitszel Signed-off-by: Harshitha Ramamurthy --- v4: Attach 'adminq_' prefix in the function names for gve_set_num_queues and gve_set_num_ntfy_blks and set them as ops (Przemek Kitszel) drivers/net/ethernet/google/gve/gve.h | 6 ++++++ drivers/net/ethernet/google/gve/gve_adminq.c | 4 ++-- drivers/net/ethernet/google/gve/gve_adminq.h | 4 ++-- drivers/net/ethernet/google/gve/gve_main.c | 6 ++++-- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/drivers/net/ethernet/google/gve/gve.h b/drivers/net/ethernet/g= oogle/gve/gve.h index 56148ea3cfbf..1bc5e32b6618 100644 --- a/drivers/net/ethernet/google/gve/gve.h +++ b/drivers/net/ethernet/google/gve/gve.h @@ -829,10 +829,16 @@ struct gve_device_info { * struct gve_ctrl_ops - Control plane operations structure * @map_db_bar: Maps the doorbell BAR for the device and store in @priv. * @unmap_db_bar: Unmaps the doorbell BAR previously mapped by @map_db_bar. + * @set_num_queues: Sets default and max TX/RX queues into allocation + * structures stored in @priv to be used during initializ= ation. + * @set_num_ntfy_blks: Sets no. of vectors into @priv to be used during + * initialization. */ struct gve_ctrl_ops { int (*map_db_bar)(struct gve_priv *priv); void (*unmap_db_bar)(struct gve_priv *priv); + void (*set_num_queues)(struct gve_priv *priv); + int (*set_num_ntfy_blks)(struct gve_priv *priv); }; =20 struct gve_priv { diff --git a/drivers/net/ethernet/google/gve/gve_adminq.c b/drivers/net/eth= ernet/google/gve/gve_adminq.c index 08d8e49d563e..046155ae7d66 100644 --- a/drivers/net/ethernet/google/gve/gve_adminq.c +++ b/drivers/net/ethernet/google/gve/gve_adminq.c @@ -1592,7 +1592,7 @@ int gve_adminq_query_rss_config(struct gve_priv *priv= , struct ethtool_rxfh_param return err; } =20 -int gve_set_num_ntfy_blks(struct gve_priv *priv) +int gve_adminq_set_num_ntfy_blks(struct gve_priv *priv) { int num_ntfy; =20 @@ -1616,7 +1616,7 @@ int gve_set_num_ntfy_blks(struct gve_priv *priv) return 0; } =20 -void gve_set_num_queues(struct gve_priv *priv) +void gve_adminq_set_num_queues(struct gve_priv *priv) { struct gve_device_info *device_info =3D &priv->device_info; =20 diff --git a/drivers/net/ethernet/google/gve/gve_adminq.h b/drivers/net/eth= ernet/google/gve/gve_adminq.h index 93d3cabb67f1..ed3504853908 100644 --- a/drivers/net/ethernet/google/gve/gve_adminq.h +++ b/drivers/net/ethernet/google/gve/gve_adminq.h @@ -656,8 +656,8 @@ int gve_adminq_report_nic_ts(struct gve_priv *priv, struct gve_ptype_lut; int gve_adminq_get_ptype_map_dqo(struct gve_priv *priv, struct gve_ptype_lut *ptype_lut); -int gve_set_num_ntfy_blks(struct gve_priv *priv); -void gve_set_num_queues(struct gve_priv *priv); +int gve_adminq_set_num_ntfy_blks(struct gve_priv *priv); +void gve_adminq_set_num_queues(struct gve_priv *priv); int gve_adminq_map_db_bar(struct gve_priv *priv); void gve_adminq_unmap_db_bar(struct gve_priv *priv); #endif /* _GVE_ADMINQ_H */ diff --git a/drivers/net/ethernet/google/gve/gve_main.c b/drivers/net/ether= net/google/gve/gve_main.c index 93b714e1d130..12b23c2f948f 100644 --- a/drivers/net/ethernet/google/gve/gve_main.c +++ b/drivers/net/ethernet/google/gve/gve_main.c @@ -2463,6 +2463,8 @@ static void gve_set_buf_sizes(struct gve_priv *priv) static const struct gve_ctrl_ops gve_adminq_ops =3D { .map_db_bar =3D gve_adminq_map_db_bar, .unmap_db_bar =3D gve_adminq_unmap_db_bar, + .set_num_queues =3D gve_adminq_set_num_queues, + .set_num_ntfy_blks =3D gve_adminq_set_num_ntfy_blks, }; =20 static int gve_init_priv(struct gve_priv *priv, bool skip_describe_device) @@ -2501,14 +2503,14 @@ static int gve_init_priv(struct gve_priv *priv, boo= l skip_describe_device) =20 priv->queue_format =3D priv->device_info.queue_format; =20 - err =3D gve_set_num_ntfy_blks(priv); + err =3D priv->ctrl_ops->set_num_ntfy_blks(priv); if (err) { dev_err(&priv->pdev->dev, "Could not setup notify blocks: err=3D%d\n", err); goto err; } =20 - gve_set_num_queues(priv); + priv->ctrl_ops->set_num_queues(priv); dev_info(&priv->pdev->dev, "TX queues %d, RX queues %d\n", priv->tx_cfg.num_queues, priv->rx_cfg.num_queues); dev_info(&priv->pdev->dev, "Max TX queues %d, Max RX queues %d\n", --=20 2.55.0.979.g7e5102b832-goog From nobody Sat Sep 26 06:20:32 2026 Received: from mail-pl1-f197.google.com (mail-pl1-f197.google.com [209.85.214.197]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BB9D94499B4 for ; Thu, 3 Sep 2026 21:56:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.197 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788472575; cv=none; b=CJMP8IxiRz2FW3iIy7s62EoiXVqsExXWgJJrPi8UR1MnI8KczB5IXCvHPM7fQV6ngiQ7ROyr8yWn0lZ4NKNwjgEPnWG73MiO/UJWOhKyiV98p8Rm2y4IKaV9kqPEOgKF0hrt2h/9KMMpiTCNcfZgKIxjPTsQqPc+N6ZKEUg99Ss= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788472575; c=relaxed/simple; bh=edc7cBypqmMQRzfvFbcvPQSp33U7Z3aG4lXrQh92XgA=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=e/DdEfnltSyJP8ILpz7BTxdRm4JdC22pCmfuLAAcs8YjVmKmOr3pHJkCP+HxgexIbM8EOLXc/cqaHUUtxe1Y0f2fUtcMgCS3okdFFX+ZPJIjyj3Bwx98d/n1VGDtY4qPiwA0BwGeJNcO5/BApHG7/f2e3vyTlePwm0RDuwRJKNc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--hramamurthy.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=di37Wxxb; arc=none smtp.client-ip=209.85.214.197 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--hramamurthy.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="di37Wxxb" Received: by mail-pl1-f197.google.com with SMTP id d9443c01a7336-2d7443e0f0bso4946395ad.1 for ; Thu, 03 Sep 2026 14:56:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1788472572; x=1789077372; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=q4j5serBn60MGg9VZ/l4GbCLehpKOw1XfhQ0Ioec0zw=; b=di37Wxxb7bfkP3xTkcIHWX9jx8JDhED5U/aPbfH6t2mVkW2NnP/rJdaxRieXOLSJpy Uv4EwMoosyqETtHaDEGVGclg/19bH/X5REWiAXwtltfW/CYGNY3+bMdHCz8RIDS4/hXa /R0SulFI06ybMsXUsW8HrP2Mk8O0xUqBP4UqYtOEonb4SJDpngv5CbgbtOGS5eHc2fmJ 87dQ0loZUO9d4TzbBP3bZD3u2I5+PhLiRHJisN8Dsfk15JX42Md9/ebTs3aGfdhbZaEJ qOMihBenlWhRlskzilnK8+PzisS60HxszimFctDg2VWkCD+xfnHkAAtZWpUYrdWhOsSO Ogzw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788472572; x=1789077372; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=q4j5serBn60MGg9VZ/l4GbCLehpKOw1XfhQ0Ioec0zw=; b=WUIdoSVwUbsIWLwU/A52ORDWI6n2GD3TG59uAkdCvdd8Zeg+RlJnJpWMjZ2CZsLIEs UpNm51gDKxzfsuR1L6YnQhyTpsuM9cfdKxvGCgAHF8Z/omJS2z7ayYJwzsr4cCvi5s4c YH0MWqcrx9DQYCd44rgRNKQFxpEuwSdNDxxxgcNhAhtC2spMSzdGvAXFmMMTuK7QtvXA ekr+PbCaJnY5HBI3j4ejx3ddA9Lirge4KL1250aY9kvkrAe4wkjigmJAWcylMslqmdqH fBePxFQhjmsde6mehCxCXlB3rxtUAHh7y39kk8bMxjxyJ97xlKjrIHM5jsYR+xo6IskM LoAw== X-Forwarded-Encrypted: i=1; AKwUvBww7Nnl+1zWyHsMczqHu18gbuLj89QrAp/U7rrBVZ154P1rLlB0KChVEWNnUX0x8q3sWx9M04ILuJPYQ7k=@vger.kernel.org X-Gm-Message-State: AFuF++nPkc+5a/6VDVSuSD6+AbL80CVm+MuhRGjSg13vRjy9+9v6tizO oKMlu/p+++1c+LPfwnHU2rtxCFIhYim32AmZ2tDlU649z9zzJ2emlCnoYHQygtck4vqTCpgaU8d yo8T0ECem4AlRu+FpC1ZLQF586g== X-Received: from pluo8.prod.google.com ([2002:a17:903:4b08:b0:2ca:d0f4:2f91]) (user=hramamurthy job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:f644:b0:2da:dcd8:713d with SMTP id d9443c01a7336-2db126295cfmr28308215ad.15.1788472571686; Thu, 03 Sep 2026 14:56:11 -0700 (PDT) Date: Thu, 3 Sep 2026 21:55:58 +0000 In-Reply-To: <20260903215606.31633-1-hramamurthy@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260903215606.31633-1-hramamurthy@google.com> X-Mailer: git-send-email 2.55.0.979.g7e5102b832-goog Message-ID: <20260903215606.31633-5-hramamurthy@google.com> Subject: [PATCH net-next v5 04/12] gve: introduce gve_adminq_get_device_properties() From: Harshitha Ramamurthy To: netdev@vger.kernel.org Cc: joshwash@google.com, hramamurthy@google.com, andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, ast@kernel.org, daniel@iogearbox.net, hawk@kernel.org, john.fastabend@gmail.com, sdf@fomichev.me, jordanrhee@google.com, willemb@google.com, nktgrg@google.com, maolson@google.com, thostet@google.com, jacob.e.keller@intel.com, debarghyak@google.com, kees@kernel.org, bpf@vger.kernel.org, linux-kernel@vger.kernel.org, przemyslaw.kitszel@intel.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Introduce gve_adminq_get_device_properties() which executes the first two Adminq commands: VERIFY_DRIVER_COMPATIBILITY and DESCRIBE_DEVICE so that this can be called during initialization. Move these to Adminq specific files. This is just code movement, no functional change. Reviewed-by: Willem de Bruijn Reviewed-by: Jordan Rhee Reviewed-by: Przemek Kitszel Signed-off-by: Harshitha Ramamurthy --- v5: - Place the utsname.h and version.h header files only where needed - drop uneccessary __maybe_unused (Sashiko) v3: - move patch down so that the function is introduced just before usage - mark function as maybe_unused - update commit message drivers/net/ethernet/google/gve/gve_adminq.c | 68 ++++++++++++++++++-- drivers/net/ethernet/google/gve/gve_adminq.h | 5 +- drivers/net/ethernet/google/gve/gve_main.c | 47 +------------- 3 files changed, 65 insertions(+), 55 deletions(-) diff --git a/drivers/net/ethernet/google/gve/gve_adminq.c b/drivers/net/eth= ernet/google/gve/gve_adminq.c index 046155ae7d66..f420a8e1dd3d 100644 --- a/drivers/net/ethernet/google/gve/gve_adminq.c +++ b/drivers/net/ethernet/google/gve/gve_adminq.c @@ -6,6 +6,8 @@ =20 #include #include +#include +#include #include "gve.h" #include "gve_adminq.h" #include "gve_register.h" @@ -1143,6 +1145,27 @@ int gve_adminq_describe_device(struct gve_priv *priv) return err; } =20 +int gve_adminq_get_device_properties(struct gve_priv *priv) +{ + int err; + + err =3D gve_adminq_verify_driver_compatibility(priv); + if (err) { + dev_err(&priv->pdev->dev, + "Could not verify driver compatibility: err=3D%d\n", err); + return err; + } + + /* Get the initial information we need from the device */ + err =3D gve_adminq_describe_device(priv); + if (err) { + dev_err(&priv->pdev->dev, + "Could not get device information: err=3D%d\n", err); + return err; + } + return 0; +} + int gve_adminq_register_page_list(struct gve_priv *priv, struct gve_queue_page_list *qpl) { @@ -1205,20 +1228,53 @@ int gve_adminq_report_stats(struct gve_priv *priv, = u64 stats_report_len, return gve_adminq_execute_cmd(priv, &cmd); } =20 -int gve_adminq_verify_driver_compatibility(struct gve_priv *priv, - u64 driver_info_len, - dma_addr_t driver_info_addr) +int gve_adminq_verify_driver_compatibility(struct gve_priv *priv) { + struct gve_driver_info *driver_info; union gve_adminq_command cmd; + dma_addr_t driver_info_bus; + int err; + + driver_info =3D dma_alloc_coherent(&priv->pdev->dev, + sizeof(struct gve_driver_info), + &driver_info_bus, GFP_KERNEL); + if (!driver_info) + return -ENOMEM; + + *driver_info =3D (struct gve_driver_info) { + .os_type =3D 1, /* Linux */ + .os_version_major =3D cpu_to_be32(LINUX_VERSION_MAJOR), + .os_version_minor =3D cpu_to_be32(LINUX_VERSION_SUBLEVEL), + .os_version_sub =3D cpu_to_be32(LINUX_VERSION_PATCHLEVEL), + .driver_capability_flags =3D { + 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)); =20 memset(&cmd, 0, sizeof(cmd)); cmd.opcode =3D cpu_to_be32(GVE_ADMINQ_VERIFY_DRIVER_COMPATIBILITY); cmd.verify_driver_compatibility =3D (struct gve_adminq_verify_driver_comp= atibility) { - .driver_info_len =3D cpu_to_be64(driver_info_len), - .driver_info_addr =3D cpu_to_be64(driver_info_addr), + .driver_info_len =3D cpu_to_be64(sizeof(struct gve_driver_info)), + .driver_info_addr =3D cpu_to_be64(driver_info_bus), }; =20 - return gve_adminq_execute_cmd(priv, &cmd); + err =3D gve_adminq_execute_cmd(priv, &cmd); + + /* It's ok if the device doesn't support this */ + if (err =3D=3D -EOPNOTSUPP) + err =3D 0; + + dma_free_coherent(&priv->pdev->dev, + sizeof(struct gve_driver_info), + driver_info, driver_info_bus); + return err; } =20 int gve_adminq_report_link_speed(struct gve_priv *priv) diff --git a/drivers/net/ethernet/google/gve/gve_adminq.h b/drivers/net/eth= ernet/google/gve/gve_adminq.h index ed3504853908..2ab68c822e22 100644 --- a/drivers/net/ethernet/google/gve/gve_adminq.h +++ b/drivers/net/ethernet/google/gve/gve_adminq.h @@ -640,9 +640,8 @@ int gve_adminq_register_page_list(struct gve_priv *priv, int gve_adminq_unregister_page_list(struct gve_priv *priv, u32 page_list_i= d); 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_verify_driver_compatibility(struct gve_priv *priv); +int gve_adminq_get_device_properties(struct gve_priv *priv); int gve_adminq_report_link_speed(struct gve_priv *priv); int gve_adminq_add_flow_rule(struct gve_priv *priv, struct gve_adminq_flow= _rule *rule, u32 loc); int gve_adminq_del_flow_rule(struct gve_priv *priv, u32 loc); diff --git a/drivers/net/ethernet/google/gve/gve_main.c b/drivers/net/ether= net/google/gve/gve_main.c index 12b23c2f948f..08859611a96e 100644 --- a/drivers/net/ethernet/google/gve/gve_main.c +++ b/drivers/net/ethernet/google/gve/gve_main.c @@ -17,8 +17,6 @@ #include #include #include -#include -#include #include #include #include @@ -41,49 +39,6 @@ char gve_driver_name[] =3D "gve"; const char gve_version_str[] =3D GVE_VERSION; static const char gve_version_prefix[] =3D GVE_VERSION_PREFIX; =20 -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 =3D dma_alloc_coherent(&priv->pdev->dev, - sizeof(struct gve_driver_info), - &driver_info_bus, GFP_KERNEL); - if (!driver_info) - return -ENOMEM; - - *driver_info =3D (struct gve_driver_info) { - .os_type =3D 1, /* Linux */ - .os_version_major =3D cpu_to_be32(LINUX_VERSION_MAJOR), - .os_version_minor =3D cpu_to_be32(LINUX_VERSION_SUBLEVEL), - .os_version_sub =3D cpu_to_be32(LINUX_VERSION_PATCHLEVEL), - .driver_capability_flags =3D { - 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 =3D 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 =3D=3D -EOPNOTSUPP) - err =3D 0; - - dma_free_coherent(&priv->pdev->dev, - sizeof(struct gve_driver_info), - driver_info, driver_info_bus); - return err; -} - static netdev_features_t gve_features_check(struct sk_buff *skb, struct net_device *dev, netdev_features_t features) @@ -2480,7 +2435,7 @@ static int gve_init_priv(struct gve_priv *priv, bool = skip_describe_device) return err; } =20 - err =3D gve_verify_driver_compatibility(priv); + err =3D gve_adminq_verify_driver_compatibility(priv); if (err) { dev_err(&priv->pdev->dev, "Could not verify driver compatibility: err=3D%d\n", err); --=20 2.55.0.979.g7e5102b832-goog From nobody Sat Sep 26 06:20:32 2026 Received: from mail-pf1-f200.google.com (mail-pf1-f200.google.com [209.85.210.200]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 99AD0451992 for ; Thu, 3 Sep 2026 21:56:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.200 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788472577; cv=none; b=M8mEiwWoCsmqUTf2onZhFT0WRsM3HNYgUcHthOunnHNsGJkXpApIpo0/ghPcDvW/fU4vx0uheSAKl2ieK4yOZYhmR8pEdytKvjsUfWPq9rhMKsyUX1iuqshX5bBq8nMAozEv7Po4lB2O3UDagC+fFWCHSJSBEoF5cKnq4x8Xe3M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788472577; c=relaxed/simple; bh=3BXSCyAgHxEVmiJXvMK8WsCv8i09MSRVlOz/tGLyuw8=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=skPdm/VAIk1WnnRuAhkmZmN4Q6ImIEDQj6L1lhurPrSGWMq8W04jK71q/ejES3P5YOuSSknil0Ps9+6gJmt8NDjV3xtVwyOmc3aBkUWgVKNuKUcfbOjFPHDACG9eFkJsIdJwhYf61NNxvDiqNUaMCDJgTC9IlrrrBhHG+n+3cWY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--hramamurthy.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=LiPU8NKN; arc=none smtp.client-ip=209.85.210.200 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--hramamurthy.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="LiPU8NKN" Received: by mail-pf1-f200.google.com with SMTP id d2e1a72fcca58-84a251c2e3eso1968624b3a.1 for ; Thu, 03 Sep 2026 14:56:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1788472573; x=1789077373; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=wrOjqdn2k/Sh6hbeKx1aZs9Spx0aoJ4gt+SAmTBWj+A=; b=LiPU8NKNyPL8cpdwOZe11oUfZPWO9QspADrFxFz1bIUYRTMC7vOhIlIsqsyHXMvvIG e9jGQG4v3vpbwriggFAFKPX68uOWfea986JlFVMbyew99WoXCZfLWa2ocwhhqeViGK7K wqYqjrgS/cVypLFiqftudPtGvZ5o/Oc0EUocGRCMe6XmnAKOAd2b7ZUPzk0b0otXkKdx hvgR4j+m5p8Jpx0G6vzSyextNM6icdO0HnlyXSfXzaTTwjPI2mTl+vguq1p5LmLWfBsG LQ0C0il/ED3phBA8SzVyfrCCmKyvhkGEXRNUhqlgZ5g40TJl3LxXyyWZoQrez9R8+14c fqqw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788472573; x=1789077373; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=wrOjqdn2k/Sh6hbeKx1aZs9Spx0aoJ4gt+SAmTBWj+A=; b=gDOhf8YWG/18Ll1IzRC+cmyB43boFRSLjtgIVQ6Bikf59283kgjDgVOIdJSAxvbJB1 QbdHZR58a44cfp3kGRlDzQ5GItuA2hVZR7Ib+vqAwgNKmMDTBQf4r3Fyv7CWlvqkIiL5 SioNAUTQy4s2pkJs3yJWuev0WqjD00jGXciVp9wcu0Pg6OgxULfztQuH6PK8SiQGiQqR iEctNX9+J1e6BUKmhcEAg99fn6C/HwduBHzh2j51wM6INW8dJ2tI2veKUPqxP1iMzrIW ecIxclbNYv8378i15lKhqom5IAz0h3KZY3lQ67RtmvyhwYZ+TAWqszxV+WqHZmCbmdak aCWA== X-Forwarded-Encrypted: i=1; AKwUvBxvG5rvlvuUQnpQdc8N6jqA0kknpuTmMYgCSFX0LPY7bVJpj8+CaiCf69BcAKlDCXTKjK+YhctGua+9LxU=@vger.kernel.org X-Gm-Message-State: AFuF++m5slumIfoOzzPp2pMtYHW4yq906M3jXJ4n9aGDI9gfYIBZdLEm /nbFjdfG4F9lrKYHJaPde8/G2nyRYaPMHiTCtAU8zl7EKG+uOZZSKZn/c/htkSSbQF9HSkBTHV2 +dp1LM/Qyha52f1Y0QqWsl29Lvg== X-Received: from pgwc1.prod.google.com ([2002:a65:66c1:0:b0:cbe:408a:5051]) (user=hramamurthy job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:4d8f:b0:3d3:ad6e:9ce0 with SMTP id adf61e73a8af0-3da3c0a5a04mr724443637.14.1788472572598; Thu, 03 Sep 2026 14:56:12 -0700 (PDT) Date: Thu, 3 Sep 2026 21:55:59 +0000 In-Reply-To: <20260903215606.31633-1-hramamurthy@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260903215606.31633-1-hramamurthy@google.com> X-Mailer: git-send-email 2.55.0.979.g7e5102b832-goog Message-ID: <20260903215606.31633-6-hramamurthy@google.com> Subject: [PATCH net-next v5 05/12] gve: refactor gve_init_priv for reset path From: Harshitha Ramamurthy To: netdev@vger.kernel.org Cc: joshwash@google.com, hramamurthy@google.com, andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, ast@kernel.org, daniel@iogearbox.net, hawk@kernel.org, john.fastabend@gmail.com, sdf@fomichev.me, jordanrhee@google.com, willemb@google.com, nktgrg@google.com, maolson@google.com, thostet@google.com, jacob.e.keller@intel.com, debarghyak@google.com, kees@kernel.org, bpf@vger.kernel.org, linux-kernel@vger.kernel.org, przemyslaw.kitszel@intel.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The driver does not need to renegotiate all properties with the device on a reset since those should stay constant through a reset. Hence change gve_init_priv() into a method that only sets these properties into the priv structure and hence needs to be only called once during gve_probe(). To achieve this end state of gve_init_priv(), do the following: - introduce gve_adminq_init() which writes the driver version register and allocates the AdminQ and call it in gve_probe() - call gve_adminq_get_device_properties() into gve_probe() to learn device properties - introduce gve_setup_device() which deals with device setup logic and call it in gve_probe() - resetting no. of registered pages is moved into gve_setup_device() since that needs to be reset every time queues are re-created. With these changes, gve_adminq_get_device_properties() and gve_init_priv() are only called once during gve_probe. gve_reset_recovery() now calls targeted setup functions directly. This prepares the driver to add mailbox mode's control plane initialization and device properties negotiation in the same place as is done in AdminQ mode in the upcoming patches when adding the mailbox ABI. These changes are only code movement, no functional change. Reviewed-by: Willem de Bruijn Reviewed-by: Jordan Rhee Reviewed-by: Przemek Kitszel Signed-off-by: Harshitha Ramamurthy --- v3: - gve_reset_recovery also calls verify driver compatibility - don't free device resources if gve_open() fails in the reset path - move resetting no. of registered pages to gve_setup_device() drivers/net/ethernet/google/gve/gve.h | 2 + drivers/net/ethernet/google/gve/gve_adminq.c | 12 +- drivers/net/ethernet/google/gve/gve_adminq.h | 2 +- drivers/net/ethernet/google/gve/gve_main.c | 146 ++++++++++--------- 4 files changed, 95 insertions(+), 67 deletions(-) diff --git a/drivers/net/ethernet/google/gve/gve.h b/drivers/net/ethernet/g= oogle/gve/gve.h index 1bc5e32b6618..48cc8a6be186 100644 --- a/drivers/net/ethernet/google/gve/gve.h +++ b/drivers/net/ethernet/google/gve/gve.h @@ -1253,6 +1253,8 @@ static inline bool gve_is_clock_enabled(struct gve_pr= iv *priv) return priv->nic_ts_report; } =20 +void gve_adminq_write_version(u8 __iomem *driver_version_register); + /* gqi napi handler defined in gve_main.c */ int gve_napi_poll(struct napi_struct *napi, int budget); =20 diff --git a/drivers/net/ethernet/google/gve/gve_adminq.c b/drivers/net/eth= ernet/google/gve/gve_adminq.c index f420a8e1dd3d..a62cb7a921d0 100644 --- a/drivers/net/ethernet/google/gve/gve_adminq.c +++ b/drivers/net/ethernet/google/gve/gve_adminq.c @@ -298,8 +298,10 @@ gve_process_device_options(struct gve_priv *priv, return 0; } =20 -int gve_adminq_alloc(struct device *dev, struct gve_priv *priv) +static int gve_adminq_alloc(struct gve_priv *priv) { + struct device *dev =3D &priv->pdev->dev; + priv->adminq_pool =3D dma_pool_create("adminq_pool", dev, GVE_ADMINQ_BUFFER_SIZE, 0, 0); if (unlikely(!priv->adminq_pool)) @@ -355,6 +357,14 @@ int gve_adminq_alloc(struct device *dev, struct gve_pr= iv *priv) return 0; } =20 +int gve_adminq_init(struct gve_priv *priv) +{ + struct gve_registers __iomem *reg_bar =3D priv->reg_bar0; + + gve_adminq_write_version(®_bar->driver_version); + return gve_adminq_alloc(priv); +} + void gve_adminq_release(struct gve_priv *priv) { int i =3D 0; diff --git a/drivers/net/ethernet/google/gve/gve_adminq.h b/drivers/net/eth= ernet/google/gve/gve_adminq.h index 2ab68c822e22..78eee3b5cb7f 100644 --- a/drivers/net/ethernet/google/gve/gve_adminq.h +++ b/drivers/net/ethernet/google/gve/gve_adminq.h @@ -619,7 +619,7 @@ union gve_adminq_command { =20 static_assert(sizeof(union gve_adminq_command) =3D=3D 64); =20 -int gve_adminq_alloc(struct device *dev, struct gve_priv *priv); +int gve_adminq_init(struct gve_priv *priv); void gve_adminq_free(struct gve_priv *priv); void gve_adminq_release(struct gve_priv *priv); int gve_adminq_describe_device(struct gve_priv *priv); diff --git a/drivers/net/ethernet/google/gve/gve_main.c b/drivers/net/ether= net/google/gve/gve_main.c index 08859611a96e..16ce55c6d74f 100644 --- a/drivers/net/ethernet/google/gve/gve_main.c +++ b/drivers/net/ethernet/google/gve/gve_main.c @@ -2415,6 +2415,35 @@ static void gve_set_buf_sizes(struct gve_priv *priv) priv->header_buf_size =3D device_info->header_buf_size; } =20 +static int gve_setup_device(struct gve_priv *priv) +{ + int err; + + priv->num_registered_pages =3D 0; + + priv->xsk_pools =3D bitmap_zalloc(priv->rx_cfg.max_queues, GFP_KERNEL); + if (!priv->xsk_pools) { + err =3D -ENOMEM; + goto err; + } + + gve_set_netdev_xdp_features(priv); + if (!gve_is_gqi(priv)) + priv->dev->xdp_metadata_ops =3D &gve_xdp_metadata_ops; + + err =3D gve_setup_device_resources(priv); + if (err) + goto err_free_xsk_bitmap; + + return 0; + +err_free_xsk_bitmap: + bitmap_free(priv->xsk_pools); + priv->xsk_pools =3D NULL; +err: + return err; +} + static const struct gve_ctrl_ops gve_adminq_ops =3D { .map_db_bar =3D gve_adminq_map_db_bar, .unmap_db_bar =3D gve_adminq_unmap_db_bar, @@ -2422,47 +2451,18 @@ static const struct gve_ctrl_ops gve_adminq_ops =3D= { .set_num_ntfy_blks =3D gve_adminq_set_num_ntfy_blks, }; =20 -static int gve_init_priv(struct gve_priv *priv, bool skip_describe_device) +static int gve_init_priv(struct gve_priv *priv) { struct gve_device_info *device_info =3D &priv->device_info; int err; =20 - /* Set up the adminq */ - err =3D gve_adminq_alloc(&priv->pdev->dev, priv); - if (err) { - dev_err(&priv->pdev->dev, - "Failed to alloc admin queue: err=3D%d\n", err); - return err; - } - - err =3D gve_adminq_verify_driver_compatibility(priv); - if (err) { - dev_err(&priv->pdev->dev, - "Could not verify driver compatibility: err=3D%d\n", err); - goto err; - } - - priv->num_registered_pages =3D 0; - - if (skip_describe_device) - goto setup_device; - - device_info->queue_format =3D GVE_QUEUE_FORMAT_UNSPECIFIED; - /* Get the initial information we need from the device */ - err =3D gve_adminq_describe_device(priv); - if (err) { - dev_err(&priv->pdev->dev, - "Could not get device information: err=3D%d\n", err); - goto err; - } - priv->queue_format =3D priv->device_info.queue_format; =20 err =3D priv->ctrl_ops->set_num_ntfy_blks(priv); if (err) { dev_err(&priv->pdev->dev, "Could not setup notify blocks: err=3D%d\n", err); - goto err; + return err; } =20 priv->ctrl_ops->set_num_queues(priv); @@ -2485,10 +2485,8 @@ static int gve_init_priv(struct gve_priv *priv, bool= skip_describe_device) netif_set_tso_max_size(priv->dev, GVE_DQO_TX_MAX); } =20 - if (gve_set_mtu(priv)) { - err =3D -EINVAL; - goto err; - } + if (gve_set_mtu(priv)) + return -EINVAL; =20 priv->num_event_counters =3D device_info->num_event_counters; =20 @@ -2513,30 +2511,7 @@ static int gve_init_priv(struct gve_priv *priv, bool= skip_describe_device) priv->ts_config.tx_type =3D HWTSTAMP_TX_OFF; priv->ts_config.rx_filter =3D HWTSTAMP_FILTER_NONE; priv->nic_timestamp_supported =3D device_info->nic_timestamp_supported; - -setup_device: - priv->xsk_pools =3D bitmap_zalloc(priv->rx_cfg.max_queues, GFP_KERNEL); - if (!priv->xsk_pools) { - err =3D -ENOMEM; - goto err; - } - - gve_set_netdev_xdp_features(priv); - if (!gve_is_gqi(priv)) - priv->dev->xdp_metadata_ops =3D &gve_xdp_metadata_ops; - - err =3D gve_setup_device_resources(priv); - if (err) - goto err_free_xsk_bitmap; - return 0; - -err_free_xsk_bitmap: - bitmap_free(priv->xsk_pools); - priv->xsk_pools =3D NULL; -err: - gve_adminq_free(priv); - return err; } =20 static void gve_teardown_priv_resources(struct gve_priv *priv) @@ -2566,15 +2541,32 @@ static int gve_reset_recovery(struct gve_priv *priv= , bool was_up) { int err; =20 - err =3D gve_init_priv(priv, true); - if (err) + err =3D gve_adminq_init(priv); + if (err) { + dev_err(&priv->pdev->dev, + "Failed to alloc admin queue: err=3D%d\n", err); goto err; + } + + err =3D gve_adminq_verify_driver_compatibility(priv); + if (err) { + dev_err(&priv->pdev->dev, + "Could not verify driver compatibility: err=3D%d\n", err); + goto err_free_adminq; + } + + err =3D gve_setup_device(priv); + if (err) + goto err_free_adminq; if (was_up) { err =3D gve_open(priv->dev); if (err) - goto err; + return err; } return 0; + +err_free_adminq: + gve_adminq_free(priv); err: dev_err(&priv->pdev->dev, "Reset failed! !!! DISABLING ALL QUEUES !!!\n"); gve_turndown(priv); @@ -2617,7 +2609,7 @@ int gve_reset(struct gve_priv *priv, bool attempt_tea= rdown) return err; } =20 -static void gve_write_version(u8 __iomem *driver_version_register) +void gve_adminq_write_version(u8 __iomem *driver_version_register) { const char *c =3D gve_version_prefix; =20 @@ -2850,7 +2842,6 @@ static int gve_probe(struct pci_dev *pdev, const stru= ct pci_device_id *ent) goto abort_with_pci_region; } =20 - gve_write_version(®_bar->driver_version); /* Get max queues to alloc etherdev */ max_tx_queues =3D ioread32be(®_bar->max_tx_queues); max_rx_queues =3D ioread32be(®_bar->max_rx_queues); @@ -2897,13 +2888,28 @@ static int gve_probe(struct pci_dev *pdev, const st= ruct pci_device_id *ent) priv->rx_cfg.packet_buffer_size =3D GVE_DEFAULT_RX_BUFFER_SIZE; priv->max_rx_buffer_size =3D GVE_DEFAULT_RX_BUFFER_SIZE; =20 + err =3D gve_adminq_init(priv); + if (err) { + dev_err(&priv->pdev->dev, + "Failed to alloc admin queue: err=3D%d\n", err); + goto abort_with_netdev; + } + + priv->device_info.queue_format =3D GVE_QUEUE_FORMAT_UNSPECIFIED; + err =3D gve_adminq_get_device_properties(priv); + if (err) { + dev_err(&priv->pdev->dev, + "Could not get device information: err=3D%d\n", err); + goto abort_with_adminq; + } + /* Set adminq ctrl ops */ priv->ctrl_ops =3D &gve_adminq_ops; =20 err =3D priv->ctrl_ops->map_db_bar(priv); if (err) { err =3D -ENOMEM; - goto abort_with_netdev; + goto abort_with_adminq; } =20 gve_set_probe_in_progress(priv); @@ -2918,10 +2924,17 @@ static int gve_probe(struct pci_dev *pdev, const st= ruct pci_device_id *ent) priv->tx_cfg.max_queues =3D max_tx_queues; priv->rx_cfg.max_queues =3D max_rx_queues; =20 - err =3D gve_init_priv(priv, false); + err =3D gve_init_priv(priv); if (err) goto abort_with_wq; =20 + err =3D gve_setup_device(priv); + if (err) { + dev_err(&priv->pdev->dev, + "Could not setup device: err=3D%d\n", err); + goto abort_with_wq; + } + if (!gve_is_gqi(priv) && !gve_is_qpl(priv)) dev->netmem_tx =3D NETMEM_TX_DMA; =20 @@ -2944,6 +2957,9 @@ static int gve_probe(struct pci_dev *pdev, const stru= ct pci_device_id *ent) abort_with_unmap_db_bar: priv->ctrl_ops->unmap_db_bar(priv); =20 +abort_with_adminq: + gve_adminq_free(priv); + abort_with_netdev: free_netdev(dev); =20 --=20 2.55.0.979.g7e5102b832-goog From nobody Sat Sep 26 06:20:32 2026 Received: from mail-pl1-f199.google.com (mail-pl1-f199.google.com [209.85.214.199]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9F5AD466B75 for ; Thu, 3 Sep 2026 21:56:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.199 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788472578; cv=none; b=kPG4+oCWG6RT+m6w9TmKKbNfL1Ftmyib/FOtgmveVIDMG0ZlUpJAZDiJinFAfUCV9LlnSVSDoEJu0oy7j6AExzXxrw7018kkKzedkJpOidvU6NG8B6JQVzAY8oF4UAcEHZ3l/VzpH5xnVmkrL5cxORxEagU+AOSGwMIVNuL8dzU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788472578; c=relaxed/simple; bh=HsHvZT7pR/MvNkJ8+BRH3srQUNUF7PxZAyEAImHOIUg=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=YRvlkgGJE7cQ5EG3vnpq5nCKVWC4hhnnGmzLDpqo5Szuovq50qt3AxorKcD7NfMAXPzI8NQYBo/SnZouhZDqqfrq/vr2FkfCkzVFysA/0qQtfJKuUZuf4aiUyGkANFCIwI90cLE10MNFd3YsYJnUTKDkgebELFlZagH74KoCMgg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--hramamurthy.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=FQzgzS0n; arc=none smtp.client-ip=209.85.214.199 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--hramamurthy.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="FQzgzS0n" Received: by mail-pl1-f199.google.com with SMTP id d9443c01a7336-2cfa55c9430so3460615ad.0 for ; Thu, 03 Sep 2026 14:56:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1788472574; x=1789077374; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=jy0/DjZftTI7A0PnWhYKVfo0zj0Rna5IDpQBsqoC/Fo=; b=FQzgzS0nYw93LguAlQIu6qrmJu0UuabwScg/tOGDK6sj9+FJml77LRQdjHrJpuv5K4 Yl70oWTKpmX/1v0E+N66j5wsQ62kfcZTpEQIdaLRBRO5mVw+POe9KIk5TjDugdXo59J7 i3zsjUNIHlsxLoBvfvUMWALFgOXytUEN/g8SJXTG893WvrHlC6vsXLo9xx7vTH0ccAz6 vP6K0UGEIgOmoCEoEdZelQn7HbPjoNsA7sRqs1uxnnrPN+alnb4GcH4/pStthMCh5PTZ z27nhWpOEJxk8cLIdau4gdYrrwcrvy80ixBe5JGl1akzNjDZ4e5IFRpnumsTYjkuPAV4 THOA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788472574; x=1789077374; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=jy0/DjZftTI7A0PnWhYKVfo0zj0Rna5IDpQBsqoC/Fo=; b=gqBSiIUDXcDzGI5esd3sRqUfLuUuxwdvY7ZfcZ6tns8q0BkvRdrxxFDO0aj87QfLMm qP3gSM9T/G6SyEss7fGAB2H7QtovWi7WMwwLpCGG4/01eP7CHO08KOXn4HXpbxLRKxtp 3N+obqPtIpaGHLAg1mYa0zqbm41EXBmImAxhhpMeb0//GJ1ClI3irS5IrnVQDRLyB45j cWOYtZNzbTtcSbbpX7FbY8oGS5VZa8rfi/JBWChAYb4sUXQNoy2YEd0GJLdoDJsfrkJK h4qEL6Rw/kSwIzw8evni9VNCd7a/sWTj063ZrM0joc1F5uyN6y/378+O1NGL0Pw3EkWo x3aA== X-Forwarded-Encrypted: i=1; AKwUvBxCqB++UHPtUfcJKNmAxT6Bqw7CQomr1Clg2O3J548wnnUF9DUt/KEX6m8QoDOlR3ngE1Kmir5zhBo4qcg=@vger.kernel.org X-Gm-Message-State: AFuF++neivWFAsUz27+AoDrGOqYs06pWn/vP/O8e8ssRnLAImZvD5K7V 9lojG1i7LwsojJ+M9Gp6O96SFky8u5O83+8Rvy2+pZKuzDB99XM8hlhhlyUXbBizxTcXPBAI9AZ 8rd/5KOBvnCwUSUMirrIqxfyNeg== X-Received: from plbke13.prod.google.com ([2002:a17:903:340d:b0:2ca:b48c:5a92]) (user=hramamurthy job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:da8e:b0:2da:eb8f:b4e4 with SMTP id d9443c01a7336-2db124c35f8mr25164015ad.7.1788472573460; Thu, 03 Sep 2026 14:56:13 -0700 (PDT) Date: Thu, 3 Sep 2026 21:56:00 +0000 In-Reply-To: <20260903215606.31633-1-hramamurthy@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260903215606.31633-1-hramamurthy@google.com> X-Mailer: git-send-email 2.55.0.979.g7e5102b832-goog Message-ID: <20260903215606.31633-7-hramamurthy@google.com> Subject: [PATCH net-next v5 06/12] gve: simplify reset logic From: Harshitha Ramamurthy To: netdev@vger.kernel.org Cc: joshwash@google.com, hramamurthy@google.com, andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, ast@kernel.org, daniel@iogearbox.net, hawk@kernel.org, john.fastabend@gmail.com, sdf@fomichev.me, jordanrhee@google.com, willemb@google.com, nktgrg@google.com, maolson@google.com, thostet@google.com, jacob.e.keller@intel.com, debarghyak@google.com, kees@kernel.org, bpf@vger.kernel.org, linux-kernel@vger.kernel.org, przemyslaw.kitszel@intel.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Joshua Washington Current GVE reset logic is quite complex, with a number of methods with similar names and functionalities. This complexity has allowed a number of bugs to enter the reset/recovery path, including the potential for reset loops if an operation fails during teardown. Simplify the reset path by doing the following: 1) Removing recursive resets. Recursive resets have two major issues. First, there is the potential for stack overflows if resets are invoked too many times in a row. Second, long recursive calls mean that GVE never gives up the RTNL lock, or at the very least holds it for too long. If a reset must occur anywhere during the reset/recovery path, it should be scheduled as a separate task. 2) Removing resets during teardown. This is partly covered by removing recursive resets, but the primary goal in this case is to ensure that the driver is capable of actually executing a hardware reset if something goes wrong with a control plane operation. As it stands, if `deconfigure_device_resources` fails, for example, GVE will preempt its reset with another reset without actually invoking a hardware reset, which could actually help with recovery. 3) Decompose allocation/de-allocation and setup/teardown. Performing allocation and setup for each control plane system (RSS, ptype map, etc) leaves many more error conditions to handle, causing teardown in the case of failures to be much more complex than they need to be. This will also be useful to better align a major behavioral change in mailbox mode, which will use separate response buffers instead to get data from the device instead of a pre-allocated shared memory region. With the new reset functionality, shared resources between the device and driver are not freed until after the hardware reset has completed in the event that `deconfigure_device_resources` fails, meaning that the device could potentially still be holding on to shared memory. Reviewed-by: Willem de Bruijn Reviewed-by: Jordan Rhee Reviewed-by: Przemek Kitszel Signed-off-by: Joshua Washington Signed-off-by: Harshitha Ramamurthy --- v5: - fix workqueue disable count imbalance in reset and suspend path (Sashiko) - destroy rings before stopping queues (Sashiko) - ensure to call gve_queues_stop in error path in gve_close() - pull out gve_turndown out of gve_queues_stop so the ordering of gve_turndown(stop NAPIs) -> gve_destroy_rings -> gve_queues_stop(free rin= gs) can be preserved v4: - fix kdoc formatting for gve_teardown_control_plane_resources - ignore management interrupt if device is not okay v3: - only reset when failing to program flow rules as ethtool op - don't attempt to teardown rings in reset path if AQ is not allocated - fix work queue semantics related to management IRQ handler v2: - Fixed typos in commit message (recursive, preempt) - Fixed a kdoc warning drivers/net/ethernet/google/gve/gve.h | 2 +- drivers/net/ethernet/google/gve/gve_adminq.c | 9 +- drivers/net/ethernet/google/gve/gve_adminq.h | 1 - drivers/net/ethernet/google/gve/gve_ethtool.c | 2 +- .../net/ethernet/google/gve/gve_flow_rule.c | 15 +- drivers/net/ethernet/google/gve/gve_main.c | 351 +++++++++--------- 6 files changed, 197 insertions(+), 183 deletions(-) diff --git a/drivers/net/ethernet/google/gve/gve.h b/drivers/net/ethernet/g= oogle/gve/gve.h index 48cc8a6be186..026d685ecaee 100644 --- a/drivers/net/ethernet/google/gve/gve.h +++ b/drivers/net/ethernet/google/gve/gve.h @@ -1348,7 +1348,7 @@ struct page_pool *gve_rx_create_page_pool(struct gve_= priv *priv, =20 /* Reset */ void gve_schedule_reset(struct gve_priv *priv); -int gve_reset(struct gve_priv *priv, bool attempt_teardown); +int gve_reset(struct gve_priv *priv, bool skip_queue_setup); void gve_get_curr_alloc_cfgs(struct gve_priv *priv, struct gve_tx_alloc_rings_cfg *tx_alloc_cfg, struct gve_rx_alloc_rings_cfg *rx_alloc_cfg); diff --git a/drivers/net/ethernet/google/gve/gve_adminq.c b/drivers/net/eth= ernet/google/gve/gve_adminq.c index a62cb7a921d0..901673d2e264 100644 --- a/drivers/net/ethernet/google/gve/gve_adminq.c +++ b/drivers/net/ethernet/google/gve/gve_adminq.c @@ -365,7 +365,7 @@ int gve_adminq_init(struct gve_priv *priv) return gve_adminq_alloc(priv); } =20 -void gve_adminq_release(struct gve_priv *priv) +static void gve_adminq_release(struct gve_priv *priv) { int i =3D 0; =20 @@ -394,7 +394,6 @@ void gve_adminq_release(struct gve_priv *priv) } gve_clear_device_rings_ok(priv); gve_clear_device_resources_ok(priv); - gve_clear_admin_queue_ok(priv); } =20 void gve_adminq_free(struct gve_priv *priv) @@ -1377,12 +1376,8 @@ gve_adminq_configure_flow_rule(struct gve_priv *priv, sizeof(struct gve_adminq_configure_flow_rule), flow_rule_cmd); =20 - if (err =3D=3D -ETIME) { - dev_err(&priv->pdev->dev, "Timeout to configure the flow rule, trigger r= eset"); - gve_reset(priv, true); - } else if (!err) { + if (!err) priv->flow_rules_cache.rules_cache_synced =3D false; - } =20 return err; } diff --git a/drivers/net/ethernet/google/gve/gve_adminq.h b/drivers/net/eth= ernet/google/gve/gve_adminq.h index 78eee3b5cb7f..fe1e8868cdfe 100644 --- a/drivers/net/ethernet/google/gve/gve_adminq.h +++ b/drivers/net/ethernet/google/gve/gve_adminq.h @@ -621,7 +621,6 @@ static_assert(sizeof(union gve_adminq_command) =3D=3D 6= 4); =20 int gve_adminq_init(struct gve_priv *priv); void gve_adminq_free(struct gve_priv *priv); -void gve_adminq_release(struct gve_priv *priv); int gve_adminq_describe_device(struct gve_priv *priv); int gve_adminq_configure_device_resources(struct gve_priv *priv, dma_addr_t counter_array_bus_addr, diff --git a/drivers/net/ethernet/google/gve/gve_ethtool.c b/drivers/net/et= hernet/google/gve/gve_ethtool.c index 8199738ba979..dd1c44fedc77 100644 --- a/drivers/net/ethernet/google/gve/gve_ethtool.c +++ b/drivers/net/ethernet/google/gve/gve_ethtool.c @@ -651,7 +651,7 @@ static int gve_user_reset(struct net_device *netdev, u3= 2 *flags) =20 if (*flags =3D=3D ETH_RESET_ALL) { *flags =3D 0; - return gve_reset(priv, true); + return gve_reset(priv, false); } =20 return -EOPNOTSUPP; diff --git a/drivers/net/ethernet/google/gve/gve_flow_rule.c b/drivers/net/= ethernet/google/gve/gve_flow_rule.c index 2c80cda28ef3..fae552f4ad6f 100644 --- a/drivers/net/ethernet/google/gve/gve_flow_rule.c +++ b/drivers/net/ethernet/google/gve/gve_flow_rule.c @@ -278,6 +278,11 @@ int gve_add_flow_rule(struct gve_priv *priv, struct et= htool_rxnfc *cmd) goto out; =20 err =3D gve_adminq_add_flow_rule(priv, rule, fsp->location); + if (err =3D=3D -ETIME) { + dev_err(&priv->pdev->dev, + "Timeout to add flow rule, trigger reset."); + gve_reset(priv, false); + } =20 out: kvfree(rule); @@ -290,9 +295,17 @@ int gve_add_flow_rule(struct gve_priv *priv, struct et= htool_rxnfc *cmd) int gve_del_flow_rule(struct gve_priv *priv, struct ethtool_rxnfc *cmd) { struct ethtool_rx_flow_spec *fsp =3D (struct ethtool_rx_flow_spec *)&cmd-= >fs; + int err; =20 if (!priv->max_flow_rules) return -EOPNOTSUPP; =20 - return gve_adminq_del_flow_rule(priv, fsp->location); + err =3D gve_adminq_del_flow_rule(priv, fsp->location); + if (err =3D=3D -ETIME) { + dev_err(&priv->pdev->dev, + "Timeout to delete flow rule, trigger reset."); + gve_reset(priv, false); + } + + return err; } diff --git a/drivers/net/ethernet/google/gve/gve_main.c b/drivers/net/ether= net/google/gve/gve_main.c index 16ce55c6d74f..acd09e9f416c 100644 --- a/drivers/net/ethernet/google/gve/gve_main.c +++ b/drivers/net/ethernet/google/gve/gve_main.c @@ -270,6 +270,10 @@ static irqreturn_t gve_mgmnt_intr(int irq, void *arg) { struct gve_priv *priv =3D arg; =20 + /* Device resources are not okay; consider the interrupt spurious. */ + if (!gve_get_device_resources_ok(priv)) + return IRQ_NONE; + queue_work(priv->gve_wq, &priv->service_task); return IRQ_HANDLED; } @@ -590,7 +594,22 @@ static void gve_free_notify_blocks(struct gve_priv *pr= iv) priv->msix_vectors =3D NULL; } =20 -static int gve_setup_device_resources(struct gve_priv *priv) +static void gve_free_control_plane_resources(struct gve_priv *priv) +{ + bitmap_free(priv->xsk_pools); + priv->xsk_pools =3D NULL; + + kvfree(priv->ptype_lut_dqo); + priv->ptype_lut_dqo =3D NULL; + + gve_free_stats_report(priv); + gve_free_notify_blocks(priv); + gve_free_counter_array(priv); + gve_free_rss_config_cache(priv); + gve_free_flow_rule_caches(priv); +} + +static int gve_alloc_control_plane_resources(struct gve_priv *priv) { int err; =20 @@ -599,16 +618,42 @@ static int gve_setup_device_resources(struct gve_priv= *priv) return err; err =3D gve_alloc_rss_config_cache(priv); if (err) - goto abort_with_flow_rule_caches; + goto abort; err =3D gve_alloc_counter_array(priv); if (err) - goto abort_with_rss_config_cache; + goto abort; err =3D gve_alloc_notify_blocks(priv); if (err) - goto abort_with_counter; + goto abort; err =3D gve_alloc_stats_report(priv); if (err) - goto abort_with_ntfy_blocks; + goto abort; + + if (!gve_is_gqi(priv)) { + priv->ptype_lut_dqo =3D kvzalloc_obj(*priv->ptype_lut_dqo, + GFP_KERNEL); + if (!priv->ptype_lut_dqo) { + err =3D -ENOMEM; + goto abort; + } + } + + priv->xsk_pools =3D bitmap_zalloc(priv->rx_cfg.max_queues, GFP_KERNEL); + if (!priv->xsk_pools) { + err =3D -ENOMEM; + goto abort; + } + + return 0; +abort: + gve_free_control_plane_resources(priv); + return err; +} + +static int gve_setup_control_plane_resources(struct gve_priv *priv) +{ + int err =3D 0; + err =3D gve_adminq_configure_device_resources(priv, priv->counter_array_bus, priv->num_event_counters, @@ -618,20 +663,15 @@ static int gve_setup_device_resources(struct gve_priv= *priv) dev_err(&priv->pdev->dev, "could not setup device_resources: err=3D%d\n", err); err =3D -ENXIO; - goto abort_with_stats_report; + return err; } =20 if (!gve_is_gqi(priv)) { - priv->ptype_lut_dqo =3D kvzalloc_obj(*priv->ptype_lut_dqo); - if (!priv->ptype_lut_dqo) { - err =3D -ENOMEM; - goto abort_with_stats_report; - } err =3D gve_adminq_get_ptype_map_dqo(priv, priv->ptype_lut_dqo); if (err) { dev_err(&priv->pdev->dev, "Failed to get ptype map: err=3D%d\n", err); - goto abort_with_ptype_lut; + goto deconfigure_device; } } =20 @@ -646,7 +686,7 @@ static int gve_setup_device_resources(struct gve_priv *= priv) err =3D gve_init_rss_config(priv, priv->rx_cfg.num_queues); if (err) { dev_err(&priv->pdev->dev, "Failed to init RSS config"); - goto abort_with_clock; + goto teardown_clock; } =20 err =3D gve_adminq_report_stats(priv, priv->stats_report_len, @@ -658,67 +698,64 @@ static int gve_setup_device_resources(struct gve_priv= *priv) gve_set_device_resources_ok(priv); return 0; =20 -abort_with_clock: +teardown_clock: gve_teardown_clock(priv); -abort_with_ptype_lut: - kvfree(priv->ptype_lut_dqo); - priv->ptype_lut_dqo =3D NULL; -abort_with_stats_report: - gve_free_stats_report(priv); -abort_with_ntfy_blocks: - gve_free_notify_blocks(priv); -abort_with_counter: - gve_free_counter_array(priv); -abort_with_rss_config_cache: - gve_free_rss_config_cache(priv); -abort_with_flow_rule_caches: - gve_free_flow_rule_caches(priv); - +deconfigure_device: + gve_adminq_deconfigure_device_resources(priv); return err; } =20 -static void gve_trigger_reset(struct gve_priv *priv); - -static void gve_teardown_device_resources(struct gve_priv *priv) +/** + * gve_teardown_control_plane_resources() - Request the device to release = any + * shared allocated resources. + * + * @priv: Pointer to the GVE private device data structure. + * + * If any part of the teardown step fails, the failure is documented, but = is + * otherwise ignored. It is expected that a device reset is triggered + * immediately after tearing down device resources, which would clear any + * lingering state on the device. + */ +static void gve_teardown_control_plane_resources(struct gve_priv *priv) { int err; =20 /* Tell device its resources are being freed */ if (gve_get_device_resources_ok(priv)) { err =3D gve_flow_rules_reset(priv); - if (err) { + if (err) dev_err(&priv->pdev->dev, "Failed to reset flow rules: err=3D%d\n", err); - gve_trigger_reset(priv); - } /* detach the stats report */ err =3D gve_adminq_report_stats(priv, 0, 0x0, GVE_STATS_REPORT_TIMER_PER= IOD); - if (err) { + if (err) dev_err(&priv->pdev->dev, "Failed to detach stats report: err=3D%d\n", err); - gve_trigger_reset(priv); - } + gve_teardown_clock(priv); err =3D gve_adminq_deconfigure_device_resources(priv); - if (err) { + if (err) dev_err(&priv->pdev->dev, "Could not deconfigure device resources: err=3D%d\n", err); - gve_trigger_reset(priv); - } } =20 - kvfree(priv->ptype_lut_dqo); - priv->ptype_lut_dqo =3D NULL; - - gve_free_flow_rule_caches(priv); - gve_free_rss_config_cache(priv); - gve_free_counter_array(priv); - gve_free_notify_blocks(priv); - gve_free_stats_report(priv); - gve_teardown_clock(priv); gve_clear_device_resources_ok(priv); } =20 +static void gve_teardown_device(struct gve_priv *priv) +{ + gve_teardown_control_plane_resources(priv); + gve_adminq_free(priv); + /* + * Free any resources shared with the device only after we have a + * guarantee that the device will not try to access such resources. + * Device commands in gve_teardown_control_plane_resources can fail, in + * which case, device resources won't be relinquished until + * gve_adminq_free is called to trigger a device reset. + */ + gve_free_control_plane_resources(priv); +} + static int gve_unregister_qpl(struct gve_priv *priv, struct gve_queue_page_list *qpl) { @@ -1157,8 +1194,6 @@ void gve_schedule_reset(struct gve_priv *priv) queue_work(priv->gve_wq, &priv->service_task); } =20 -static void gve_reset_and_teardown(struct gve_priv *priv, bool was_up); -static int gve_reset_recovery(struct gve_priv *priv, bool was_up); static void gve_turndown(struct gve_priv *priv); static void gve_turnup(struct gve_priv *priv); =20 @@ -1269,11 +1304,12 @@ static int gve_reg_xdp_info(struct gve_priv *priv, = struct net_device *dev) return err; } =20 - static void gve_drain_page_cache(struct gve_priv *priv) { int i; =20 + if (!priv->rx) + return; for (i =3D 0; i < priv->rx_cfg.num_queues; i++) page_frag_cache_drain(&priv->rx[i].page_cache); } @@ -1416,10 +1452,11 @@ static int gve_queues_start(struct gve_priv *priv, reset: if (gve_get_reset_in_progress(priv)) goto stop_and_free_rings; - gve_reset_and_teardown(priv, true); - /* if this fails there is nothing we can do so just ignore the return */ - gve_reset_recovery(priv, false); - /* return the original error */ + + /* Attempt to reset. If reset is successful, gve_queues_start was + * successful. + */ + err =3D gve_reset(priv, false); return err; stop_and_free_rings: gve_tx_stop_rings(priv, gve_num_tx_queues(priv)); @@ -1435,6 +1472,12 @@ static int gve_open(struct net_device *dev) struct gve_priv *priv =3D netdev_priv(dev); int err; =20 + if (!gve_get_device_resources_ok(priv)) { + dev_err(&priv->pdev->dev, + "Attempting to open netdev without resources. Device must be reset."); + return -ENODEV; + } + gve_get_curr_alloc_cfgs(priv, &tx_alloc_cfg, &rx_alloc_cfg); =20 err =3D gve_queues_mem_alloc(priv, &tx_alloc_cfg, &rx_alloc_cfg); @@ -1451,41 +1494,16 @@ static int gve_open(struct net_device *dev) return 0; } =20 -static int gve_queues_stop(struct gve_priv *priv) +static void gve_queues_stop(struct gve_priv *priv) { - int err; + gve_unreg_xdp_info(priv); + gve_drain_page_cache(priv); =20 - netif_carrier_off(priv->dev); - if (gve_get_device_rings_ok(priv)) { - gve_turndown(priv); - gve_drain_page_cache(priv); - err =3D gve_destroy_rings(priv); - if (err) - goto err; - err =3D gve_unregister_qpls(priv); - if (err) - goto err; - gve_clear_device_rings_ok(priv); - } timer_delete_sync(&priv->stats_report_timer); - - gve_unreg_xdp_info(priv); + cancel_work_sync(&priv->stats_report_task); =20 gve_tx_stop_rings(priv, gve_num_tx_queues(priv)); gve_rx_stop_rings(priv, priv->rx_cfg.num_queues); - - priv->interface_down_cnt++; - return 0; - -err: - /* This must have been called from a reset due to the rtnl lock - * so just return at this point. - */ - if (gve_get_reset_in_progress(priv)) - return err; - /* Otherwise reset before returning */ - gve_reset_and_teardown(priv, true); - return gve_reset_recovery(priv, false); } =20 static int gve_close(struct net_device *dev) @@ -1493,12 +1511,30 @@ static int gve_close(struct net_device *dev) struct gve_priv *priv =3D netdev_priv(dev); int err; =20 - err =3D gve_queues_stop(priv); - if (err) - return err; + gve_turndown(priv); + + /* Surrender to reset if the queue destroying adminq cmds fail. Reset + * will not re-enable the interface. + */ + if (gve_get_device_rings_ok(priv)) { + gve_clear_device_rings_ok(priv); + err =3D gve_destroy_rings(priv); + if (err) + goto reset; + err =3D gve_unregister_qpls(priv); + if (err) + goto reset; + } =20 + gve_queues_stop(priv); gve_queues_mem_remove(priv); + priv->interface_down_cnt++; return 0; + +reset: + gve_queues_stop(priv); + err =3D gve_reset(priv, true); + return err; } =20 static void gve_handle_link_status(struct gve_priv *priv, bool link_status) @@ -2421,25 +2457,17 @@ static int gve_setup_device(struct gve_priv *priv) =20 priv->num_registered_pages =3D 0; =20 - priv->xsk_pools =3D bitmap_zalloc(priv->rx_cfg.max_queues, GFP_KERNEL); - if (!priv->xsk_pools) { - err =3D -ENOMEM; - goto err; - } - gve_set_netdev_xdp_features(priv); if (!gve_is_gqi(priv)) priv->dev->xdp_metadata_ops =3D &gve_xdp_metadata_ops; =20 - err =3D gve_setup_device_resources(priv); + err =3D gve_alloc_control_plane_resources(priv); if (err) - goto err_free_xsk_bitmap; - + goto err; + err =3D gve_setup_control_plane_resources(priv); + if (err) + goto err; return 0; - -err_free_xsk_bitmap: - bitmap_free(priv->xsk_pools); - priv->xsk_pools =3D NULL; err: return err; } @@ -2514,30 +2542,7 @@ static int gve_init_priv(struct gve_priv *priv) return 0; } =20 -static void gve_teardown_priv_resources(struct gve_priv *priv) -{ - gve_teardown_device_resources(priv); - gve_adminq_free(priv); - bitmap_free(priv->xsk_pools); - priv->xsk_pools =3D NULL; -} - -static void gve_trigger_reset(struct gve_priv *priv) -{ - /* Reset the device by releasing the AQ */ - gve_adminq_release(priv); -} - -static void gve_reset_and_teardown(struct gve_priv *priv, bool was_up) -{ - gve_trigger_reset(priv); - /* With the reset having already happened, close cannot fail */ - if (was_up) - gve_close(priv->dev); - gve_teardown_priv_resources(priv); -} - -static int gve_reset_recovery(struct gve_priv *priv, bool was_up) +static int gve_recover(struct gve_priv *priv, bool setup_queues) { int err; =20 @@ -2545,62 +2550,66 @@ static int gve_reset_recovery(struct gve_priv *priv= , bool was_up) if (err) { dev_err(&priv->pdev->dev, "Failed to alloc admin queue: err=3D%d\n", err); - goto err; + goto teardown_device; } =20 err =3D gve_adminq_verify_driver_compatibility(priv); if (err) { dev_err(&priv->pdev->dev, "Could not verify driver compatibility: err=3D%d\n", err); - goto err_free_adminq; + goto teardown_device; } =20 err =3D gve_setup_device(priv); if (err) - goto err_free_adminq; - if (was_up) { + goto teardown_device; + + if (setup_queues) { err =3D gve_open(priv->dev); if (err) - return err; + goto teardown_device; } + return 0; =20 -err_free_adminq: - gve_adminq_free(priv); -err: - dev_err(&priv->pdev->dev, "Reset failed! !!! DISABLING ALL QUEUES !!!\n"); - gve_turndown(priv); +teardown_device: + dev_err(&priv->pdev->dev, "Recover failed! !!! DISABLING ALL QUEUES !!!\n= "); + gve_teardown_device(priv); return err; } =20 -int gve_reset(struct gve_priv *priv, bool attempt_teardown) +int gve_reset(struct gve_priv *priv, bool skip_queue_setup) { bool was_up =3D netif_running(priv->dev); int err; =20 + if (gve_get_reset_in_progress(priv)) + return 0; + dev_info(&priv->pdev->dev, "Performing reset\n"); gve_clear_do_reset(priv); gve_set_reset_in_progress(priv); - /* If we aren't attempting to teardown normally, just go turndown and - * reset right away. - */ - if (!attempt_teardown) { + + if (was_up) { gve_turndown(priv); - gve_reset_and_teardown(priv, was_up); - } else { - /* Otherwise attempt to close normally */ - if (was_up) { - err =3D gve_close(priv->dev); - /* If that fails reset as we did above */ - if (err) - gve_reset_and_teardown(priv, was_up); + if (gve_get_device_rings_ok(priv)) { + gve_clear_device_rings_ok(priv); + gve_destroy_rings(priv); + gve_unregister_qpls(priv); } - /* Clean up any remaining resources */ - gve_teardown_priv_resources(priv); + gve_queues_stop(priv); } =20 - /* Set it all back up */ - err =3D gve_reset_recovery(priv, was_up); + disable_work(&priv->service_task); + gve_teardown_device(priv); + gve_queues_mem_remove(priv); + + enable_work(&priv->service_task); + err =3D gve_recover(priv, was_up && !skip_queue_setup); + if (err) + dev_info(&priv->pdev->dev, + "Failed to recover in reset: %d\n", err); + gve_clear_reset_in_progress(priv); priv->reset_cnt++; priv->interface_up_cnt =3D 0; @@ -2932,7 +2941,7 @@ static int gve_probe(struct pci_dev *pdev, const stru= ct pci_device_id *ent) if (err) { dev_err(&priv->pdev->dev, "Could not setup device: err=3D%d\n", err); - goto abort_with_wq; + goto abort_teardown_device; } =20 if (!gve_is_gqi(priv) && !gve_is_qpl(priv)) @@ -2940,7 +2949,7 @@ static int gve_probe(struct pci_dev *pdev, const stru= ct pci_device_id *ent) =20 err =3D register_netdev(dev); if (err) - goto abort_with_gve_init; + goto abort_teardown_device; =20 dev_info(&pdev->dev, "GVE version %s\n", gve_version_str); dev_info(&pdev->dev, "GVE queue format %d\n", (int)priv->queue_format); @@ -2948,8 +2957,9 @@ static int gve_probe(struct pci_dev *pdev, const stru= ct pci_device_id *ent) queue_work(priv->gve_wq, &priv->service_task); return 0; =20 -abort_with_gve_init: - gve_teardown_priv_resources(priv); +abort_teardown_device: + disable_work(&priv->stats_report_task); + gve_teardown_device(priv); =20 abort_with_wq: destroy_workqueue(priv->gve_wq); @@ -2981,7 +2991,8 @@ static void gve_remove(struct pci_dev *pdev) void __iomem *reg_bar =3D priv->reg_bar0; =20 unregister_netdev(netdev); - gve_teardown_priv_resources(priv); + disable_work_sync(&priv->service_task); + gve_teardown_device(priv); destroy_workqueue(priv->gve_wq); priv->ctrl_ops->unmap_db_bar(priv); free_netdev(netdev); @@ -2997,16 +3008,13 @@ static void gve_shutdown(struct pci_dev *pdev) bool was_up =3D netif_running(priv->dev); =20 netif_device_detach(netdev); + disable_work_sync(&priv->service_task); =20 rtnl_lock(); netdev_lock(netdev); - if (was_up && gve_close(priv->dev)) { - /* If the dev was up, attempt to close, if close fails, reset */ - gve_reset_and_teardown(priv, was_up); - } else { - /* If the dev wasn't up or close worked, finish tearing down */ - gve_teardown_priv_resources(priv); - } + if (was_up) + gve_close(priv->dev); + gve_teardown_device(priv); netdev_unlock(netdev); rtnl_unlock(); } @@ -3018,16 +3026,14 @@ static int gve_suspend(struct device *dev) struct gve_priv *priv =3D netdev_priv(netdev); bool was_up =3D netif_running(priv->dev); =20 + disable_work_sync(&priv->service_task); + priv->suspend_cnt++; rtnl_lock(); netdev_lock(netdev); - if (was_up && gve_close(priv->dev)) { - /* If the dev was up, attempt to close, if close fails, reset */ - gve_reset_and_teardown(priv, was_up); - } else { - /* If the dev wasn't up or close worked, finish tearing down */ - gve_teardown_priv_resources(priv); - } + if (was_up) + gve_close(priv->dev); + gve_teardown_device(priv); priv->up_before_suspend =3D was_up; netdev_unlock(netdev); rtnl_unlock(); @@ -3044,7 +3050,8 @@ static int gve_resume(struct device *dev) priv->resume_cnt++; rtnl_lock(); netdev_lock(netdev); - err =3D gve_reset_recovery(priv, priv->up_before_suspend); + enable_work(&priv->service_task); + err =3D gve_recover(priv, priv->up_before_suspend); netdev_unlock(netdev); rtnl_unlock(); return err; --=20 2.55.0.979.g7e5102b832-goog From nobody Sat Sep 26 06:20:32 2026 Received: from mail-pf1-f197.google.com (mail-pf1-f197.google.com [209.85.210.197]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3CD6346A61E for ; Thu, 3 Sep 2026 21:56:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.197 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788472577; cv=none; b=SD7yiwqHgrP3rZ3ZYUG8jKG1mTBOfYELnglc0YXiG7cWF1JWX14zlpa8B13csiFCxDz3r6hfxNYSGNQPREhGmmHHsQHe7X/wc9MbYPYksqtzu7mAgjAnh97saaisujMRX1tAgwZv5Pc4/b9kY66F/BoO1/vHPbsXUJqIhtYg1VE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788472577; c=relaxed/simple; bh=oJ5LXc/D+qG8sy2sDPQB0jmho2bwdxJBDK0DoOEF8TY=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=Wo+RdJcfdWOz7eVn7Tw+NXCLfSpheHPR7ZuBeYv2BIHyXYIIohuQVtQh3gkVfR75EtPNuTH5+z6ojnMMjR9kboZx1KN4LQr0Ef0A7fXK+/lctbyhSdiA/M+rBNRmR9n90W7PexK5ttF0EO+4S76j9oDJnzqF8G1iWAwEQGX2cOU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--hramamurthy.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=YSenXAfq; arc=none smtp.client-ip=209.85.210.197 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--hramamurthy.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="YSenXAfq" Received: by mail-pf1-f197.google.com with SMTP id d2e1a72fcca58-84a67b16217so389656b3a.3 for ; Thu, 03 Sep 2026 14:56:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1788472575; x=1789077375; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=c8VaX8XqamTwB/AwucsGIVTpWHuxdscpS26gdiqy3Xg=; b=YSenXAfqflODn/RVZ0N2YVS+gp5RtNr6uEl4alfXP4UiVhOyE9NOspem0TPDHzJCAt rXAx95gqBwW3HKTrvuK/qkLjkCjzHJ6a2I3tITfSNIBCDXuhj8zJ7cgDeSQFt3V7IseG 1vTet7dsVJRJmL8tU+P0Fg6RgIXYjwsrIoGrQOZHqZL/m91T1rN1rettLfRDZIdrgEDR nUD41SC5Z5cOBsiN6uUTeo8WP0l29QElTCl+UWLRyo1lX3KghIdY/UbLxjuvUBEpCPfq 9oE73MZKaz3c6V0KttPHPSD3RafcPK15Wsi9v/fuZh9iBKFmirycZknmqTwyifCswleD zujw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788472575; x=1789077375; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=c8VaX8XqamTwB/AwucsGIVTpWHuxdscpS26gdiqy3Xg=; b=aQvO/iUjeN/F8FD/7aypM5w7jhCbEvGW0iIZmCFO3hx9tYSEB+kC8HOpPp2PGLRAeR oKe4mItRkW91XnkHfbiPKxa89w9cvv1AH7gWR5QbUjO4mEmMRgOghqsCz1k6pMti2TXT hJZCQFZmh8kuhIavDtnpWUozpizvhdZxG6iNRotDVw/ncHh5N636xettypHGXa+Rp14q EcFo7AxCKoU2Wc2jOdEP4T1hCxQRPeeTzO8kViEQTDXQQEZua+2+5gIUdYi5qvVvkDXw uMMAUvNhCWbtk8URpFOej0n/jpNd+yn560XJ/LYqQh2ZRZ0YYtyEYweFWDgtas0dD/0X /Eyg== X-Forwarded-Encrypted: i=1; AKwUvBxziQvs0/WnbkDtdvURRxG7DA5xjvQ9OWMpLfWHhBkc2p3gYnRk4HT3Gjvk4w1ch2M6wlbsm969GAv7Hag=@vger.kernel.org X-Gm-Message-State: AFuF++nfb/tIm0EHCqmF7w4Q5UUf1OM62SJtDulDqYBoy61nIkaD3LlA Dsu8SrDFvmBnjZhkH6rO5GEPUyEjTmLSZKUVRsvwUAdMnblNb2c2sVSsV+quDEjxEICYAM/+ccY Vea3ImjDY4RzUkhKGFuFN/NUaPg== X-Received: from pfob11.prod.google.com ([2002:aa7:870b:0:b0:84b:62e9:404d]) (user=hramamurthy job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:4298:b0:84a:646f:193 with SMTP id d2e1a72fcca58-861633ca7b1mr3089319b3a.0.1788472574395; Thu, 03 Sep 2026 14:56:14 -0700 (PDT) Date: Thu, 3 Sep 2026 21:56:01 +0000 In-Reply-To: <20260903215606.31633-1-hramamurthy@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260903215606.31633-1-hramamurthy@google.com> X-Mailer: git-send-email 2.55.0.979.g7e5102b832-goog Message-ID: <20260903215606.31633-8-hramamurthy@google.com> Subject: [PATCH net-next v5 07/12] gve: add gve_ctrl_ops for gve initialization/teardown sequences From: Harshitha Ramamurthy To: netdev@vger.kernel.org Cc: joshwash@google.com, hramamurthy@google.com, andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, ast@kernel.org, daniel@iogearbox.net, hawk@kernel.org, john.fastabend@gmail.com, sdf@fomichev.me, jordanrhee@google.com, willemb@google.com, nktgrg@google.com, maolson@google.com, thostet@google.com, jacob.e.keller@intel.com, debarghyak@google.com, kees@kernel.org, bpf@vger.kernel.org, linux-kernel@vger.kernel.org, przemyslaw.kitszel@intel.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Joshua Washington Driver initialization and teardown involve a number of control plane operations that need to be defined for gve_probe to operate in both mailbox and adminq modes. This list includes: - get_ptype_map: a mapping of packet types (L3+L4) held in RX completion descriptors - configure_rss: set up default RSS configuration if the device is not queryable - setup_stats_report: set up DMA region for stats report (AQ-only) - reset_flow_rules: needed in teardown; flushes all flow rules from device Reviewed-by: Willem de Bruijn Reviewed-by: Jordan Rhee Reviewed-by: Przemek Kitszel Signed-off-by: Joshua Washington Signed-off-by: Harshitha Ramamurthy --- drivers/net/ethernet/google/gve/gve.h | 12 ++++++++++ drivers/net/ethernet/google/gve/gve_adminq.c | 7 +++--- drivers/net/ethernet/google/gve/gve_adminq.h | 3 +-- drivers/net/ethernet/google/gve/gve_main.c | 24 +++++++++++++++----- 4 files changed, 34 insertions(+), 12 deletions(-) diff --git a/drivers/net/ethernet/google/gve/gve.h b/drivers/net/ethernet/g= oogle/gve/gve.h index 026d685ecaee..e0583e8cd2cd 100644 --- a/drivers/net/ethernet/google/gve/gve.h +++ b/drivers/net/ethernet/google/gve/gve.h @@ -833,12 +833,24 @@ struct gve_device_info { * structures stored in @priv to be used during initializ= ation. * @set_num_ntfy_blks: Sets no. of vectors into @priv to be used during * initialization. + * @get_ptype_map: Learn packet type map from device and store it in @priv + * @configure_rss: Set up default RSS configuration + * @setup_stats_report: Set up DMA region for stats report (AdminQ only) + * @reset_flow_rules: Flush all flow rules from device */ struct gve_ctrl_ops { int (*map_db_bar)(struct gve_priv *priv); void (*unmap_db_bar)(struct gve_priv *priv); void (*set_num_queues)(struct gve_priv *priv); int (*set_num_ntfy_blks)(struct gve_priv *priv); + int (*get_ptype_map)(struct gve_priv *priv); + int (*configure_rss)(struct gve_priv *priv, + struct ethtool_rxfh_param *param); + int (*setup_stats_report)(struct gve_priv *priv, + u64 stats_report_len, + dma_addr_t stats_report_addr, + u64 interval_ms); /* AQ-specific */ + int (*reset_flow_rules)(struct gve_priv *priv); }; =20 struct gve_priv { diff --git a/drivers/net/ethernet/google/gve/gve_adminq.c b/drivers/net/eth= ernet/google/gve/gve_adminq.c index 901673d2e264..1176e13fafc0 100644 --- a/drivers/net/ethernet/google/gve/gve_adminq.c +++ b/drivers/net/ethernet/google/gve/gve_adminq.c @@ -1329,8 +1329,7 @@ int gve_adminq_report_nic_ts(struct gve_priv *priv, return gve_adminq_execute_cmd(priv, &cmd); } =20 -int gve_adminq_get_ptype_map_dqo(struct gve_priv *priv, - struct gve_ptype_lut *ptype_lut) +int gve_adminq_get_ptype_map_dqo(struct gve_priv *priv) { struct gve_ptype_map *ptype_map; union gve_adminq_command cmd; @@ -1356,9 +1355,9 @@ int gve_adminq_get_ptype_map_dqo(struct gve_priv *pri= v, =20 /* Populate ptype_lut. */ for (i =3D 0; i < GVE_NUM_PTYPES; i++) { - ptype_lut->ptypes[i].l3_type =3D + priv->ptype_lut_dqo->ptypes[i].l3_type =3D ptype_map->ptypes[i].l3_type; - ptype_lut->ptypes[i].l4_type =3D + priv->ptype_lut_dqo->ptypes[i].l4_type =3D ptype_map->ptypes[i].l4_type; } err: diff --git a/drivers/net/ethernet/google/gve/gve_adminq.h b/drivers/net/eth= ernet/google/gve/gve_adminq.h index fe1e8868cdfe..5e51c060e237 100644 --- a/drivers/net/ethernet/google/gve/gve_adminq.h +++ b/drivers/net/ethernet/google/gve/gve_adminq.h @@ -652,8 +652,7 @@ int gve_adminq_report_nic_ts(struct gve_priv *priv, dma_addr_t nic_ts_report_addr); =20 struct gve_ptype_lut; -int gve_adminq_get_ptype_map_dqo(struct gve_priv *priv, - struct gve_ptype_lut *ptype_lut); +int gve_adminq_get_ptype_map_dqo(struct gve_priv *priv); int gve_adminq_set_num_ntfy_blks(struct gve_priv *priv); void gve_adminq_set_num_queues(struct gve_priv *priv); int gve_adminq_map_db_bar(struct gve_priv *priv); diff --git a/drivers/net/ethernet/google/gve/gve_main.c b/drivers/net/ether= net/google/gve/gve_main.c index acd09e9f416c..5ad7a8f9bbdd 100644 --- a/drivers/net/ethernet/google/gve/gve_main.c +++ b/drivers/net/ethernet/google/gve/gve_main.c @@ -652,7 +652,8 @@ static int gve_alloc_control_plane_resources(struct gve= _priv *priv) =20 static int gve_setup_control_plane_resources(struct gve_priv *priv) { - int err =3D 0; + const struct gve_ctrl_ops *ops =3D priv->ctrl_ops; + int err; =20 err =3D gve_adminq_configure_device_resources(priv, priv->counter_array_bus, @@ -667,7 +668,7 @@ static int gve_setup_control_plane_resources(struct gve= _priv *priv) } =20 if (!gve_is_gqi(priv)) { - err =3D gve_adminq_get_ptype_map_dqo(priv, priv->ptype_lut_dqo); + err =3D ops->get_ptype_map(priv); if (err) { dev_err(&priv->pdev->dev, "Failed to get ptype map: err=3D%d\n", err); @@ -689,12 +690,13 @@ static int gve_setup_control_plane_resources(struct g= ve_priv *priv) goto teardown_clock; } =20 - err =3D gve_adminq_report_stats(priv, priv->stats_report_len, + err =3D ops->setup_stats_report(priv, priv->stats_report_len, priv->stats_report_bus, GVE_STATS_REPORT_TIMER_PERIOD); if (err) dev_err(&priv->pdev->dev, "Failed to report stats: err=3D%d\n", err); + gve_set_device_resources_ok(priv); return 0; =20 @@ -718,6 +720,7 @@ static int gve_setup_control_plane_resources(struct gve= _priv *priv) */ static void gve_teardown_control_plane_resources(struct gve_priv *priv) { + const struct gve_ctrl_ops *ops =3D priv->ctrl_ops; int err; =20 /* Tell device its resources are being freed */ @@ -727,11 +730,13 @@ static void gve_teardown_control_plane_resources(stru= ct gve_priv *priv) dev_err(&priv->pdev->dev, "Failed to reset flow rules: err=3D%d\n", err); /* detach the stats report */ - err =3D gve_adminq_report_stats(priv, 0, 0x0, GVE_STATS_REPORT_TIMER_PER= IOD); + err =3D ops->setup_stats_report(priv, 0, 0x0, + GVE_STATS_REPORT_TIMER_PERIOD); if (err) dev_err(&priv->pdev->dev, "Failed to detach stats report: err=3D%d\n", err); gve_teardown_clock(priv); + err =3D gve_adminq_deconfigure_device_resources(priv); if (err) dev_err(&priv->pdev->dev, @@ -1815,6 +1820,7 @@ static int gve_xdp(struct net_device *dev, struct net= dev_bpf *xdp) =20 int gve_init_rss_config(struct gve_priv *priv, u16 num_queues) { + const struct gve_ctrl_ops *ops =3D priv->ctrl_ops; struct gve_rss_config *rss_config =3D &priv->rss_config; struct ethtool_rxfh_param rxfh =3D {0}; u16 i; @@ -1830,15 +1836,17 @@ int gve_init_rss_config(struct gve_priv *priv, u16 = num_queues) =20 rxfh.hfunc =3D ETH_RSS_HASH_TOP; =20 - return gve_adminq_configure_rss(priv, &rxfh); + return ops->configure_rss(priv, &rxfh); } =20 int gve_flow_rules_reset(struct gve_priv *priv) { + const struct gve_ctrl_ops *ops =3D priv->ctrl_ops; + if (!priv->max_flow_rules) return 0; =20 - return gve_adminq_reset_flow_rules(priv); + return ops->reset_flow_rules(priv); } =20 int gve_adjust_config(struct gve_priv *priv, @@ -2477,6 +2485,10 @@ static const struct gve_ctrl_ops gve_adminq_ops =3D { .unmap_db_bar =3D gve_adminq_unmap_db_bar, .set_num_queues =3D gve_adminq_set_num_queues, .set_num_ntfy_blks =3D gve_adminq_set_num_ntfy_blks, + .get_ptype_map =3D gve_adminq_get_ptype_map_dqo, + .reset_flow_rules =3D gve_adminq_reset_flow_rules, + .setup_stats_report =3D gve_adminq_report_stats, + .configure_rss =3D gve_adminq_configure_rss, }; =20 static int gve_init_priv(struct gve_priv *priv) --=20 2.55.0.979.g7e5102b832-goog From nobody Sat Sep 26 06:20:32 2026 Received: from mail-pg1-f198.google.com (mail-pg1-f198.google.com [209.85.215.198]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3F3FD46F484 for ; Thu, 3 Sep 2026 21:56:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.198 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788472578; cv=none; b=kslfGPSRD1uKo7fmlgBuqDj8rkg6CxjIaGqltFI8l1m/Wgnvq/kEPrH4FDvUeRedz3wFIfvvGpmBWt8a0QFWGLzT44F/Wa9xWgfGGXZamieZZsDOi3H2b/yyV1+JxOPAGxwKYt+/H6uuuU67Kk0lVUFQo+ETFP10DCpt3Bscjfc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788472578; c=relaxed/simple; bh=EFzWg5seOjSH4dr1mQc9t/VYqRi5/F4+7DVLfLxpNE4=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=Xau9PrrUaeeXWlMA5HQMSCnvW/jm5AETyKM1gor+zGWXyFH2h5CY+uq+HaDUdXkgi7fmjwoe1aQ3QVew6zLSfL/g3FJqz5MZEQK4Y5QBfNYVHeFX0KDPufEe/Fr1d516Q6/7PvRZM79zp9ska0t4xYXL9CkmsGNkIAYEhKa1WQw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--hramamurthy.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=EZwLFMRK; arc=none smtp.client-ip=209.85.215.198 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--hramamurthy.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="EZwLFMRK" Received: by mail-pg1-f198.google.com with SMTP id 41be03b00d2f7-cc435388657so577828a12.3 for ; Thu, 03 Sep 2026 14:56:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1788472575; x=1789077375; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=POLFDV5ToRqJzphBCLNbkXeaDKO1+a35gbsUXlKP3XQ=; b=EZwLFMRKpa535uE1+R2wxdSKCG6f0seJUqMkLPDzcOk+TdWCXOyCFDnwpBqrqUoqTT oHHZ7DZcD1dKr1CNU11lXT9zVeYaObcjYo90bY0eeDt0eVylpddFPV9ndyj1WKOwnWlZ 5GXnxEgV407LdvL94MQ0Sqid4MQO/0abPLV8SULpIEt8F/mNlR1Yc9d9iazpAITmeV6/ pPPBtdgonNvpwMKHtbS2GYqzpjIyyXwNvUFaIsVPq598cz31HwqHUKKi8WRK2BAD53So HxrXOWnxpedD0a9JT097LtmrRb0BxYnXiHXkiuDMXnBTyixq3W0RJiZNHG/McuSFW+/Z aDDA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788472575; x=1789077375; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=POLFDV5ToRqJzphBCLNbkXeaDKO1+a35gbsUXlKP3XQ=; b=Po5tnKLsC22AKCOTnIGRQ/vxNzV5QvKwDqO3P0TIxb7DY04QaSp2P1iuPWMKc0pEI3 Mms3b/c+TvjgQUq/LNNbp+qto681ElkEQTbrerdQSTQv7+7Wl25mOp99a/xz86aWfAgg Tzhi+4Z3eZfKx11lxKJmSiu7jrgf8OHs5Ni1Dx4aKM6IrBQIMbyLkSkblt5gGEfRTYvW /SlnN9R4wj+sp4qBKp8r7BYNYUgy6EZhJ89lSJgCWqGJn0FDyjwvlijqavM+7XSVOqI+ DDzTx8cdiopiwpuiYf0gkpbIQH1CvMIXtjGGHvGQCHnONiRSWG/qaeqQkmrR6GVFY0og G/BQ== X-Forwarded-Encrypted: i=1; AKwUvBzJze3kokut4tUklfjj0pDxHzItCuCD+TiuCIyWw9i2nJt9Z4NNQnIZUbKPqIevkaMi5iySHdwIr1EQi7k=@vger.kernel.org X-Gm-Message-State: AFuF++lXZiXdUQxGOvYvxsPbMxZT+dr6g+OineBsSsQyxQ1FnGUMM9pd 9zJfardvCpG1xvUUgHl5qoU0od0ILjQM9sf9V3Xg5o8iXc7Wo8kM6HvQtWifOHI8q+VvfZZtePo zN+xDE04r/n/M7jQEu6X0lCVIUQ== X-Received: from pgfd4-n1.prod.google.com ([2002:a05:6a02:6544:10b0:c85:735b:ca4a]) (user=hramamurthy job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6300:6710:b0:3d8:1f68:59ac with SMTP id adf61e73a8af0-3da3a15bfc3mr2354491637.23.1788472575182; Thu, 03 Sep 2026 14:56:15 -0700 (PDT) Date: Thu, 3 Sep 2026 21:56:02 +0000 In-Reply-To: <20260903215606.31633-1-hramamurthy@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260903215606.31633-1-hramamurthy@google.com> X-Mailer: git-send-email 2.55.0.979.g7e5102b832-goog Message-ID: <20260903215606.31633-9-hramamurthy@google.com> Subject: [PATCH net-next v5 08/12] gve: split up notify block allocation and setup paths From: Harshitha Ramamurthy To: netdev@vger.kernel.org Cc: joshwash@google.com, hramamurthy@google.com, andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, ast@kernel.org, daniel@iogearbox.net, hawk@kernel.org, john.fastabend@gmail.com, sdf@fomichev.me, jordanrhee@google.com, willemb@google.com, nktgrg@google.com, maolson@google.com, thostet@google.com, jacob.e.keller@intel.com, debarghyak@google.com, kees@kernel.org, bpf@vger.kernel.org, linux-kernel@vger.kernel.org, przemyslaw.kitszel@intel.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Joshua Washington Before this patch, notify block allocation and setup occurred in the same method. This all occurred before gve_adminq_configure_device_resources, which populates the irq_db_indicies array, a DMA region with BAR offsets for MSI-X vectors. The coming mailbox mode will require notify blocks to be set up only after receiving the IRQ doorbell offsets, as the request does not work with a supplied DMA buffer in the way that admin queue mode does. The intended flow in that case would be: 1) allocate notify blocks 2) request doorbell information 3) set up MSI-X vectors based on doorbell info This ordering also works for admin queue mode, so it will be updated to match. Reviewed-by: Willem de Bruijn Reviewed-by: Jordan Rhee Reviewed-by: Przemek Kitszel Signed-off-by: Joshua Washington Signed-off-by: Harshitha Ramamurthy --- v3: - remove redundant call to gve_teardown_clock() drivers/net/ethernet/google/gve/gve.h | 2 + drivers/net/ethernet/google/gve/gve_main.c | 155 +++++++++++---------- 2 files changed, 86 insertions(+), 71 deletions(-) diff --git a/drivers/net/ethernet/google/gve/gve.h b/drivers/net/ethernet/g= oogle/gve/gve.h index e0583e8cd2cd..f624a3e385e4 100644 --- a/drivers/net/ethernet/google/gve/gve.h +++ b/drivers/net/ethernet/google/gve/gve.h @@ -674,6 +674,7 @@ struct gve_notify_block { struct gve_tx_ring *tx; /* tx rings on this block */ struct gve_rx_ring *rx; /* rx rings on this block */ u32 irq; + bool irq_requested; }; =20 /* Tracks allowed and current rx queue settings */ @@ -954,6 +955,7 @@ struct gve_priv { u64 link_speed; bool up_before_suspend; /* True if dev was up before suspend */ =20 + bool mgmt_irq_requested; struct gve_ptype_lut *ptype_lut_dqo; =20 /* Must be a power of two. */ diff --git a/drivers/net/ethernet/google/gve/gve_main.c b/drivers/net/ether= net/google/gve/gve_main.c index 5ad7a8f9bbdd..619ef46a7b30 100644 --- a/drivers/net/ethernet/google/gve/gve_main.c +++ b/drivers/net/ethernet/google/gve/gve_main.c @@ -428,6 +428,24 @@ int gve_napi_poll_dqo(struct napi_struct *napi, int bu= dget) return work_done; } =20 +static void gve_free_notify_blocks(struct gve_priv *priv) +{ + pci_disable_msix(priv->pdev); + if (priv->irq_db_indices) { + dma_free_coherent(&priv->pdev->dev, + priv->num_ntfy_blks * + sizeof(*priv->irq_db_indices), + priv->irq_db_indices, + priv->irq_db_indices_bus); + priv->irq_db_indices =3D NULL; + } + + kvfree(priv->ntfy_blocks); + priv->ntfy_blocks =3D NULL; + kvfree(priv->msix_vectors); + priv->msix_vectors =3D NULL; +} + static const struct cpumask *gve_get_node_mask(struct gve_priv *priv) { if (priv->numa_node =3D=3D NUMA_NO_NODE) @@ -439,11 +457,9 @@ static const struct cpumask *gve_get_node_mask(struct = gve_priv *priv) static int gve_alloc_notify_blocks(struct gve_priv *priv) { int num_vecs_requested =3D priv->num_ntfy_blks + 1; - const struct cpumask *node_mask; - unsigned int cur_cpu; int vecs_enabled; - int i, j; int err; + int i; =20 priv->msix_vectors =3D kvzalloc_objs(*priv->msix_vectors, num_vecs_requested); @@ -457,7 +473,7 @@ static int gve_alloc_notify_blocks(struct gve_priv *pri= v) dev_err(&priv->pdev->dev, "Could not enable min msix %d/%d\n", GVE_MIN_MSIX, vecs_enabled); err =3D vecs_enabled; - goto abort_with_msix_vectors; + goto abort; } if (vecs_enabled !=3D num_vecs_requested) { int new_num_ntfy_blks =3D (vecs_enabled - 1) & ~0x1; @@ -480,15 +496,6 @@ static int gve_alloc_notify_blocks(struct gve_priv *pr= iv) priv->rx_cfg.num_queues =3D priv->rx_cfg.max_queues; } =20 - /* Setup Management Vector - the last vector */ - snprintf(priv->mgmt_msix_name, sizeof(priv->mgmt_msix_name), "gve-mgmnt@p= ci:%s", - pci_name(priv->pdev)); - err =3D request_irq(priv->msix_vectors[priv->mgmt_msix_idx].vector, - gve_mgmnt_intr, 0, priv->mgmt_msix_name, priv); - if (err) { - dev_err(&priv->pdev->dev, "Did not receive management vector.\n"); - goto abort_with_msix_enabled; - } priv->irq_db_indices =3D dma_alloc_coherent(&priv->pdev->dev, priv->num_ntfy_blks * @@ -496,15 +503,65 @@ static int gve_alloc_notify_blocks(struct gve_priv *p= riv) &priv->irq_db_indices_bus, GFP_KERNEL); if (!priv->irq_db_indices) { err =3D -ENOMEM; - goto abort_with_mgmt_vector; + goto abort; } =20 priv->ntfy_blocks =3D kvzalloc(priv->num_ntfy_blks * sizeof(*priv->ntfy_blocks), GFP_KERNEL); if (!priv->ntfy_blocks) { err =3D -ENOMEM; - goto abort_with_irq_db_indices; + goto abort; + } + return 0; + +abort: + gve_free_notify_blocks(priv); + return err; +} + +static void gve_teardown_notify_blocks(struct gve_priv *priv) +{ + int i; + + if (!priv->ntfy_blocks) + return; + + for (i =3D 0; i < priv->num_ntfy_blks; i++) { + struct gve_notify_block *block =3D &priv->ntfy_blocks[i]; + + if (!block->irq_requested) + continue; + + irq_set_affinity_hint(priv->msix_vectors[i].vector, + NULL); + free_irq(priv->msix_vectors[i].vector, block); + block->irq =3D 0; + block->irq_requested =3D false; + } + + if (priv->mgmt_irq_requested) { + free_irq(priv->msix_vectors[priv->mgmt_msix_idx].vector, priv); + priv->mgmt_irq_requested =3D false; + } +} + +static int gve_setup_notify_blocks(struct gve_priv *priv) +{ + const struct cpumask *node_mask; + unsigned int cur_cpu; + int i; + int err; + + /* Setup Management Vector - the last vector */ + snprintf(priv->mgmt_msix_name, sizeof(priv->mgmt_msix_name), + "gve-mgmnt@pci:%s", pci_name(priv->pdev)); + err =3D request_irq(priv->msix_vectors[priv->mgmt_msix_idx].vector, + gve_mgmnt_intr, 0, priv->mgmt_msix_name, priv); + if (err) { + dev_err(&priv->pdev->dev, "Did not receive management vector.\n"); + return err; } + priv->mgmt_irq_requested =3D true; =20 /* Setup the other blocks - the first n-1 vectors */ node_mask =3D gve_get_node_mask(priv); @@ -522,9 +579,10 @@ static int gve_alloc_notify_blocks(struct gve_priv *pr= iv) if (err) { dev_err(&priv->pdev->dev, "Failed to receive msix vector %d\n", i); - goto abort_with_some_ntfy_blocks; + goto abort; } block->irq =3D priv->msix_vectors[msix_idx].vector; + block->irq_requested =3D true; irq_set_affinity_and_hint(block->irq, cpumask_of(cur_cpu)); block->irq_db_index =3D &priv->irq_db_indices[i].index; @@ -538,61 +596,12 @@ static int gve_alloc_notify_blocks(struct gve_priv *p= riv) cur_cpu =3D cpumask_first(node_mask); } return 0; -abort_with_some_ntfy_blocks: - for (j =3D 0; j < i; j++) { - struct gve_notify_block *block =3D &priv->ntfy_blocks[j]; - int msix_idx =3D j; =20 - irq_set_affinity_hint(priv->msix_vectors[msix_idx].vector, - NULL); - free_irq(priv->msix_vectors[msix_idx].vector, block); - block->irq =3D 0; - } - kvfree(priv->ntfy_blocks); - priv->ntfy_blocks =3D NULL; -abort_with_irq_db_indices: - dma_free_coherent(&priv->pdev->dev, priv->num_ntfy_blks * - sizeof(*priv->irq_db_indices), - priv->irq_db_indices, priv->irq_db_indices_bus); - priv->irq_db_indices =3D NULL; -abort_with_mgmt_vector: - free_irq(priv->msix_vectors[priv->mgmt_msix_idx].vector, priv); -abort_with_msix_enabled: - pci_disable_msix(priv->pdev); -abort_with_msix_vectors: - kvfree(priv->msix_vectors); - priv->msix_vectors =3D NULL; +abort: + gve_teardown_notify_blocks(priv); return err; } =20 -static void gve_free_notify_blocks(struct gve_priv *priv) -{ - int i; - - if (!priv->msix_vectors) - return; - - /* Free the irqs */ - for (i =3D 0; i < priv->num_ntfy_blks; i++) { - struct gve_notify_block *block =3D &priv->ntfy_blocks[i]; - int msix_idx =3D i; - - irq_set_affinity_hint(priv->msix_vectors[msix_idx].vector, - NULL); - free_irq(priv->msix_vectors[msix_idx].vector, block); - block->irq =3D 0; - } - free_irq(priv->msix_vectors[priv->mgmt_msix_idx].vector, priv); - kvfree(priv->ntfy_blocks); - priv->ntfy_blocks =3D NULL; - dma_free_coherent(&priv->pdev->dev, priv->num_ntfy_blks * - sizeof(*priv->irq_db_indices), - priv->irq_db_indices, priv->irq_db_indices_bus); - priv->irq_db_indices =3D NULL; - pci_disable_msix(priv->pdev); - kvfree(priv->msix_vectors); - priv->msix_vectors =3D NULL; -} =20 static void gve_free_control_plane_resources(struct gve_priv *priv) { @@ -749,6 +758,7 @@ static void gve_teardown_control_plane_resources(struct= gve_priv *priv) =20 static void gve_teardown_device(struct gve_priv *priv) { + gve_teardown_notify_blocks(priv); gve_teardown_control_plane_resources(priv); gve_adminq_free(priv); /* @@ -2471,13 +2481,16 @@ static int gve_setup_device(struct gve_priv *priv) =20 err =3D gve_alloc_control_plane_resources(priv); if (err) - goto err; + return err; + err =3D gve_setup_control_plane_resources(priv); if (err) - goto err; + return err; + + err =3D gve_setup_notify_blocks(priv); + if (err) + return err; return 0; -err: - return err; } =20 static const struct gve_ctrl_ops gve_adminq_ops =3D { --=20 2.55.0.979.g7e5102b832-goog From nobody Sat Sep 26 06:20:32 2026 Received: from mail-pl1-f198.google.com (mail-pl1-f198.google.com [209.85.214.198]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 32570470121 for ; Thu, 3 Sep 2026 21:56:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.198 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788472580; cv=none; b=kJ1W7XrvyNykyZNbR2ZIuZhjbkmfcMEwItS4KUuzckS/UphwiEH8huvo5vJvHNQKqgbwswMDFMGcynaN1E6Vfdvm9uYxYBcyziwOZwAyrDmtFX/0ZwpWi9z5UIPshWsCRkSm2+h6i6zcMMGKgFCzj0SMTNy2rO8FDr0fNUJmvzk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788472580; c=relaxed/simple; bh=mwE2Oun7z8jzz6V//FWI4B+Z7Qd5Ezv6A+HF6TBy/0I=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=jPOS3wf5U0W/tSzkQAsBUZhENJq/Q5CKkV5OB3+pncW3inglMSkPlWgeY+jxEe4LtejUbZIaQdppVch2zyUlibH5Zm8BAISOAVIG5ocWg5bAm+6FenrAjwDLOexN66ERI4WkPXHqCflJvO9ZTeoiJvJKqGKDAc9ipEFRD+G8fi0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--hramamurthy.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=NUAQObcX; arc=none smtp.client-ip=209.85.214.198 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--hramamurthy.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="NUAQObcX" Received: by mail-pl1-f198.google.com with SMTP id d9443c01a7336-2d54187d8b0so9438455ad.0 for ; Thu, 03 Sep 2026 14:56:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1788472576; x=1789077376; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=E4ghh9tuxvrR3CfO46i2D/h+X9aiPc5GRPuwzecUql0=; b=NUAQObcXy5May/f9gLvjm6ZwpaiWRx5NnEttHo4T8XckNjJzxgpBupPbegb1jrbDjb W+jo0O8uh+Tf1Msz/u6U0PDHkcNaIUnJeU00ntJTSaf6Rllpvi+mb1KvLgnjBYcqrerh CuOU3Y4JTgJ79sC2f+vRtGN2oRMyx69CN51Uljcxr+ESPwkRVn0Tf8nLwNYa9jVX2meL Yz15RcmbH6KqrxIYFqTikDTCMBAz6978tLO3cVlhnwtYfDfNDCoEqjFAE5cN71UpXMV/ CoaZC5UfKo+bIUFmrlIwKTBtBCzE4Pl/D3OALqdvu7Gi0GNrOJtgDf6gQaPfLe8z3t5J wooA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788472576; x=1789077376; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=E4ghh9tuxvrR3CfO46i2D/h+X9aiPc5GRPuwzecUql0=; b=Iva+7BxS9PXv6sf6tPsMlz65BZ8B0jqaiy3UmdiO9R8sy2qMHksC96kHt4Xe42TeJ1 0r644Nj5B4rQ7z/BaZKsYdHl1ynf8xBy+1bAYPVLpkHf43jNxigRpWUiO+IWPUQvaMeo 43qTUoN+4rhl8lyTaEEdgwnAz/Zj+8k4btdtzbVQQ0uNihLg4gwyKjo6HUOMHGXIGlj+ +/PxZcwhnyUZT6CC6ocpLea0w29y7whkzX/g6Vxlg801GkfSMPRP+rm0LxzWsCiD3aO3 6aiS99xbo4vLx2/GmJLbH49qQv1jnL+FjiYFeKGyGARxDKrG3aMCbvDH3C636e1czs9t uAsg== X-Forwarded-Encrypted: i=1; AKwUvBy8NEjj8XhV1PpMe1EfpKmkn3S/H11B3PP+GyOICasiCKK+YYfJDosVYSWJoy+wgHv8sBen52+/KYyUjkY=@vger.kernel.org X-Gm-Message-State: AFuF++m0Av81FqJdfA3ewbnOVw2Zcil4CcP/KF8fTl576/XE/4Ub7dg8 LSoVeBvskztw5iG0A1de/TA+w24G8gyn5V8Tn5AVd/cXUuc1hfhcHoAFid5eZBir0SZm1PIOcg8 jUmI+hVz/YuO++rV60mTgmvxg+w== X-Received: from ploh14.prod.google.com ([2002:a17:902:f70e:b0:2d7:b1a:879e]) (user=hramamurthy job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:19cc:b0:2d7:1cee:3682 with SMTP id d9443c01a7336-2db125cd39dmr32568085ad.5.1788472575997; Thu, 03 Sep 2026 14:56:15 -0700 (PDT) Date: Thu, 3 Sep 2026 21:56:03 +0000 In-Reply-To: <20260903215606.31633-1-hramamurthy@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260903215606.31633-1-hramamurthy@google.com> X-Mailer: git-send-email 2.55.0.979.g7e5102b832-goog Message-ID: <20260903215606.31633-10-hramamurthy@google.com> Subject: [PATCH net-next v5 09/12] gve: introduce new methods to handle IRQ doorbells From: Harshitha Ramamurthy To: netdev@vger.kernel.org Cc: joshwash@google.com, hramamurthy@google.com, andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, ast@kernel.org, daniel@iogearbox.net, hawk@kernel.org, john.fastabend@gmail.com, sdf@fomichev.me, jordanrhee@google.com, willemb@google.com, nktgrg@google.com, maolson@google.com, thostet@google.com, jacob.e.keller@intel.com, debarghyak@google.com, kees@kernel.org, bpf@vger.kernel.org, linux-kernel@vger.kernel.org, przemyslaw.kitszel@intel.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Joshua Washington Introduce `request_db_info` and `release_db_resources` to `struct gve_ctrl_ops`. These encapsulate the configuration of device resources (counter arrays and IRQ doorbell indices) which vary between Admin Queue and Mailbox modes. Registration and de-registratino of IRQ dorrbell indices with the device will be managed by these new methods instead of occurring directly in notify_block setup/teardown methods. Similarly, GQ ring counters will be managed in `request_db_info`. Reviewed-by: Willem de Bruijn Reviewed-by: Jordan Rhee Reviewed-by: Przemek Kitszel Signed-off-by: Joshua Washington Signed-off-by: Harshitha Ramamurthy --- v4: - propagate code changes as specified by v3. v3: - move allocation of IRQ DB indices and counter array back into gve_alloc_control_plane_resources() from gve_adminq_request_db_info(). - Similar to above, move free logic out of gve_adminq_free_db_resources() and rename all introduced methods from *free_db_resources to *release_db_resources to reflect the behavioral change. drivers/net/ethernet/google/gve/gve.h | 10 ++ drivers/net/ethernet/google/gve/gve_adminq.c | 37 ++++++++ drivers/net/ethernet/google/gve/gve_adminq.h | 2 + drivers/net/ethernet/google/gve/gve_main.c | 98 ++++++++++---------- 4 files changed, 97 insertions(+), 50 deletions(-) diff --git a/drivers/net/ethernet/google/gve/gve.h b/drivers/net/ethernet/g= oogle/gve/gve.h index f624a3e385e4..6c46c842070b 100644 --- a/drivers/net/ethernet/google/gve/gve.h +++ b/drivers/net/ethernet/google/gve/gve.h @@ -834,6 +834,9 @@ struct gve_device_info { * structures stored in @priv to be used during initializ= ation. * @set_num_ntfy_blks: Sets no. of vectors into @priv to be used during * initialization. + * @request_db_info: Request and store doorbell information into @priv + * @release_db_resources: Release device hold on DMA memory holding doorbe= ll + * info (AdminQ only) * @get_ptype_map: Learn packet type map from device and store it in @priv * @configure_rss: Set up default RSS configuration * @setup_stats_report: Set up DMA region for stats report (AdminQ only) @@ -844,6 +847,8 @@ struct gve_ctrl_ops { void (*unmap_db_bar)(struct gve_priv *priv); void (*set_num_queues)(struct gve_priv *priv); int (*set_num_ntfy_blks)(struct gve_priv *priv); + int (*request_db_info)(struct gve_priv *priv); + void (*release_db_resources)(struct gve_priv *priv); int (*get_ptype_map)(struct gve_priv *priv); int (*configure_rss)(struct gve_priv *priv, struct ethtool_rxfh_param *param); @@ -1164,6 +1169,11 @@ static inline u32 gve_rx_idx_to_ntfy(struct gve_priv= *priv, u32 queue_idx) return (priv->num_ntfy_blks / 2) + queue_idx; } =20 +static inline u32 gve_ntfy_to_msix_idx(struct gve_priv *priv, u32 ntfy_blk= _idx) +{ + return ntfy_blk_idx; +} + static inline bool gve_is_qpl(struct gve_priv *priv) { return priv->queue_format =3D=3D GVE_GQI_QPL_FORMAT || diff --git a/drivers/net/ethernet/google/gve/gve_adminq.c b/drivers/net/eth= ernet/google/gve/gve_adminq.c index 1176e13fafc0..b89825a85db8 100644 --- a/drivers/net/ethernet/google/gve/gve_adminq.c +++ b/drivers/net/ethernet/google/gve/gve_adminq.c @@ -1718,3 +1718,40 @@ void gve_adminq_unmap_db_bar(struct gve_priv *priv) =20 pci_iounmap(pdev, priv->db_bar2); } + +int gve_adminq_request_db_info(struct gve_priv *priv) +{ + int err; + int i; + + err =3D gve_adminq_configure_device_resources(priv, + priv->counter_array_bus, + priv->num_event_counters, + priv->irq_db_indices_bus, + priv->num_ntfy_blks); + if (unlikely(err)) { + dev_err(&priv->pdev->dev, + "could not setup device_resources: err=3D%d\n", err); + return -ENXIO; + } + + for (i =3D 0; i < priv->num_ntfy_blks; i++) + priv->ntfy_blocks[i].irq_db_index =3D + &priv->irq_db_indices[i].index; + return 0; +} + +void gve_adminq_release_db_resources(struct gve_priv *priv) +{ + int err; + + /* Log error in deconfigure device, but don't fail. This is only ever + * called as a reset is about to be triggered, so it would be redundant + * to trigger a reset. + */ + err =3D gve_adminq_deconfigure_device_resources(priv); + if (err) + dev_err(&priv->pdev->dev, + "Could not deconfigure device resources: err=3D%d\n", + err); +} diff --git a/drivers/net/ethernet/google/gve/gve_adminq.h b/drivers/net/eth= ernet/google/gve/gve_adminq.h index 5e51c060e237..52172bf228eb 100644 --- a/drivers/net/ethernet/google/gve/gve_adminq.h +++ b/drivers/net/ethernet/google/gve/gve_adminq.h @@ -657,4 +657,6 @@ int gve_adminq_set_num_ntfy_blks(struct gve_priv *priv); void gve_adminq_set_num_queues(struct gve_priv *priv); int gve_adminq_map_db_bar(struct gve_priv *priv); void gve_adminq_unmap_db_bar(struct gve_priv *priv); +int gve_adminq_request_db_info(struct gve_priv *priv); +void gve_adminq_release_db_resources(struct gve_priv *priv); #endif /* _GVE_ADMINQ_H */ diff --git a/drivers/net/ethernet/google/gve/gve_main.c b/drivers/net/ether= net/google/gve/gve_main.c index 619ef46a7b30..a160d36f718b 100644 --- a/drivers/net/ethernet/google/gve/gve_main.c +++ b/drivers/net/ethernet/google/gve/gve_main.c @@ -203,6 +203,30 @@ static void gve_free_counter_array(struct gve_priv *pr= iv) priv->counter_array =3D NULL; } =20 +static int gve_alloc_irq_db_indices(struct gve_priv *priv) +{ + priv->irq_db_indices =3D + dma_alloc_coherent(&priv->pdev->dev, + priv->num_ntfy_blks * + sizeof(*priv->irq_db_indices), + &priv->irq_db_indices_bus, GFP_KERNEL); + if (!priv->irq_db_indices) + return -ENOMEM; + + return 0; +} + +static void gve_free_irq_db_indices(struct gve_priv *priv) +{ + if (!priv->irq_db_indices) + return; + + dma_free_coherent(&priv->pdev->dev, priv->num_ntfy_blks * + sizeof(*priv->irq_db_indices), + priv->irq_db_indices, priv->irq_db_indices_bus); + priv->irq_db_indices =3D NULL; +} + /* NIC requests to report stats */ static void gve_stats_report_task(struct work_struct *work) { @@ -431,15 +455,6 @@ int gve_napi_poll_dqo(struct napi_struct *napi, int bu= dget) static void gve_free_notify_blocks(struct gve_priv *priv) { pci_disable_msix(priv->pdev); - if (priv->irq_db_indices) { - dma_free_coherent(&priv->pdev->dev, - priv->num_ntfy_blks * - sizeof(*priv->irq_db_indices), - priv->irq_db_indices, - priv->irq_db_indices_bus); - priv->irq_db_indices =3D NULL; - } - kvfree(priv->ntfy_blocks); priv->ntfy_blocks =3D NULL; kvfree(priv->msix_vectors); @@ -496,24 +511,14 @@ static int gve_alloc_notify_blocks(struct gve_priv *p= riv) priv->rx_cfg.num_queues =3D priv->rx_cfg.max_queues; } =20 - priv->irq_db_indices =3D - dma_alloc_coherent(&priv->pdev->dev, - priv->num_ntfy_blks * - sizeof(*priv->irq_db_indices), - &priv->irq_db_indices_bus, GFP_KERNEL); - if (!priv->irq_db_indices) { - err =3D -ENOMEM; - goto abort; - } - priv->ntfy_blocks =3D kvzalloc(priv->num_ntfy_blks * sizeof(*priv->ntfy_blocks), GFP_KERNEL); if (!priv->ntfy_blocks) { err =3D -ENOMEM; goto abort; } - return 0; =20 + return 0; abort: gve_free_notify_blocks(priv); return err; @@ -528,13 +533,14 @@ static void gve_teardown_notify_blocks(struct gve_pri= v *priv) =20 for (i =3D 0; i < priv->num_ntfy_blks; i++) { struct gve_notify_block *block =3D &priv->ntfy_blocks[i]; + int msix_idx =3D gve_ntfy_to_msix_idx(priv, i); =20 if (!block->irq_requested) continue; =20 - irq_set_affinity_hint(priv->msix_vectors[i].vector, + irq_set_affinity_hint(priv->msix_vectors[msix_idx].vector, NULL); - free_irq(priv->msix_vectors[i].vector, block); + free_irq(priv->msix_vectors[msix_idx].vector, block); block->irq =3D 0; block->irq_requested =3D false; } @@ -563,12 +569,11 @@ static int gve_setup_notify_blocks(struct gve_priv *p= riv) } priv->mgmt_irq_requested =3D true; =20 - /* Setup the other blocks - the first n-1 vectors */ node_mask =3D gve_get_node_mask(priv); cur_cpu =3D cpumask_first(node_mask); for (i =3D 0; i < priv->num_ntfy_blks; i++) { struct gve_notify_block *block =3D &priv->ntfy_blocks[i]; - int msix_idx =3D i; + int msix_idx =3D gve_ntfy_to_msix_idx(priv, i); =20 snprintf(block->name, sizeof(block->name), "gve-ntfy-blk%d@pci:%s", i, pci_name(priv->pdev)); @@ -578,14 +583,13 @@ static int gve_setup_notify_blocks(struct gve_priv *p= riv) IRQF_NO_AUTOEN, block->name, block); if (err) { dev_err(&priv->pdev->dev, - "Failed to receive msix vector %d\n", i); + "Failed to receive msix vector %d\n", msix_idx); goto abort; } block->irq =3D priv->msix_vectors[msix_idx].vector; block->irq_requested =3D true; irq_set_affinity_and_hint(block->irq, cpumask_of(cur_cpu)); - block->irq_db_index =3D &priv->irq_db_indices[i].index; =20 cur_cpu =3D cpumask_next(cur_cpu, node_mask); /* Wrap once CPUs in the node have been exhausted, or when @@ -602,7 +606,6 @@ static int gve_setup_notify_blocks(struct gve_priv *pri= v) return err; } =20 - static void gve_free_control_plane_resources(struct gve_priv *priv) { bitmap_free(priv->xsk_pools); @@ -611,9 +614,10 @@ static void gve_free_control_plane_resources(struct gv= e_priv *priv) kvfree(priv->ptype_lut_dqo); priv->ptype_lut_dqo =3D NULL; =20 - gve_free_stats_report(priv); - gve_free_notify_blocks(priv); + gve_free_irq_db_indices(priv); gve_free_counter_array(priv); + gve_free_notify_blocks(priv); + gve_free_stats_report(priv); gve_free_rss_config_cache(priv); gve_free_flow_rule_caches(priv); } @@ -626,15 +630,18 @@ static int gve_alloc_control_plane_resources(struct g= ve_priv *priv) if (err) return err; err =3D gve_alloc_rss_config_cache(priv); - if (err) - goto abort; - err =3D gve_alloc_counter_array(priv); if (err) goto abort; err =3D gve_alloc_notify_blocks(priv); if (err) goto abort; err =3D gve_alloc_stats_report(priv); + if (err) + goto abort; + err =3D gve_alloc_counter_array(priv); + if (err) + goto abort; + err =3D gve_alloc_irq_db_indices(priv); if (err) goto abort; =20 @@ -664,15 +671,9 @@ static int gve_setup_control_plane_resources(struct gv= e_priv *priv) const struct gve_ctrl_ops *ops =3D priv->ctrl_ops; int err; =20 - err =3D gve_adminq_configure_device_resources(priv, - priv->counter_array_bus, - priv->num_event_counters, - priv->irq_db_indices_bus, - priv->num_ntfy_blks); - if (unlikely(err)) { - dev_err(&priv->pdev->dev, - "could not setup device_resources: err=3D%d\n", err); - err =3D -ENXIO; + err =3D ops->request_db_info(priv); + if (err) { + dev_err(&priv->pdev->dev, "Failed to get db info"); return err; } =20 @@ -681,7 +682,7 @@ static int gve_setup_control_plane_resources(struct gve= _priv *priv) if (err) { dev_err(&priv->pdev->dev, "Failed to get ptype map: err=3D%d\n", err); - goto deconfigure_device; + goto release_db_resources; } } =20 @@ -711,8 +712,8 @@ static int gve_setup_control_plane_resources(struct gve= _priv *priv) =20 teardown_clock: gve_teardown_clock(priv); -deconfigure_device: - gve_adminq_deconfigure_device_resources(priv); +release_db_resources: + ops->release_db_resources(priv); return err; } =20 @@ -745,12 +746,7 @@ static void gve_teardown_control_plane_resources(struc= t gve_priv *priv) dev_err(&priv->pdev->dev, "Failed to detach stats report: err=3D%d\n", err); gve_teardown_clock(priv); - - err =3D gve_adminq_deconfigure_device_resources(priv); - if (err) - dev_err(&priv->pdev->dev, - "Could not deconfigure device resources: err=3D%d\n", - err); + ops->release_db_resources(priv); } =20 gve_clear_device_resources_ok(priv); @@ -2502,6 +2498,8 @@ static const struct gve_ctrl_ops gve_adminq_ops =3D { .reset_flow_rules =3D gve_adminq_reset_flow_rules, .setup_stats_report =3D gve_adminq_report_stats, .configure_rss =3D gve_adminq_configure_rss, + .request_db_info =3D gve_adminq_request_db_info, + .release_db_resources =3D gve_adminq_release_db_resources, }; =20 static int gve_init_priv(struct gve_priv *priv) --=20 2.55.0.979.g7e5102b832-goog From nobody Sat Sep 26 06:20:32 2026 Received: from mail-pg1-f200.google.com (mail-pg1-f200.google.com [209.85.215.200]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DF4D347CA94 for ; Thu, 3 Sep 2026 21:56:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.200 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788472580; cv=none; b=m5JwK3526TgQnGy0PFOda4kAxbaLFaXaerZ6HLqVNOXAJ8ob77qFqwinQgD7LwAGmlnywFA9KVQ2FeNqpxAWwq9T14C0oWplzGDzh7alS8aNEkJ9Y75UJiTsxBSf3Wm6ScV5TV/TYzOb6H2k1/W1yj3HzPeKM4ZaSI7TYT2OgSU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788472580; c=relaxed/simple; bh=UyCu6zaHd9Mtt6oi1kGQ/laLILUKBplkYapgmvTp6uM=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=RiQV9uHFjU7BShBrPMy4ruSIXMfl0zMAMD2DdgE4SzCg1CHKg2Mg2hY1yIWyWE7Z7WNPu1eIkIfIMnW5DGidg/ASrlDpj9u3QSRfXlNlurnnlgff8KFBqHP12gDtuevb+XbakwuVOSFnqXMgHeJxlhWdN5crPe2A6tw3VAQvR+A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--hramamurthy.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=jv8qKs+S; arc=none smtp.client-ip=209.85.215.200 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--hramamurthy.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="jv8qKs+S" Received: by mail-pg1-f200.google.com with SMTP id 41be03b00d2f7-cb11535e6a1so467215a12.0 for ; Thu, 03 Sep 2026 14:56:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1788472577; x=1789077377; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=7J2P94AGfyQbQcsczyvGgrjPXcbDaXoY2R0Xbl6/Fag=; b=jv8qKs+SYySKSqA5U9ZqL3I5ohJ1Xseaud1CVPWKBtjAg3x8QWImVxE2uPYYKoDDR1 Tr02fxHgQBhUZs2AmhL8ik8KBXy/Y+MImMmQBKanjUXn3J40IHng3IhKBI0uA8B8Khhr E8NVEC8+101Kk24ixpc+vLqy/QidcXp63drgHGNsuULdwCeJVoK5uwqvLz9FwmuChaHz S2iESoBVlRWF02CQSDougf0svE0h2ffuF8FHpUF787Jw1YZ4L94RJzGD+idynpYlHZZS lPvb1a3KQsXDVMSTw6Xv7MpvvnTt/U5fQiPkbPW1D/r2fxsTu0B8osmWZyVA0K7KKjEx JJsg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788472577; x=1789077377; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=7J2P94AGfyQbQcsczyvGgrjPXcbDaXoY2R0Xbl6/Fag=; b=Erf3cUtQv8az8PnBQGqKtZiy0bQdRZuqMxxsqcbqSy36a3bVWjHjLDuZzBrILbjQDj V6ooSNgVXCDTz3YPqWOtLRj2ZMMPOOLkUu0R/jiY2tTA6G2wschFpLsBe9J0nYatzVvV gOogvnebopVXwd+/pOLHgzllyDkbcW148GRDbkAXuh+vHF+5q3f8EMWaryvq4L0slm7X BHYvF/h8flJ2xoWaeYUuPLtzQSjqLXuk7IwgGi5t+pX3lCLbfN1k+KW5y9uyCR3c/L7L vpOq+oF1ZCfHghI/ldkL6E7Djm07HbKj0lwv6bZmFTjrFJe0Xjpqlt1bPW9yog58UNFI Ca3Q== X-Forwarded-Encrypted: i=1; AKwUvBwu6+QcHDfeFbhu21utkH+TJ7slw9NVLzBi2sjuaZcE/9jSBwIHH9kU0zoY9N/TVo8gggUrjcJoRFRp1tU=@vger.kernel.org X-Gm-Message-State: AFuF++kCcvCBJytgt6bkix95z4UhMQUgqtvCOqfcGpYiGF4WX5+ruXWU dU8ixDlpKL/Awy2+AtI1jc/e94cpQYOVep14FJmtDwPh7lCWA+iO77RzqfqGIMOWvuA+lrt3Bov ny3uOFGjdt+66llowpvWPgLrLlA== X-Received: from pfbna18.prod.google.com ([2002:a05:6a00:3e12:b0:84b:9a71:ba78]) (user=hramamurthy job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:181c:b0:85f:b00b:8760 with SMTP id d2e1a72fcca58-86168f83f7amr2457618b3a.5.1788472576700; Thu, 03 Sep 2026 14:56:16 -0700 (PDT) Date: Thu, 3 Sep 2026 21:56:04 +0000 In-Reply-To: <20260903215606.31633-1-hramamurthy@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260903215606.31633-1-hramamurthy@google.com> X-Mailer: git-send-email 2.55.0.979.g7e5102b832-goog Message-ID: <20260903215606.31633-11-hramamurthy@google.com> Subject: [PATCH net-next v5 10/12] gve: setup and teardown management interrupts From: Harshitha Ramamurthy To: netdev@vger.kernel.org Cc: joshwash@google.com, hramamurthy@google.com, andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, ast@kernel.org, daniel@iogearbox.net, hawk@kernel.org, john.fastabend@gmail.com, sdf@fomichev.me, jordanrhee@google.com, willemb@google.com, nktgrg@google.com, maolson@google.com, thostet@google.com, jacob.e.keller@intel.com, debarghyak@google.com, kees@kernel.org, bpf@vger.kernel.org, linux-kernel@vger.kernel.org, przemyslaw.kitszel@intel.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Joshua Washington Introduce control ops to setup/teardown control plane IRQs. Admin queue-specific functionality is moved to admin queue files. Reviewed-by: Willem de Bruijn Reviewed-by: Jordan Rhee Reviewed-by: Przemek Kitszel Signed-off-by: Joshua Washington Signed-off-by: Harshitha Ramamurthy --- drivers/net/ethernet/google/gve/gve.h | 4 +++ drivers/net/ethernet/google/gve/gve_adminq.c | 36 ++++++++++++++++++++ drivers/net/ethernet/google/gve/gve_adminq.h | 2 ++ drivers/net/ethernet/google/gve/gve_main.c | 32 +++++------------ 4 files changed, 51 insertions(+), 23 deletions(-) diff --git a/drivers/net/ethernet/google/gve/gve.h b/drivers/net/ethernet/g= oogle/gve/gve.h index 6c46c842070b..016e85ed91a5 100644 --- a/drivers/net/ethernet/google/gve/gve.h +++ b/drivers/net/ethernet/google/gve/gve.h @@ -837,6 +837,8 @@ struct gve_device_info { * @request_db_info: Request and store doorbell information into @priv * @release_db_resources: Release device hold on DMA memory holding doorbe= ll * info (AdminQ only) + * @setup_mgmt_irq: Setup control plane IRQ + * @teardown_mgmt_irq: Teardown control plane IRQ * @get_ptype_map: Learn packet type map from device and store it in @priv * @configure_rss: Set up default RSS configuration * @setup_stats_report: Set up DMA region for stats report (AdminQ only) @@ -849,6 +851,8 @@ struct gve_ctrl_ops { int (*set_num_ntfy_blks)(struct gve_priv *priv); int (*request_db_info)(struct gve_priv *priv); void (*release_db_resources)(struct gve_priv *priv); + int (*setup_mgmt_irq)(struct gve_priv *priv); + void (*teardown_mgmt_irq)(struct gve_priv *priv); int (*get_ptype_map)(struct gve_priv *priv); int (*configure_rss)(struct gve_priv *priv, struct ethtool_rxfh_param *param); diff --git a/drivers/net/ethernet/google/gve/gve_adminq.c b/drivers/net/eth= ernet/google/gve/gve_adminq.c index b89825a85db8..c3c10d5062f5 100644 --- a/drivers/net/ethernet/google/gve/gve_adminq.c +++ b/drivers/net/ethernet/google/gve/gve_adminq.c @@ -1755,3 +1755,39 @@ void gve_adminq_release_db_resources(struct gve_priv= *priv) "Could not deconfigure device resources: err=3D%d\n", err); } + +static irqreturn_t gve_mgmnt_intr(int irq, void *arg) +{ + struct gve_priv *priv =3D arg; + + /* Device resources are not okay; consider the interrupt spurious. */ + if (!gve_get_device_resources_ok(priv)) + return IRQ_NONE; + + queue_work(priv->gve_wq, &priv->service_task); + return IRQ_HANDLED; +} + +int gve_adminq_setup_mgmt_irq(struct gve_priv *priv) +{ + int err; + + snprintf(priv->mgmt_msix_name, sizeof(priv->mgmt_msix_name), + "gve-mgmnt@pci:%s", pci_name(priv->pdev)); + err =3D request_irq(priv->msix_vectors[priv->mgmt_msix_idx].vector, + gve_mgmnt_intr, 0, priv->mgmt_msix_name, priv); + if (err) + return err; + + priv->mgmt_irq_requested =3D true; + + return 0; +} + +void gve_adminq_teardown_mgmt_irq(struct gve_priv *priv) +{ + if (priv->mgmt_irq_requested) { + free_irq(priv->msix_vectors[priv->mgmt_msix_idx].vector, priv); + priv->mgmt_irq_requested =3D false; + } +} diff --git a/drivers/net/ethernet/google/gve/gve_adminq.h b/drivers/net/eth= ernet/google/gve/gve_adminq.h index 52172bf228eb..0b48e9f2a82a 100644 --- a/drivers/net/ethernet/google/gve/gve_adminq.h +++ b/drivers/net/ethernet/google/gve/gve_adminq.h @@ -659,4 +659,6 @@ int gve_adminq_map_db_bar(struct gve_priv *priv); void gve_adminq_unmap_db_bar(struct gve_priv *priv); int gve_adminq_request_db_info(struct gve_priv *priv); void gve_adminq_release_db_resources(struct gve_priv *priv); +int gve_adminq_setup_mgmt_irq(struct gve_priv *priv); +void gve_adminq_teardown_mgmt_irq(struct gve_priv *priv); #endif /* _GVE_ADMINQ_H */ diff --git a/drivers/net/ethernet/google/gve/gve_main.c b/drivers/net/ether= net/google/gve/gve_main.c index a160d36f718b..8522a495b78a 100644 --- a/drivers/net/ethernet/google/gve/gve_main.c +++ b/drivers/net/ethernet/google/gve/gve_main.c @@ -290,18 +290,6 @@ static void gve_free_stats_report(struct gve_priv *pri= v) priv->stats_report =3D NULL; } =20 -static irqreturn_t gve_mgmnt_intr(int irq, void *arg) -{ - struct gve_priv *priv =3D arg; - - /* Device resources are not okay; consider the interrupt spurious. */ - if (!gve_get_device_resources_ok(priv)) - return IRQ_NONE; - - queue_work(priv->gve_wq, &priv->service_task); - return IRQ_HANDLED; -} - static irqreturn_t gve_intr(int irq, void *arg) { struct gve_notify_block *block =3D arg; @@ -526,6 +514,7 @@ static int gve_alloc_notify_blocks(struct gve_priv *pri= v) =20 static void gve_teardown_notify_blocks(struct gve_priv *priv) { + const struct gve_ctrl_ops *ops =3D priv->ctrl_ops; int i; =20 if (!priv->ntfy_blocks) @@ -545,29 +534,24 @@ static void gve_teardown_notify_blocks(struct gve_pri= v *priv) block->irq_requested =3D false; } =20 - if (priv->mgmt_irq_requested) { - free_irq(priv->msix_vectors[priv->mgmt_msix_idx].vector, priv); - priv->mgmt_irq_requested =3D false; - } + ops->teardown_mgmt_irq(priv); } =20 static int gve_setup_notify_blocks(struct gve_priv *priv) { + const struct gve_ctrl_ops *ops =3D priv->ctrl_ops; const struct cpumask *node_mask; unsigned int cur_cpu; int i; int err; =20 - /* Setup Management Vector - the last vector */ - snprintf(priv->mgmt_msix_name, sizeof(priv->mgmt_msix_name), - "gve-mgmnt@pci:%s", pci_name(priv->pdev)); - err =3D request_irq(priv->msix_vectors[priv->mgmt_msix_idx].vector, - gve_mgmnt_intr, 0, priv->mgmt_msix_name, priv); + /* Setup Management Vector */ + err =3D ops->setup_mgmt_irq(priv); if (err) { - dev_err(&priv->pdev->dev, "Did not receive management vector.\n"); + dev_err(&priv->pdev->dev, + "Did not receive management vector.\n"); return err; } - priv->mgmt_irq_requested =3D true; =20 node_mask =3D gve_get_node_mask(priv); cur_cpu =3D cpumask_first(node_mask); @@ -2500,6 +2484,8 @@ static const struct gve_ctrl_ops gve_adminq_ops =3D { .configure_rss =3D gve_adminq_configure_rss, .request_db_info =3D gve_adminq_request_db_info, .release_db_resources =3D gve_adminq_release_db_resources, + .setup_mgmt_irq =3D gve_adminq_setup_mgmt_irq, + .teardown_mgmt_irq =3D gve_adminq_teardown_mgmt_irq, }; =20 static int gve_init_priv(struct gve_priv *priv) --=20 2.55.0.979.g7e5102b832-goog From nobody Sat Sep 26 06:20:32 2026 Received: from mail-pg1-f198.google.com (mail-pg1-f198.google.com [209.85.215.198]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C130E4A0151 for ; Thu, 3 Sep 2026 21:56:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.198 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788472581; cv=none; b=QJPoOvqxaT8XSCQNnWYFeafqaGYpWDRKrMeM2J3arXRIrR5DEgcM3amUFxjniuWczRLoopY8BLdiErkfAAqtznKOvp+F6VcY2IkqtJzBoZGswP9d2+ullZ5kD8NidqcO6q6846+RCrZVWDiIcCHWnQmDzL2ZiUD5ynYKdzPobaA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788472581; c=relaxed/simple; bh=FgLK4Z4AqDdC0I2cUaqZJ9zpPwW9fT4cf6uPi7C/WbY=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=odVzWklOIUZqLBG55BLU8xoeQ3jKPkA1gDgRi3sKXyuMDxLxhMZenu2ihWUOLYGNwpOOqC4YBoO/Lpfb2KkuHzQXKSDaTbOA0tfbBa01wm9gJE4S5bICcTRBQa/0uMgGmmJyGL/aeFILfoVmAWwXA1Nw1nmhYeanon0iIBCCDMI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--hramamurthy.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=PBxd72w8; arc=none smtp.client-ip=209.85.215.198 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--hramamurthy.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="PBxd72w8" Received: by mail-pg1-f198.google.com with SMTP id 41be03b00d2f7-c85798977dcso588929a12.0 for ; Thu, 03 Sep 2026 14:56:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1788472578; x=1789077378; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=0YHyrfJCyjjprDDY0e8imykrhTAbA+kiqccNMhlpEfY=; b=PBxd72w88cQMmzi406kaZtrFijPqPD9xmqDOPca89ITKF/ZZUncihoRYYzcSEh47M0 dfFTG9tTRo+WwIdFz35CPyFAbwNE0mXfAjMEm6TBU8m5xbN2ZXMduuZmH+Xw73KA/sDS bw0kYXIO8xTHaXCSfFK5wEh1FmmBrtvDqPsZ9lkYBwbu9ZR6FaQ34wBpGNuB/WgxSQBL okcFKrA5hbpOl1l/dwR20N0MY7Yq8c1B8avypIYOWyNHqXGY5nMt5fEQvvYWA9AMPXlT 74RsWbNRIoPc2nfc38+rTw/NmSSwm4hn6kDPyORNuomy26ywMJuBIFZ+oOz3ey4QAwBQ lRtQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788472578; x=1789077378; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=0YHyrfJCyjjprDDY0e8imykrhTAbA+kiqccNMhlpEfY=; b=frfeDlsJnCn9KYBAryGoeuOD4ISeBNtcbCJWmv1OPfKOKtazE/DisiTmAE/YWNtvNG BlXlXz10jyX5hjx8pI4FwRrD72Eqvlwl+1uOtbeWxWaIsai7Rkf8GmliNaZSLrK7m+3I sUFWsrj0+C26kxfHs2oF+Ziv5FkHkw6y9wOk1mv2dK3plmQMzOWfuukVLx0I3AZsD4jB 8LtN+wAJnXcwn2r30Fy9zJX1mtGdhTDqR14ZD3tE/OqIkSHw601p+J94VhwjhcUTAchU n7XgbvcBMbjerp7evDJH/eQQmcGvPc4hBKqxcAVo8+cW2VULo7vUNM431sgx1lmkI4gx FZrA== X-Forwarded-Encrypted: i=1; AKwUvBy3Bsyc9VeM2F/NZyIEC4RDVsXrSQF530pqWt5IuHK9oWlhYADkMaFqooNK0yx3Hp9x+c4NEHJkdCYsXVs=@vger.kernel.org X-Gm-Message-State: AFuF++k00cIx4G14k4RmOWM4wDk5rYuMkwqcdtbhSQYMeGCUa39u7Q49 z7+RnTZyFYm28a5NgYxHoLPexXtf7lNQCu3+OhUI+QYKd0P/qz4l5IiDWDxgmiYUPyR7R1C3JVk KJzyi3zfMYNcgkuiLQemUdc2PuQ== X-Received: from pgak18.prod.google.com ([2002:a05:6a02:6752:b0:cc4:33fd:a4f7]) (user=hramamurthy job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:3942:b0:3cd:a1e2:f238 with SMTP id adf61e73a8af0-3da39fd2f21mr2480303637.16.1788472577618; Thu, 03 Sep 2026 14:56:17 -0700 (PDT) Date: Thu, 3 Sep 2026 21:56:05 +0000 In-Reply-To: <20260903215606.31633-1-hramamurthy@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260903215606.31633-1-hramamurthy@google.com> X-Mailer: git-send-email 2.55.0.979.g7e5102b832-goog Message-ID: <20260903215606.31633-12-hramamurthy@google.com> Subject: [PATCH net-next v5 11/12] gve: add ctrl ops to for queue operations From: Harshitha Ramamurthy To: netdev@vger.kernel.org Cc: joshwash@google.com, hramamurthy@google.com, andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, ast@kernel.org, daniel@iogearbox.net, hawk@kernel.org, john.fastabend@gmail.com, sdf@fomichev.me, jordanrhee@google.com, willemb@google.com, nktgrg@google.com, maolson@google.com, thostet@google.com, jacob.e.keller@intel.com, debarghyak@google.com, kees@kernel.org, bpf@vger.kernel.org, linux-kernel@vger.kernel.org, przemyslaw.kitszel@intel.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add the next few control ops to - create queues - destroy queues These changes are just moving existing code into ops, no functional change. Reviewed-by: Willem de Bruijn Reviewed-by: Jordan Rhee Reviewed-by: Przemek Kitszel Signed-off-by: Harshitha Ramamurthy --- v5: - remove double logging during queue creation/destruction on err also (Sash= iko) drivers/net/ethernet/google/gve/gve.h | 4 ++ drivers/net/ethernet/google/gve/gve_adminq.c | 50 ++++++++++++++++++++ drivers/net/ethernet/google/gve/gve_adminq.h | 2 + drivers/net/ethernet/google/gve/gve_dqo.h | 2 +- drivers/net/ethernet/google/gve/gve_main.c | 43 +++-------------- 5 files changed, 64 insertions(+), 37 deletions(-) diff --git a/drivers/net/ethernet/google/gve/gve.h b/drivers/net/ethernet/g= oogle/gve/gve.h index 016e85ed91a5..00966b6a730f 100644 --- a/drivers/net/ethernet/google/gve/gve.h +++ b/drivers/net/ethernet/google/gve/gve.h @@ -843,6 +843,8 @@ struct gve_device_info { * @configure_rss: Set up default RSS configuration * @setup_stats_report: Set up DMA region for stats report (AdminQ only) * @reset_flow_rules: Flush all flow rules from device + * @create_queues: Sends commands to the device to create TX/RX queues. + * @destroy_queues: Sends commands to the device to destroy TX/RX queues. */ struct gve_ctrl_ops { int (*map_db_bar)(struct gve_priv *priv); @@ -861,6 +863,8 @@ struct gve_ctrl_ops { dma_addr_t stats_report_addr, u64 interval_ms); /* AQ-specific */ int (*reset_flow_rules)(struct gve_priv *priv); + int (*create_queues)(struct gve_priv *priv); + int (*destroy_queues)(struct gve_priv *priv); }; =20 struct gve_priv { diff --git a/drivers/net/ethernet/google/gve/gve_adminq.c b/drivers/net/eth= ernet/google/gve/gve_adminq.c index c3c10d5062f5..9a0a94ebdcd8 100644 --- a/drivers/net/ethernet/google/gve/gve_adminq.c +++ b/drivers/net/ethernet/google/gve/gve_adminq.c @@ -943,6 +943,30 @@ static void gve_set_default_rss_sizes(struct gve_priv = *priv) } } =20 +int gve_adminq_destroy_queues(struct gve_priv *priv) +{ + int num_tx_queues =3D gve_num_tx_queues(priv); + int err; + + err =3D gve_adminq_destroy_tx_queues(priv, 0, num_tx_queues); + if (err) { + netif_err(priv, drv, priv->dev, + "failed to destroy tx queues\n"); + /* This failure will trigger a reset - no need to clean up */ + return err; + } + netif_dbg(priv, drv, priv->dev, "destroyed tx queues\n"); + err =3D gve_adminq_destroy_rx_queues(priv, priv->rx_cfg.num_queues); + if (err) { + netif_err(priv, drv, priv->dev, + "failed to destroy rx queues\n"); + /* This failure will trigger a reset - no need to clean up */ + return err; + } + netif_dbg(priv, drv, priv->dev, "destroyed rx queues\n"); + return err; +} + static void gve_enable_supported_features(struct gve_priv *priv, u32 supported_features_mask, const struct gve_device_option_jumbo_frames @@ -1791,3 +1815,29 @@ void gve_adminq_teardown_mgmt_irq(struct gve_priv *p= riv) priv->mgmt_irq_requested =3D false; } } + +int gve_adminq_create_queues(struct gve_priv *priv) +{ + int num_tx_queues =3D gve_num_tx_queues(priv); + int err; + + err =3D gve_adminq_create_tx_queues(priv, 0, num_tx_queues); + if (err) { + netif_err(priv, drv, priv->dev, "failed to create %d tx queues\n", + num_tx_queues); + return err; + } + netif_dbg(priv, drv, priv->dev, "created %d tx queues\n", + num_tx_queues); + + err =3D gve_adminq_create_rx_queues(priv, priv->rx_cfg.num_queues); + if (err) { + netif_err(priv, drv, priv->dev, "failed to create %d rx queues\n", + priv->rx_cfg.num_queues); + return err; + } + netif_dbg(priv, drv, priv->dev, "created %d rx queues\n", + priv->rx_cfg.num_queues); + + return err; +} diff --git a/drivers/net/ethernet/google/gve/gve_adminq.h b/drivers/net/eth= ernet/google/gve/gve_adminq.h index 0b48e9f2a82a..d696e4932a8b 100644 --- a/drivers/net/ethernet/google/gve/gve_adminq.h +++ b/drivers/net/ethernet/google/gve/gve_adminq.h @@ -628,6 +628,8 @@ int gve_adminq_configure_device_resources(struct gve_pr= iv *priv, dma_addr_t db_array_bus_addr, u32 num_ntfy_blks); int gve_adminq_deconfigure_device_resources(struct gve_priv *priv); +int gve_adminq_create_queues(struct gve_priv *priv); +int gve_adminq_destroy_queues(struct gve_priv *priv); int gve_adminq_create_tx_queues(struct gve_priv *priv, u32 start_id, u32 n= um_queues); int gve_adminq_destroy_tx_queues(struct gve_priv *priv, u32 start_id, u32 = num_queues); int gve_adminq_create_single_rx_queue(struct gve_priv *priv, u32 queue_ind= ex); diff --git a/drivers/net/ethernet/google/gve/gve_dqo.h b/drivers/net/ethern= et/google/gve/gve_dqo.h index 5871f773f0c7..ce402020dff6 100644 --- a/drivers/net/ethernet/google/gve/gve_dqo.h +++ b/drivers/net/ethernet/google/gve/gve_dqo.h @@ -66,7 +66,7 @@ void gve_rx_write_doorbell_dqo(const struct gve_priv *pri= v, int queue_idx); void gve_xdp_tx_flush_dqo(struct gve_priv *priv, u32 xdp_qid); =20 static inline void -gve_tx_put_doorbell_dqo(const struct gve_priv *priv, +gve_tx_put_doorbell_dqo(struct gve_priv *priv, const struct gve_queue_resources *q_resources, u32 val) { u64 index; diff --git a/drivers/net/ethernet/google/gve/gve_main.c b/drivers/net/ether= net/google/gve/gve_main.c index 8522a495b78a..f09df9ca36fe 100644 --- a/drivers/net/ethernet/google/gve/gve_main.c +++ b/drivers/net/ethernet/google/gve/gve_main.c @@ -873,33 +873,16 @@ static int gve_unregister_qpls(struct gve_priv *priv) =20 static int gve_create_rings(struct gve_priv *priv) { - int num_tx_queues =3D gve_num_tx_queues(priv); int err; int i; =20 - err =3D gve_adminq_create_tx_queues(priv, 0, num_tx_queues); + err =3D priv->ctrl_ops->create_queues(priv); if (err) { - netif_err(priv, drv, priv->dev, "failed to create %d tx queues\n", - num_tx_queues); /* This failure will trigger a reset - no need to clean * up */ return err; } - netif_dbg(priv, drv, priv->dev, "created %d tx queues\n", - num_tx_queues); - - err =3D gve_adminq_create_rx_queues(priv, priv->rx_cfg.num_queues); - if (err) { - netif_err(priv, drv, priv->dev, "failed to create %d rx queues\n", - priv->rx_cfg.num_queues); - /* This failure will trigger a reset - no need to clean - * up - */ - return err; - } - netif_dbg(priv, drv, priv->dev, "created %d rx queues\n", - priv->rx_cfg.num_queues); =20 if (gve_is_gqi(priv)) { /* Rx data ring has been prefilled with packet buffers at queue @@ -1054,26 +1037,12 @@ static int gve_queues_mem_alloc(struct gve_priv *pr= iv, =20 static int gve_destroy_rings(struct gve_priv *priv) { - int num_tx_queues =3D gve_num_tx_queues(priv); int err; =20 - err =3D gve_adminq_destroy_tx_queues(priv, 0, num_tx_queues); - if (err) { - netif_err(priv, drv, priv->dev, - "failed to destroy tx queues\n"); - /* This failure will trigger a reset - no need to clean up */ - return err; - } - netif_dbg(priv, drv, priv->dev, "destroyed tx queues\n"); - err =3D gve_adminq_destroy_rx_queues(priv, priv->rx_cfg.num_queues); - if (err) { - netif_err(priv, drv, priv->dev, - "failed to destroy rx queues\n"); - /* This failure will trigger a reset - no need to clean up */ - return err; - } - netif_dbg(priv, drv, priv->dev, "destroyed rx queues\n"); - return 0; + err =3D priv->ctrl_ops->destroy_queues(priv); + + /* A failure will trigger a reset - no need to clean up */ + return err; } =20 static void gve_queues_mem_free(struct gve_priv *priv, @@ -2486,6 +2455,8 @@ static const struct gve_ctrl_ops gve_adminq_ops =3D { .release_db_resources =3D gve_adminq_release_db_resources, .setup_mgmt_irq =3D gve_adminq_setup_mgmt_irq, .teardown_mgmt_irq =3D gve_adminq_teardown_mgmt_irq, + .create_queues =3D gve_adminq_create_queues, + .destroy_queues =3D gve_adminq_destroy_queues, }; =20 static int gve_init_priv(struct gve_priv *priv) --=20 2.55.0.979.g7e5102b832-goog From nobody Sat Sep 26 06:20:32 2026 Received: from mail-pl1-f197.google.com (mail-pl1-f197.google.com [209.85.214.197]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9F4CF443E3F for ; Thu, 3 Sep 2026 21:56:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.197 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788472582; cv=none; b=iNQXfHrNRF4P5ugiVt8YItu/uDw5RV89HgI+IzPiYVeYHexdS5E51VKdemoRYCT/Ipd6kCQW/BQ6cLXmMHj3Fhuo4dh7htM9dAwynwYeWXQL1rCIkC0BQuuGks/1Uev6o9I+eSFD6pIhTOYVBwbTKAmIoi1a1nr5eE6sEgjTEM0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788472582; c=relaxed/simple; bh=O5Q9pWWByEk220xL0ok2C7lge+eGDW85Z+nzWLYH9p8=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=VYzC7VUhHtLkIigqlUz9GA0ziAi5OJ4zmvEc+qlOg31kEP9Jnw/6EklkA8PYCqe9DNYDQr5tSJbCa1POZYWzoiyIQs6JGjtSaAOkQzNuJEgwk/6SzgBMXibKZwFalC8sXFIq9O+SpWUpPTCP7nNyqm485ZWjF2DApDauREpjKaA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--hramamurthy.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=V8gWj5Jy; arc=none smtp.client-ip=209.85.214.197 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--hramamurthy.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="V8gWj5Jy" Received: by mail-pl1-f197.google.com with SMTP id d9443c01a7336-2ce7dfd33ffso4163895ad.0 for ; Thu, 03 Sep 2026 14:56:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1788472579; x=1789077379; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=BvQUrwieUiA5Xdna+a0l9yjFvKA0NlWxfhvUKr4MYT8=; b=V8gWj5JypjOYsRdtLUWUJoNQza7uXf9/BK4u58XaUekKR0AGnUVinYNdUEj6VAAMG0 zcEGJkgCHZ09hhM9mqOBx8T0H1kSwyjMcgKmRFbyy1wY2LWxtkpNRzSnRbQccDOZjDmV Zm3uJ07q4ikhtUJizMKOJeyeTGNi6UbtG7KHCQsL4xB0PhEWjMTD6Y8IQxOw1oXMvpif r2KjjBP1Ag2hUwDMcVRmvoqTqwuasGLgLY8T6Pr+PNZCpr/mFlPAqnvaOJUe/HVtVLqG ErcYFtA+7ZE9m1yZBEBC9+EDCQSRo6tuHK2jTasKV60PqDt5v7XMbMjDASaSiN1IlH4J 3xrg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788472579; x=1789077379; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=BvQUrwieUiA5Xdna+a0l9yjFvKA0NlWxfhvUKr4MYT8=; b=q//++cSb3VHmzo7M4kKNy5T3RLt5oxmF9xanAyYCUhcEq3zIdBLCQE4YpUXAINHiYO qeOhNlpbNocAiVJd51pnfdSdSgk7+UXidp79eSxcIJcFolYKYLRfb4YgZdbk3+DeO/tM oXTwtRZiAW3PBKCuRwYkuCqYNRLfaolZeFw/8XjXi+nSYhVjw/kvz6cllbkdeNTfVk3t QtfRSds1c3WH4avyQ7/0ld9tuv3jILqKje/dYDt0xkI+ZKcmIcY1vGa5VR92PHSuyIrE vTDG9crAfLGpmgiCnjzC0ZJaEi4xLDEct3QEKtwQ9ma2eroY89kbbGL/RTr3CjE0S4ty fjgA== X-Forwarded-Encrypted: i=1; AKwUvByDibB5nlniIZEnL9dvIbpUhUA9qZGoATdYV/aA4WtI7DRgQZ2YHPnXmMZcZ8IubF99msKSeCScs4ssLWY=@vger.kernel.org X-Gm-Message-State: AFuF++lTDerxo+nZn+mSk1I8T3bp9y+o2i1tbz6nq2SSxxhUJvZHyi5o wSLFMc95ZED+7nLzHSVQCTwPpjK6NkA4aoihrWSdEUApRk4vxPDEeiU2zh2TK3WYYtQ5H6BkjrA 6ecwC03GQJtke0GBHEv5X5xM7Og== X-Received: from plgv8.prod.google.com ([2002:a17:902:e8c8:b0:2ca:f1f8:ea00]) (user=hramamurthy job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:a981:b0:2d8:de9f:9a44 with SMTP id d9443c01a7336-2db12879178mr20249165ad.19.1788472578526; Thu, 03 Sep 2026 14:56:18 -0700 (PDT) Date: Thu, 3 Sep 2026 21:56:06 +0000 In-Reply-To: <20260903215606.31633-1-hramamurthy@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260903215606.31633-1-hramamurthy@google.com> X-Mailer: git-send-email 2.55.0.979.g7e5102b832-goog Message-ID: <20260903215606.31633-13-hramamurthy@google.com> Subject: [PATCH net-next v5 12/12] gve: add link status/speed ctrl ops From: Harshitha Ramamurthy To: netdev@vger.kernel.org Cc: joshwash@google.com, hramamurthy@google.com, andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, ast@kernel.org, daniel@iogearbox.net, hawk@kernel.org, john.fastabend@gmail.com, sdf@fomichev.me, jordanrhee@google.com, willemb@google.com, nktgrg@google.com, maolson@google.com, thostet@google.com, jacob.e.keller@intel.com, debarghyak@google.com, kees@kernel.org, bpf@vger.kernel.org, linux-kernel@vger.kernel.org, przemyslaw.kitszel@intel.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Joshua Washington Refactor link status check to use a control plane op. Introduce new op for retrieving the link status in AQ mode. This op reads the link status from the device status register and stores the value in priv. Also add an op for retrieving link speed in AQ mode which calls into gve_adminq_report_link_speed. Reviewed-by: Willem de Bruijn Reviewed-by: Jordan Rhee Reviewed-by: Przemek Kitszel Signed-off-by: Joshua Washington Signed-off-by: Harshitha Ramamurthy --- v3: - Fix kdoc typo ("set link status" -> "set link speed") - Copy link status into local variable instead of reading twice to prevent TOCTOU issue. drivers/net/ethernet/google/gve/gve.h | 5 ++++ drivers/net/ethernet/google/gve/gve_adminq.c | 10 +++++++ drivers/net/ethernet/google/gve/gve_adminq.h | 1 + drivers/net/ethernet/google/gve/gve_ethtool.c | 3 +-- drivers/net/ethernet/google/gve/gve_main.c | 26 ++++++++++++------- 5 files changed, 33 insertions(+), 12 deletions(-) diff --git a/drivers/net/ethernet/google/gve/gve.h b/drivers/net/ethernet/g= oogle/gve/gve.h index 00966b6a730f..b7ce6e8632db 100644 --- a/drivers/net/ethernet/google/gve/gve.h +++ b/drivers/net/ethernet/google/gve/gve.h @@ -845,6 +845,8 @@ struct gve_device_info { * @reset_flow_rules: Flush all flow rules from device * @create_queues: Sends commands to the device to create TX/RX queues. * @destroy_queues: Sends commands to the device to destroy TX/RX queues. + * @report_link_status: Set link status into @priv->link_up + * @report_link_speed: Set link speed into @priv->link_speed */ struct gve_ctrl_ops { int (*map_db_bar)(struct gve_priv *priv); @@ -865,6 +867,8 @@ struct gve_ctrl_ops { int (*reset_flow_rules)(struct gve_priv *priv); int (*create_queues)(struct gve_priv *priv); int (*destroy_queues)(struct gve_priv *priv); + int (*report_link_status)(struct gve_priv *priv); + int (*report_link_speed)(struct gve_priv *priv); }; =20 struct gve_priv { @@ -966,6 +970,7 @@ struct gve_priv { =20 /* Gvnic device link speed from hypervisor. */ u64 link_speed; + bool link_up; bool up_before_suspend; /* True if dev was up before suspend */ =20 bool mgmt_irq_requested; diff --git a/drivers/net/ethernet/google/gve/gve_adminq.c b/drivers/net/eth= ernet/google/gve/gve_adminq.c index 9a0a94ebdcd8..ed64f298e80d 100644 --- a/drivers/net/ethernet/google/gve/gve_adminq.c +++ b/drivers/net/ethernet/google/gve/gve_adminq.c @@ -1841,3 +1841,13 @@ int gve_adminq_create_queues(struct gve_priv *priv) =20 return err; } + +int gve_adminq_report_link_status(struct gve_priv *priv) +{ + u32 status; + + status =3D ioread32be(&priv->reg_bar0->device_status); + WRITE_ONCE(priv->link_up, + !!(GVE_DEVICE_STATUS_LINK_STATUS_MASK & status)); + return 0; +} diff --git a/drivers/net/ethernet/google/gve/gve_adminq.h b/drivers/net/eth= ernet/google/gve/gve_adminq.h index d696e4932a8b..8daac5fd685a 100644 --- a/drivers/net/ethernet/google/gve/gve_adminq.h +++ b/drivers/net/ethernet/google/gve/gve_adminq.h @@ -643,6 +643,7 @@ 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); int gve_adminq_get_device_properties(struct gve_priv *priv); +int gve_adminq_report_link_status(struct gve_priv *priv); int gve_adminq_report_link_speed(struct gve_priv *priv); int gve_adminq_add_flow_rule(struct gve_priv *priv, struct gve_adminq_flow= _rule *rule, u32 loc); int gve_adminq_del_flow_rule(struct gve_priv *priv, u32 loc); diff --git a/drivers/net/ethernet/google/gve/gve_ethtool.c b/drivers/net/et= hernet/google/gve/gve_ethtool.c index dd1c44fedc77..a3220c651438 100644 --- a/drivers/net/ethernet/google/gve/gve_ethtool.c +++ b/drivers/net/ethernet/google/gve/gve_ethtool.c @@ -749,12 +749,11 @@ static int gve_get_link_ksettings(struct net_device *= netdev, int err =3D 0; =20 if (priv->link_speed =3D=3D 0) - err =3D gve_adminq_report_link_speed(priv); + err =3D priv->ctrl_ops->report_link_speed(priv); =20 cmd->base.speed =3D priv->link_speed; =20 cmd->base.duplex =3D DUPLEX_FULL; - return err; } =20 diff --git a/drivers/net/ethernet/google/gve/gve_main.c b/drivers/net/ether= net/google/gve/gve_main.c index f09df9ca36fe..9af9eef64382 100644 --- a/drivers/net/ethernet/google/gve/gve_main.c +++ b/drivers/net/ethernet/google/gve/gve_main.c @@ -1501,15 +1501,18 @@ static int gve_close(struct net_device *dev) return err; } =20 -static void gve_handle_link_status(struct gve_priv *priv, bool link_status) +static void gve_handle_link_status(struct gve_priv *priv) { + bool link_up; + if (!gve_get_napi_enabled(priv)) return; =20 - if (link_status =3D=3D netif_carrier_ok(priv->dev)) + link_up =3D READ_ONCE(priv->link_up); + if (link_up =3D=3D netif_carrier_ok(priv->dev)) return; =20 - if (link_status) { + if (link_up) { netdev_info(priv->dev, "Device link is up.\n"); netif_carrier_on(priv->dev); } else { @@ -1536,7 +1539,6 @@ static int gve_set_xdp(struct gve_priv *priv, struct = bpf_prog *prog, { struct bpf_prog *old_prog; int err =3D 0; - u32 status; =20 old_prog =3D READ_ONCE(priv->xdp_prog); if (!netif_running(priv->dev)) { @@ -1563,8 +1565,8 @@ static int gve_set_xdp(struct gve_priv *priv, struct = bpf_prog *prog, bpf_prog_put(old_prog); =20 out: - status =3D ioread32be(&priv->reg_bar0->device_status); - gve_handle_link_status(priv, GVE_DEVICE_STATUS_LINK_STATUS_MASK & status); + priv->ctrl_ops->report_link_status(priv); + gve_handle_link_status(priv); return err; } =20 @@ -1997,11 +1999,11 @@ static void gve_turnup(struct gve_priv *priv) =20 static void gve_turnup_and_check_status(struct gve_priv *priv) { - u32 status; + const struct gve_ctrl_ops *ops =3D priv->ctrl_ops; =20 gve_turnup(priv); - status =3D ioread32be(&priv->reg_bar0->device_status); - gve_handle_link_status(priv, GVE_DEVICE_STATUS_LINK_STATUS_MASK & status); + ops->report_link_status(priv); + gve_handle_link_status(priv); } =20 static struct gve_notify_block *gve_get_tx_notify_block(struct gve_priv *p= riv, @@ -2325,12 +2327,14 @@ static void gve_service_task(struct work_struct *wo= rk) { struct gve_priv *priv =3D container_of(work, struct gve_priv, service_task); + const struct gve_ctrl_ops *ops =3D priv->ctrl_ops; u32 status =3D ioread32be(&priv->reg_bar0->device_status); =20 gve_handle_status(priv, status); =20 gve_handle_reset(priv); - gve_handle_link_status(priv, GVE_DEVICE_STATUS_LINK_STATUS_MASK & status); + ops->report_link_status(priv); + gve_handle_link_status(priv); } =20 static void gve_set_netdev_xdp_features(struct gve_priv *priv) @@ -2457,6 +2461,8 @@ static const struct gve_ctrl_ops gve_adminq_ops =3D { .teardown_mgmt_irq =3D gve_adminq_teardown_mgmt_irq, .create_queues =3D gve_adminq_create_queues, .destroy_queues =3D gve_adminq_destroy_queues, + .report_link_status =3D gve_adminq_report_link_status, + .report_link_speed =3D gve_adminq_report_link_speed, }; =20 static int gve_init_priv(struct gve_priv *priv) --=20 2.55.0.979.g7e5102b832-goog