From nobody Mon Jun 8 05:25:29 2026 Received: from mail-pf1-f201.google.com (mail-pf1-f201.google.com [209.85.210.201]) (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 E7AAC306752 for ; Mon, 1 Jun 2026 17:54:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780336482; cv=none; b=W2JmBThxb6H6OK8FdCJbd+BKUQnuNTq6P9Fm0BGspJWO4JA16dtcLeeQbtB8c4uE1Tw/JuFcKa2oDzmT9ziiWqDfKY+maQKWxIKmsy1QiCLmoDYqB6W524At86C92dcDkqFZhy1j7cSEj61z/7wF+quYUYQ6xZKa3+71k7KPJ2w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780336482; c=relaxed/simple; bh=QuWfugOytXeO0b1wxF7bijlHGp2GMNN8F233BLpEMgg=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=S6JYzGDZ+x/J017km7eU9BWc4kEDkb4pIMXgpGc+iqBpy6tQFPGrY4zEvIVqpU+m0HThEUgBA9V3yRnTHK0hGMXK1dMcYwkpmNBmNAAHihDVDNZ9n1C6Ibst4QobBi9bTbITCm9toYyQYpDM9rCUOloxc0JeTv/ej5qHUdOdJ0c= 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=P8F6f95b; arc=none smtp.client-ip=209.85.210.201 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="P8F6f95b" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-84237a15547so1377955b3a.3 for ; Mon, 01 Jun 2026 10:54:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1780336480; x=1780941280; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=tWseiq4uumqZ00yU9HO4tB0QQ4Oyj0zXYc8zVlVyTfE=; b=P8F6f95b7KJdDMz7iffRimJstrr4lBRbF2McyRW3+7yQm+Mw9wmr3sjKng7fZmPFPi M6sZBZgLzhhq6r3STjl3BABjdjIMn/VCfyqIgQUsI5QZu1peGEPbpNuZmIiNsSG/XmuI +ROl6RPEQE70Hv3vHt/cyMZHk/eSrh0+Ik37q0Ff2M4gFrc37eMqjQeaYLycGflpG/6B aOqhXQGZMjMKv8fyKMFNCbMqt1j2nEMiM5fBq8XvPXY64qZwEfIlKcEDTd1ZN17OlZyT HmYHbSn+9WgZ5dlRxFvxjR3xSClbMnLx9ttTDxP33TQ1gmJ7lMRR4XzlQZ4qNkQFynBH CaXw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780336480; x=1780941280; h=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; bh=tWseiq4uumqZ00yU9HO4tB0QQ4Oyj0zXYc8zVlVyTfE=; b=Ceg7IwnJeVHuSvTuL4Ct6nc/w0+WPO6dO9Z3lGrpMXrI5sKBxdSm47zYvpWhxsqw9j SkXGgGhERVDV08qCvXbDAf50ZSrW3t5bZfZ4j73NquSPIxyn8QybhvL8wJct3f+inoEz 3Ud51XcI2ub8LIHcpiSUQAxON/N68WJi57sBL/E5G3Lu4WS/KZKHgwbzxj77V/55dS0Y mtoea4shECZ7b12aXkGVj4Uhy5BRccwInTZBKdO0DLiwWetXnifcXB6Aw/ZDtIjUN5yb wuPmZmJKtEHJnUDwbnVdiy50zf4875Z3WYvd00af69nD9rsjxaJupBP2yQykvuErZ+xL p+dQ== X-Forwarded-Encrypted: i=1; AFNElJ8dWM1SK9hWDfk/ngflAWCiLOMcc3lPv8DigJ4JRMwihbaoo7A67NwJaNg501v29I4pDYAuLL7+90ttiN8=@vger.kernel.org X-Gm-Message-State: AOJu0YxHQ1S+1fz6M+HN1U3+Zp5TyF0V22Jg3eOUMFA3jN09uJ5UZ04F 3f9LT+efSmleQPKcV7zf1NIPdDzvvy/greywokw6sapOT8DjvyPkXggZPsraDxCFTUPO6FsB953 Cq5ykjoACIE0FyHk3KRd7dgrcZg== X-Received: from pfbfs2.prod.google.com ([2002:a05:6a00:8182:b0:82f:6e26:770b]) (user=hramamurthy job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:1a90:b0:842:5719:455b with SMTP id d2e1a72fcca58-84257194b05mr4280757b3a.42.1780336480081; Mon, 01 Jun 2026 10:54:40 -0700 (PDT) Date: Mon, 1 Jun 2026 17:54:23 +0000 In-Reply-To: <20260601175437.3767283-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: <20260601175437.3767283-1-hramamurthy@google.com> X-Mailer: git-send-email 2.54.0.1013.g208068f2d8-goog Message-ID: <20260601175437.3767283-2-hramamurthy@google.com> Subject: [PATCH net-next 01/15] gve: don't pass in unused parameter to gve_adminq_free 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, willemb@google.com, jordanrhee@google.com, jfraker@google.com, nktgrg@google.com, bpf@vger.kernel.org, linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Clean up gve_adminq_free to not take in an unused parameter. Reviewed-by: Willem de Bruijn Reviewed-by: Jordan Rhee Signed-off-by: Harshitha Ramamurthy --- drivers/net/ethernet/google/gve/gve_adminq.c | 2 +- drivers/net/ethernet/google/gve/gve_adminq.h | 2 +- drivers/net/ethernet/google/gve/gve_main.c | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/net/ethernet/google/gve/gve_adminq.c b/drivers/net/eth= ernet/google/gve/gve_adminq.c index 0d5a67523cba..d8d47a0c19b4 100644 --- a/drivers/net/ethernet/google/gve/gve_adminq.c +++ b/drivers/net/ethernet/google/gve/gve_adminq.c @@ -385,7 +385,7 @@ void gve_adminq_release(struct gve_priv *priv) gve_clear_admin_queue_ok(priv); } =20 -void gve_adminq_free(struct device *dev, struct gve_priv *priv) +void gve_adminq_free(struct gve_priv *priv) { if (!gve_get_admin_queue_ok(priv)) return; diff --git a/drivers/net/ethernet/google/gve/gve_adminq.h b/drivers/net/eth= ernet/google/gve/gve_adminq.h index e6dcf6da9091..9fbea0cc6513 100644 --- a/drivers/net/ethernet/google/gve/gve_adminq.h +++ b/drivers/net/ethernet/google/gve/gve_adminq.h @@ -620,7 +620,7 @@ union gve_adminq_command { static_assert(sizeof(union gve_adminq_command) =3D=3D 64); =20 int gve_adminq_alloc(struct device *dev, struct gve_priv *priv); -void gve_adminq_free(struct device *dev, 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, diff --git a/drivers/net/ethernet/google/gve/gve_main.c b/drivers/net/ether= net/google/gve/gve_main.c index e4d78ae52daf..30bf6df4ebc5 100644 --- a/drivers/net/ethernet/google/gve/gve_main.c +++ b/drivers/net/ethernet/google/gve/gve_main.c @@ -2506,14 +2506,14 @@ static int gve_init_priv(struct gve_priv *priv, boo= l skip_describe_device) bitmap_free(priv->xsk_pools); priv->xsk_pools =3D NULL; err: - gve_adminq_free(&priv->pdev->dev, priv); + gve_adminq_free(priv); return err; } =20 static void gve_teardown_priv_resources(struct gve_priv *priv) { gve_teardown_device_resources(priv); - gve_adminq_free(&priv->pdev->dev, priv); + gve_adminq_free(priv); bitmap_free(priv->xsk_pools); priv->xsk_pools =3D NULL; } --=20 2.54.0.669.g59709faab0-goog From nobody Mon Jun 8 05:25:29 2026 Received: from mail-pg1-f201.google.com (mail-pg1-f201.google.com [209.85.215.201]) (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 D7E6E3AEB39 for ; Mon, 1 Jun 2026 17:54:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780336483; cv=none; b=i3yG87Caa3zori5sqIJEwVs6VHn/4t5Dtc+F/tRT4MkzBCld6iIe6tSlSumSLW/yZrrQFXAeLsWqGS3CbWA29g18S4SY/1dsfbOluiIwAhMWaiAHoDtX/34NiWippyzklv50VBYcTlV5S225guDkzpn8m3NBMPAsbO2WyY/rG0Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780336483; c=relaxed/simple; bh=eQf9Z2+gvvZJpHRahhH/7VApHRBp1Qthj+l+tQIKWUE=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=NL2Tps3SCpTlITPreL6Ri90lhx2htwr67edCW2fjAP31yRzYV6nNi70Er4/XiYsUScgSvCR6fU5PeF5HUMpC1btjRysC8KbGVAo/IwlA01OkNK3Y82qeiqNlR9pPOJHW2UI4vNOuu6VI3miCbpdBAYzLFNUZOAqYuerQuFfsBag= 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=luAGXxCh; arc=none smtp.client-ip=209.85.215.201 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="luAGXxCh" Received: by mail-pg1-f201.google.com with SMTP id 41be03b00d2f7-c8584e80bfcso1534757a12.3 for ; Mon, 01 Jun 2026 10:54:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1780336481; x=1780941281; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=2gOYcjuJLEF0yTyJYYDBD/FirVLlUoDpnNHInCa8H2U=; b=luAGXxCh8HRjWamtgG8mjcljawVfDzFrjCeBmU4OdxcK5lURS93OS5Y+e3aV1HsBr9 ZnlTyxe9PS5FS07IO22mKyxAi2hzHF5DgtrC+r8qNlVsiMWr7f37dXsnuL5PCPPS084I m2sfbtRefnMwdun/EkRxJU57oCNdF/U7m7DeSnFqPB3xTaA585fIbOEHPZvXLvg7Now0 Kv5Twotpx8XYPORE3bFu8WnCyxHHuDz9B57ZACc/lJ+9WQaHNyECJV2uF5xOKz9tUzuk gYjo8Za2g1fkphyK9XeVFy9EPwXwNS2cSCQe4VkK0yU5n1Rmu0UVA57XHKIDAliPAP7i HejA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780336481; x=1780941281; h=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; bh=2gOYcjuJLEF0yTyJYYDBD/FirVLlUoDpnNHInCa8H2U=; b=mefnTpxpeBYVwF9J/yCJ0CDAViLImYoYfddyuXK9cmWhQPB/gGiMryVdL3nwiiE4er 420dWGVg2r4G3slLGk/I2au/zndrxUvqoRdtFxjfbMQJ+VYsuf7IPH/esHA4byRJGCp1 lSgvfebvWZeFJ1rp8kSM6MYHcl64Fc5cPXz4yRf42QRy+ao0hfrtQpSOzOZsY0DgfUF1 j0CSpJFmjQsDw0s0NiWzTIlPhYxWSYvXmqgX2nFexHsyybC3W8RZHH94N9YyTq+nEGoM FsRjnyvvaWR0RNNzGXSI4JqrsL1W73ZTZCSwYJQk7cPyZvoPfhA2uHxZwEMdIJCt1gTy sAqA== X-Forwarded-Encrypted: i=1; AFNElJ8xIoVHTxOqEj3BiZmLTtSz5LV5GgCGCIdq7s0PVAnaIm5/N9bhWhej6g8nD+JFYYDI5Wt9JXMmkHwonoA=@vger.kernel.org X-Gm-Message-State: AOJu0Yysg7H/BA9gGXGuqkbPEqArLH+dGyNS1T1nVsIGxCIdNdUsFzYB 5oK8szVE9UsK77xe5VpquEAFhzjUoq9XzrtS2HbTPcL8xkxwZPaoa28+IyaAco0KPlKS6L33d4Y A7fv40vFhT/2uTsmcgr2IuFEB/w== X-Received: from pgbfp14.prod.google.com ([2002:a05:6a02:2cee:b0:c7b:fdce:6626]) (user=hramamurthy job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:ce44:b0:39b:fbb2:5e46 with SMTP id adf61e73a8af0-3b427fbf046mr12596515637.40.1780336480936; Mon, 01 Jun 2026 10:54:40 -0700 (PDT) Date: Mon, 1 Jun 2026 17:54:24 +0000 In-Reply-To: <20260601175437.3767283-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: <20260601175437.3767283-1-hramamurthy@google.com> X-Mailer: git-send-email 2.54.0.1013.g208068f2d8-goog Message-ID: <20260601175437.3767283-3-hramamurthy@google.com> Subject: [PATCH net-next 02/15] gve: refactor initialization with helper functions 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, willemb@google.com, jordanrhee@google.com, jfraker@google.com, nktgrg@google.com, bpf@vger.kernel.org, linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" In the interest of commonizing code, refactor gve_probe() and gve_init_priv() with a few helper functions that can be expanded and utilized in upcoming patches that add the mailbox ABI to the driver. The helper functions are: - gve_set_num_ntfy_blks() - gve_set_num_queues() Reorder code to combine lines that accomplish a similar objective like setting defaults. Move setting HW-GRO and UDP GSO support out of an Adminq method into gve_init_priv(). These changes are just code movement, no functional change. Reviewed-by: Willem de Bruijn Reviewed-by: Jordan Rhee Signed-off-by: Harshitha Ramamurthy --- drivers/net/ethernet/google/gve/gve_adminq.c | 8 -- drivers/net/ethernet/google/gve/gve_main.c | 108 +++++++++++-------- 2 files changed, 65 insertions(+), 51 deletions(-) diff --git a/drivers/net/ethernet/google/gve/gve_adminq.c b/drivers/net/eth= ernet/google/gve/gve_adminq.c index d8d47a0c19b4..f3227bb58ced 100644 --- a/drivers/net/ethernet/google/gve/gve_adminq.c +++ b/drivers/net/ethernet/google/gve/gve_adminq.c @@ -1142,14 +1142,6 @@ int gve_adminq_describe_device(struct gve_priv *priv) =20 gve_set_default_rss_sizes(priv); =20 - /* DQO supports HW-GRO and UDP_GSO */ - if (gve_is_dqo(priv)) { - u64 additional_features =3D NETIF_F_GRO_HW | NETIF_F_GSO_UDP_L4; - - priv->dev->hw_features |=3D additional_features; - priv->dev->features |=3D additional_features; - } - priv->max_registered_pages =3D be64_to_cpu(descriptor->max_registered_pages); mtu =3D be16_to_cpu(descriptor->mtu); diff --git a/drivers/net/ethernet/google/gve/gve_main.c b/drivers/net/ether= net/google/gve/gve_main.c index 30bf6df4ebc5..b9542ef36b29 100644 --- a/drivers/net/ethernet/google/gve/gve_main.c +++ b/drivers/net/ethernet/google/gve/gve_main.c @@ -2398,65 +2398,32 @@ static const struct xdp_metadata_ops gve_xdp_metada= ta_ops =3D { .xmo_rx_timestamp =3D gve_xdp_rx_timestamp, }; =20 -static int gve_init_priv(struct gve_priv *priv, bool skip_describe_device) +static int gve_set_num_ntfy_blks(struct gve_priv *priv) { int num_ntfy; - int err; - - /* 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_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; =20 - priv->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->dev->mtu =3D priv->dev->max_mtu; num_ntfy =3D pci_msix_vec_count(priv->pdev); if (num_ntfy <=3D 0) { dev_err(&priv->pdev->dev, "could not count MSI-x vectors: err=3D%d\n", num_ntfy); - err =3D num_ntfy; - goto err; + return num_ntfy; } else if (num_ntfy < GVE_MIN_MSIX) { dev_err(&priv->pdev->dev, "gve needs at least %d MSI-x vectors, but only= has %d\n", GVE_MIN_MSIX, num_ntfy); - err =3D -EINVAL; - goto err; + return -EINVAL; } =20 - /* Big TCP is only supported on DQO */ - if (!gve_is_gqi(priv)) - netif_set_tso_max_size(priv->dev, GVE_DQO_TX_MAX); - - priv->rx_copybreak =3D GVE_DEFAULT_RX_COPYBREAK; /* gvnic has one Notification Block per MSI-x vector, except for the * management vector */ priv->num_ntfy_blks =3D (num_ntfy - 1) & ~0x1; priv->mgmt_msix_idx =3D priv->num_ntfy_blks; - priv->numa_node =3D dev_to_node(&priv->pdev->dev); =20 + return 0; +} + +static void gve_set_num_queues(struct gve_priv *priv) +{ 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 @@ -2470,18 +2437,73 @@ static int gve_init_priv(struct gve_priv *priv, boo= l skip_describe_device) priv->rx_cfg.num_queues =3D min_t(int, priv->default_num_queues, priv->rx_cfg.num_queues); } - priv->tx_cfg.num_xdp_queues =3D 0; =20 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", priv->tx_cfg.max_queues, priv->rx_cfg.max_queues); +} + +static int gve_init_priv(struct gve_priv *priv, bool skip_describe_device) +{ + int err; + + /* 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; + } + + priv->num_registered_pages =3D 0; + + if (skip_describe_device) + goto setup_device; + + err =3D gve_verify_driver_compatibility(priv); + if (err) { + dev_err(&priv->pdev->dev, + "Could not verify driver compatibility: err=3D%d\n", err); + goto err; + } + + /* Get the initial information we need from the device */ + priv->queue_format =3D GVE_QUEUE_FORMAT_UNSPECIFIED; + 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; + } + + err =3D gve_set_num_ntfy_blks(priv); + if (err) { + dev_err(&priv->pdev->dev, + "Could not setup notify blocks: err=3D%d\n", err); + goto err; + } + + gve_set_num_queues(priv); + + if (gve_is_dqo(priv)) { + /* DQO supports HW-GRO and UDP_GSO */ + u64 additional_features =3D NETIF_F_GRO_HW | NETIF_F_GSO_UDP_L4; + + priv->dev->hw_features |=3D additional_features; + priv->dev->features |=3D additional_features; =20 - if (!gve_is_gqi(priv)) { priv->tx_coalesce_usecs =3D GVE_TX_IRQ_RATELIMIT_US_DQO; priv->rx_coalesce_usecs =3D GVE_RX_IRQ_RATELIMIT_US_DQO; + + /* Big TCP is only supported on DQO */ + netif_set_tso_max_size(priv->dev, GVE_DQO_TX_MAX); } =20 + priv->dev->mtu =3D priv->dev->max_mtu; + 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; =20 --=20 2.54.0.669.g59709faab0-goog From nobody Mon Jun 8 05:25:29 2026 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (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 07EC63E173A for ; Mon, 1 Jun 2026 17:54:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780336485; cv=none; b=YqEXfqzSxNddl3FS0BwYMmrD5lYU5hq+ALmTLH7HpJV4hhW8a6seMY6gZoComs3q4yJcYi/5nQZr5qpKKrboN/MIhfUpG8EoZdYXxpDRaYCzj0rq5zEncWypUp2hdewUR7ZpuveX8FG5aCpkCaxWRy7zBQ3ZTSQ9E25v3Tt7fvw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780336485; c=relaxed/simple; bh=MMXn7HOatTczl0yaHRUfk66HG8PysyTJ0l21uX9SqIs=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=dw1RkChqQP2bF49m+/wtcHPyVhSPvN/wpIqDpfbBt9QxC57JgmpvL0s/ivmqOA85MK/Zil1Du9XL5uTRVrYqbc9+HKuw9hZvLN5/MoQRHCJZ2aSGoDbwdVrY9YdgSwyU8YCJS4uSvkqE4i27Kkyiu3SJsQ4DpJYCuUKbd9jx0qU= 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=YOc7hRTC; arc=none smtp.client-ip=209.85.214.202 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="YOc7hRTC" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-2c0b1bb53a8so16546055ad.0 for ; Mon, 01 Jun 2026 10:54:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1780336482; x=1780941282; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=qcsqMCDpgCiw+DfwG/Pw07YsUOQT5uec12wzo19RF7s=; b=YOc7hRTCV2fKrC0DGk2pf7uksc/PGkZ9afnJuuHLPPFmdBp//3JZiFSxuXcRLPYSve BOCc/pbjRJwe/tl6eAGmkflNm/GONnAe4nmq9+CZune7Tw/mkXzSMH5lRL21kppUWCrf SmFI5AnZuumH2fAmIkefyZITz+IusceYgjXyYbGJ74+/VCE5jFvv1n3K0qvFOTVuXNAp nK0xUL6uh2WxX3lZcrf37mrsNutDOkygj6cj+3M+lGF+GK87i3EDNamcZwkEJR1T5vQn Xt41UpXsbG/PotVA5F1GLm0P9PL8fvkPH/knITonWQtFc8Jr1a05u6oCueJdQi6ygRLF 7ODA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780336482; x=1780941282; h=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; bh=qcsqMCDpgCiw+DfwG/Pw07YsUOQT5uec12wzo19RF7s=; b=htz8oF4nK6TE5AoYaM4gWyo6d6nA1UK0qZOP+CIH+e+/eQsOwFz2plP1GgKyqfuroL sE7LlZMyzmd2GsOFfg5QlnqMhBtUoq/M4S45EvZyrCretgiPs68id8JCBYuGLYAH3xV7 2awxXDYeCy0il0bTqLQPr3SrgoCmVD+qzLJ3LZ4lMLDkWlfGUHAq5PUhg6w1FHSNUrh7 9YzliLWFPJXf/A7l7wB8njCp3NsIjTG6h61ctSM2Yfvhwxk8BgVzbZYxCh7zH/Xh30U3 yiYIdNP8YhIOH7eMcnWBfABcxQ8V6dD/lyD7S/VwqSwEBk5v7o7RtXY1ag48wQ5UYloS F0IA== X-Forwarded-Encrypted: i=1; AFNElJ+NRebd6s30PwqZQGMJhDbhDiwuQdwxFvxYcN6BdupCAI/J/qXdvdnRQ/gBPKBpbKg/AEtRWE/8cWRif6s=@vger.kernel.org X-Gm-Message-State: AOJu0YyI3vqfvNfRW1CeUJ+xe1rxJ66xHHGOuAAz6uxLgwu3hDg7bWgf mSCG0pMexBY5SVfD3G5NRZmCYQDCAUG2Ly4c+eL/zNaZGPEji8LWuJryEbep8xn69tpK2CUfnsZ SIWlANbGhVV6cjA6G4iRqYEMjLg== X-Received: from plbmn8.prod.google.com ([2002:a17:903:a48:b0:2b2:3dc8:b460]) (user=hramamurthy job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:2290:b0:2bf:2d0:8877 with SMTP id d9443c01a7336-2c10cced851mr3997585ad.23.1780336481764; Mon, 01 Jun 2026 10:54:41 -0700 (PDT) Date: Mon, 1 Jun 2026 17:54:25 +0000 In-Reply-To: <20260601175437.3767283-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: <20260601175437.3767283-1-hramamurthy@google.com> X-Mailer: git-send-email 2.54.0.1013.g208068f2d8-goog Message-ID: <20260601175437.3767283-4-hramamurthy@google.com> Subject: [PATCH net-next 03/15] 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, willemb@google.com, jordanrhee@google.com, jfraker@google.com, nktgrg@google.com, bpf@vger.kernel.org, linux-kernel@vger.kernel.org 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 Signed-off-by: Harshitha Ramamurthy --- drivers/net/ethernet/google/gve/gve.h | 2 + drivers/net/ethernet/google/gve/gve_adminq.c | 66 ++++++++++++++++++-- drivers/net/ethernet/google/gve/gve_adminq.h | 5 +- drivers/net/ethernet/google/gve/gve_main.c | 59 +---------------- 4 files changed, 66 insertions(+), 66 deletions(-) diff --git a/drivers/net/ethernet/google/gve/gve.h b/drivers/net/ethernet/g= oogle/gve/gve.h index 4de3ce60060e..0980e8ecbda2 100644 --- a/drivers/net/ethernet/google/gve/gve.h +++ b/drivers/net/ethernet/google/gve/gve.h @@ -15,6 +15,8 @@ #include #include #include +#include +#include #include #include =20 diff --git a/drivers/net/ethernet/google/gve/gve_adminq.c b/drivers/net/eth= ernet/google/gve/gve_adminq.c index f3227bb58ced..c102f707e284 100644 --- a/drivers/net/ethernet/google/gve/gve_adminq.c +++ b/drivers/net/ethernet/google/gve/gve_adminq.c @@ -1169,6 +1169,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) { @@ -1231,20 +1252,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 9fbea0cc6513..107c21b7b047 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 b9542ef36b29..eb2d768e5881 100644 --- a/drivers/net/ethernet/google/gve/gve_main.c +++ b/drivers/net/ethernet/google/gve/gve_main.c @@ -17,7 +17,6 @@ #include #include #include -#include #include #include #include @@ -41,49 +40,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) @@ -2461,21 +2417,10 @@ static int gve_init_priv(struct gve_priv *priv, boo= l skip_describe_device) if (skip_describe_device) goto setup_device; =20 - err =3D gve_verify_driver_compatibility(priv); - if (err) { - dev_err(&priv->pdev->dev, - "Could not verify driver compatibility: err=3D%d\n", err); - goto err; - } - - /* Get the initial information we need from the device */ priv->queue_format =3D GVE_QUEUE_FORMAT_UNSPECIFIED; - err =3D gve_adminq_describe_device(priv); - if (err) { - dev_err(&priv->pdev->dev, - "Could not get device information: err=3D%d\n", err); + err =3D gve_adminq_get_device_properties(priv); + if (err) goto err; - } =20 err =3D gve_set_num_ntfy_blks(priv); if (err) { --=20 2.54.0.669.g59709faab0-goog From nobody Mon Jun 8 05:25:29 2026 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (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 605713E1D01 for ; Mon, 1 Jun 2026 17:54:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780336485; cv=none; b=HNL3LGsgNWsIgIwvpuLLFWBt72jwbSRTx+PQ8fQg+C0bIoq8gycqzLcc/4HD1Ny1sev+4x37JiGzHl0uPpVaRpLwXAywYCU+Zx24g2V06Z2DniMa+z+rVqzCrYx/x2CvcwkQJLhpresU5MaOuXgZbHeRnZME611A4Pz/mpIGnKw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780336485; c=relaxed/simple; bh=NVn9LwPDnlsQON3swgwliR2ZNWfHvu5p5Ixmos9M6tk=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=AuH4UHDbpvnwqGhR6FS2tDXfdyMl8pU/JSVr3HGMgsUgKObwM9LLOU593twrPclweBUuNNYmcQ/WNbSZ8OMEZa2fqYWqSjxWZnPFCvTlXCzJ0vvi+sRzqbGjxJ4lYb/tMP/ESbmFai82uMMRlr27AksKObeSaRT7VU+r1gAzWdI= 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=tgn1iM4o; arc=none smtp.client-ip=209.85.214.202 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="tgn1iM4o" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-2bf0b7425bbso81128615ad.0 for ; Mon, 01 Jun 2026 10:54:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1780336483; x=1780941283; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=8gUNOhawh414/8060FOqpH+YpRhOk1KgnFcLIhcQnxw=; b=tgn1iM4oJsKFAvOB3iNYxQhphmfcWEfQC8hxlrkbZzAa3qr3z7tsUATqZbGR+ChrDU vqXZO3n6XWvxjG1RjQUC1wM9tEEfrX6dJcU4HbzL2gtA6vGkqtiPomL/8dyFa74j9Nvd DXGunYOgJg5UuT2X0IoYzrdOSQbmPbcAWP7S1KWJTLqIPPIcXArU1AeqphUIf085X778 5bBpy50Y0vSlfcfPsxwSYUpCNx/KPrq9GQubkfNoyLi2rDyrS8ttVMVjPX/mPPCyYANE 4MiWKgY0e/jPJzwPclM5zPY7YXvF61/8cUVyxE6aQzsNjl8HvRlqeHHW4CVcKBfDgFwO ZUMw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780336483; x=1780941283; h=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; bh=8gUNOhawh414/8060FOqpH+YpRhOk1KgnFcLIhcQnxw=; b=qp0DmgTVYAaAnIoC8h9RulvWKaKjrkCYrHENbCAUyS8kLWvO8a06t8omFUaKlV5EC2 itKHRp58HgUVAT5TYHnRavIHGjBpqnQO9N8IpADuj0ekWL/NET4jAWMokLlOidaCy2aL muEKb/ynxeRlGBd20QUZGhWBfZflDFKX7OaosyV1RCModCnGXcsGAwQjBia4aaLw0llh oGazOUmAqO3R6OyJe9hDiy9m0rOgv1r5Fv0iParKTsZaB6WNJEB3sCmV9oMzjlVo/WAP MES9m9HornUP7LxOIgWvX1NsGtvJ0ukri5OloNgr4PYOAPGyg1S0ULXwZEaLnzLDxhWY bftQ== X-Forwarded-Encrypted: i=1; AFNElJ++eRu4eDRFkQYk33V+8oIAOeR41RaST3WqhIcS+t4D/2Tdx7bixoCGraKNstn/d23TbQhSQIQz/dJvHNQ=@vger.kernel.org X-Gm-Message-State: AOJu0YxLXcvewFWszXdWWNxdyliLdInHlN6sh5jZnELW9sTH2OUOBzrt q0lJvTw4te/T3QJ/O74YpD3IrewtEoa+uOpANKqoCKGVLrJvQs4oWCeVWSdgqDouGw72EyK2bhZ /rX7seztkJq6CXULuztJvoVOthQ== X-Received: from pllh10.prod.google.com ([2002:a17:902:748a:b0:2be:ff74:e5e5]) (user=hramamurthy job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:2389:b0:2b4:656b:aeb0 with SMTP id d9443c01a7336-2bf3685af15mr148148335ad.35.1780336482581; Mon, 01 Jun 2026 10:54:42 -0700 (PDT) Date: Mon, 1 Jun 2026 17:54:26 +0000 In-Reply-To: <20260601175437.3767283-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: <20260601175437.3767283-1-hramamurthy@google.com> X-Mailer: git-send-email 2.54.0.1013.g208068f2d8-goog Message-ID: <20260601175437.3767283-5-hramamurthy@google.com> Subject: [PATCH net-next 04/15] gve: add a few helper functions to set 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, willemb@google.com, jordanrhee@google.com, jfraker@google.com, nktgrg@google.com, bpf@vger.kernel.org, linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" For the mailbox ABI, device properties will come from a different source compared to the AdminQ mode. To accommodate the new source when the mailbox ABI is added, add a few helper functions to set a few device properties. Those functions are: - gve_set_queue_properties() to set no. of pages for QPL mode and number of queues in general - gve_set_mtu() - gve_set_mac() This is just code movement, no functional change. Reviewed-by: Willem de Bruijn Reviewed-by: Jordan Rhee Signed-off-by: Harshitha Ramamurthy --- drivers/net/ethernet/google/gve/gve_adminq.c | 38 +++------------- drivers/net/ethernet/google/gve/gve_adminq.h | 6 +++ drivers/net/ethernet/google/gve/gve_main.c | 46 ++++++++++++++++++++ 3 files changed, 59 insertions(+), 31 deletions(-) diff --git a/drivers/net/ethernet/google/gve/gve_adminq.c b/drivers/net/eth= ernet/google/gve/gve_adminq.c index c102f707e284..ac546a245ef3 100644 --- a/drivers/net/ethernet/google/gve/gve_adminq.c +++ b/drivers/net/ethernet/google/gve/gve_adminq.c @@ -945,19 +945,6 @@ int gve_adminq_destroy_rx_queues(struct gve_priv *priv= , u32 num_queues) return err; } =20 -static void gve_set_default_desc_cnt(struct gve_priv *priv, - const struct gve_device_descriptor *descriptor) -{ - priv->tx_desc_cnt =3D be16_to_cpu(descriptor->tx_queue_entries); - priv->rx_desc_cnt =3D be16_to_cpu(descriptor->rx_queue_entries); - - /* 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; -} - static void gve_set_default_rss_sizes(struct gve_priv *priv) { if (!gve_is_gqi(priv)) { @@ -1074,8 +1061,6 @@ int gve_adminq_describe_device(struct gve_priv *priv) union gve_adminq_command cmd; dma_addr_t descriptor_bus; int err =3D 0; - u8 *mac; - u16 mtu; =20 memset(&cmd, 0, sizeof(cmd)); descriptor =3D dma_pool_alloc(priv->adminq_pool, GFP_KERNEL, @@ -1137,26 +1122,17 @@ int gve_adminq_describe_device(struct gve_priv *pri= v) "Driver is running with GQI QPL queue format.\n"); } =20 - /* set default descriptor counts */ - gve_set_default_desc_cnt(priv, descriptor); - gve_set_default_rss_sizes(priv); =20 - priv->max_registered_pages =3D - be64_to_cpu(descriptor->max_registered_pages); - mtu =3D be16_to_cpu(descriptor->mtu); - if (mtu < ETH_MIN_MTU) { - dev_err(&priv->pdev->dev, "MTU %d below minimum MTU\n", mtu); - err =3D -EINVAL; + err =3D gve_set_mtu(priv, descriptor); + if (err) goto free_device_descriptor; - } - priv->dev->max_mtu =3D mtu; + priv->num_event_counters =3D be16_to_cpu(descriptor->counters); - eth_hw_addr_set(priv->dev, descriptor->mac); - mac =3D descriptor->mac; - dev_info(&priv->pdev->dev, "MAC addr: %pM\n", mac); - 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_mac(priv, descriptor); + + gve_set_queue_properties(priv, descriptor); =20 gve_enable_supported_features(priv, supported_features_mask, dev_op_jumbo_frames, dev_op_dqo_qpl, diff --git a/drivers/net/ethernet/google/gve/gve_adminq.h b/drivers/net/eth= ernet/google/gve/gve_adminq.h index 107c21b7b047..53ac1a28b26a 100644 --- a/drivers/net/ethernet/google/gve/gve_adminq.h +++ b/drivers/net/ethernet/google/gve/gve_adminq.h @@ -655,5 +655,11 @@ 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); +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); =20 #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 eb2d768e5881..338dc0b3249a 100644 --- a/drivers/net/ethernet/google/gve/gve_main.c +++ b/drivers/net/ethernet/google/gve/gve_main.c @@ -2400,6 +2400,52 @@ static void gve_set_num_queues(struct gve_priv *priv) priv->tx_cfg.max_queues, priv->rx_cfg.max_queues); } =20 +static void gve_set_default_desc_cnt(struct gve_priv *priv, + const struct gve_device_descriptor *descriptor) +{ + priv->tx_desc_cnt =3D be16_to_cpu(descriptor->tx_queue_entries); + priv->rx_desc_cnt =3D be16_to_cpu(descriptor->rx_queue_entries); + + /* 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; +} + +void gve_set_queue_properties(struct gve_priv *priv, + struct gve_device_descriptor *descriptor) +{ + /* set default descriptor counts */ + gve_set_default_desc_cnt(priv, descriptor); + + 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); +} + +int gve_set_mtu(struct gve_priv *priv, + struct gve_device_descriptor *descriptor) +{ + u16 mtu; + + mtu =3D be16_to_cpu(descriptor->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; + + return 0; +} + +void gve_set_mac(struct gve_priv *priv, + struct gve_device_descriptor *descriptor) +{ + eth_hw_addr_set(priv->dev, descriptor->mac); + dev_info(&priv->pdev->dev, "MAC addr: %pM\n", descriptor->mac); +} + static int gve_init_priv(struct gve_priv *priv, bool skip_describe_device) { int err; --=20 2.54.0.669.g59709faab0-goog From nobody Mon Jun 8 05:25:29 2026 Received: from mail-pg1-f202.google.com (mail-pg1-f202.google.com [209.85.215.202]) (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 37A9B3E1D13 for ; Mon, 1 Jun 2026 17:54:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780336488; cv=none; b=THGys9549jI6zT6O3gWoHdiwURNIKbCwkcY3yMiGue/dqNFnLoq9fvZShg06HTDhkvE/rfeSFaM4JZH3EIXk4XG6OHTHc4NiWzN80ZytOxqwQvhGPQXzRdye88caruwo9hUhx610qUKy/DtWj6PdgUseQ19o209L6vPyZVEHkaI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780336488; c=relaxed/simple; bh=w/uzAKnSg6cnwFAUs9BrnewUhXO5qaj9rKUU8BFN9GI=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=k0uAk8z/UgM5+OcRVZ7Z8PhR75/H9AqgcPdMM8FBi2IE8Z5urnWGoZ4D7kDeox4AvchSUuYS1QILbcrUIvQ1wMg1TvbBX9BDm7eF8fzSNJ2TFp5aMZ+Tv3p5phOeqgtq99ZoBh7jqm0i9IIVb/Q9SN1vY0Gh6k8Cpbct59EVros= 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=IDff7X8e; arc=none smtp.client-ip=209.85.215.202 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="IDff7X8e" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-c850ff84ddfso14163759a12.2 for ; Mon, 01 Jun 2026 10:54:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1780336483; x=1780941283; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=W3DqHGKPZpmNHPfLjTc8twFZ82dmZzlsqBQR/1q/CGc=; b=IDff7X8eCj6dP5PesgifQbDThNZy9PZ8D3GRpODutPX68I90nl+ywKBT9zCMH//syh qAPj7OksbfnjGpcSFGic/IeL9O2UDKAE0n3UhZhnIjika9M3TS8iezndLmSsX6E3W9OG oDdIqOkRB9PFJWGVSXGvK7DPafvvU75Fw2LSySxAgNNbQElofoS/Hrl7OqpHI5SkiUXe jsAa+rPMhKAGWM2jpMRp3Pg7oJ3L2fBmapPjMWKp0MBaTjIqBkQqM+L/kftKTyCaFp/A 3Av5/YdP9KJwexdQ5c1KOAuRZTCfk3rTooOnLFaY6/yOiCrPR1q6P9k2vZT1yaWvClOq 0oPg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780336483; x=1780941283; h=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; bh=W3DqHGKPZpmNHPfLjTc8twFZ82dmZzlsqBQR/1q/CGc=; b=BXxdOSvlUd/M1Q6H0EVFvitq3eaDrDrF0Wg+PgkLo9QMqN0qZfM/MA2BEVATxEBLXb PdAM4Xsjz4l3rWJl9SNEPDR6oPb6JM238ncAgK51tvgTvOzhvCLOyIilO4ZGO7LgzM7/ aCl7kPwLo+3njOKcrO9XjysHKH9QwX21Sy3VYEbtvZsml+lJmbwMnRm9DzGQYeN2h7lB o3pvdIYDdk7NTdlvVC93shwabyy4zIY4zWVecK8kHi47nEs5c1l/wUg4pr+piz0onTeB RP+dWmdW2ggPoxNnTOsHe0OG3c79q8CQwbescJaNVl+JDcYeD/cWxtZ+u64dh2CEO0jn OXZw== X-Forwarded-Encrypted: i=1; AFNElJ/xhXZRtedWULbeMHvruaRAxIPw9pqIhBtL+tRwaY5EoPxE0NOoG7a1A28C8V0YF6qNhZ7ywUQCuwxVr9g=@vger.kernel.org X-Gm-Message-State: AOJu0Yyh2MeHme7jdbIeDF6Vovq8FlaiK9d4VdX8wVP2IdpbyFYCTUPJ 50cAvPxCCYXGD7OFAXOE/HzLMNDdk0Ct5S2klTU7ybl0Lxk7Qwlu15Bz9rSkEBx3Zsz4xtHpnId 8qilVseQL6cCagHCC2bpbC1NKDw== X-Received: from pgay5.prod.google.com ([2002:a05:6a02:4965:b0:c80:1fe6:ac57]) (user=hramamurthy job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:43ab:b0:39c:4e62:b838 with SMTP id adf61e73a8af0-3b427fd5b8amr15379926637.17.1780336483338; Mon, 01 Jun 2026 10:54:43 -0700 (PDT) Date: Mon, 1 Jun 2026 17:54:27 +0000 In-Reply-To: <20260601175437.3767283-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: <20260601175437.3767283-1-hramamurthy@google.com> X-Mailer: git-send-email 2.54.0.1013.g208068f2d8-goog Message-ID: <20260601175437.3767283-6-hramamurthy@google.com> Subject: [PATCH net-next 05/15] 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, willemb@google.com, jordanrhee@google.com, jfraker@google.com, nktgrg@google.com, bpf@vger.kernel.org, linux-kernel@vger.kernel.org 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 the functions it calls 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 Signed-off-by: Harshitha Ramamurthy --- drivers/net/ethernet/google/gve/gve.h | 29 +++++ drivers/net/ethernet/google/gve/gve_adminq.c | 113 +++++++++++-------- drivers/net/ethernet/google/gve/gve_adminq.h | 6 - drivers/net/ethernet/google/gve/gve_main.c | 101 ++++++++++++----- 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 0980e8ecbda2..e780492edee5 100644 --- a/drivers/net/ethernet/google/gve/gve.h +++ b/drivers/net/ethernet/google/gve/gve.h @@ -799,6 +799,34 @@ struct gve_ptp { dma_addr_t nic_ts_report_bus; }; =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 */ @@ -937,6 +965,7 @@ struct gve_priv { struct gve_ptp *ptp; struct kernel_hwtstamp_config ts_config; 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 ac546a245ef3..4235ef9f4a04 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) || @@ -947,10 +947,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 @@ -971,77 +974,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 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) @@ -1052,6 +1083,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; @@ -1095,26 +1127,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); @@ -1122,18 +1154,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, diff --git a/drivers/net/ethernet/google/gve/gve_adminq.h b/drivers/net/eth= ernet/google/gve/gve_adminq.h index 53ac1a28b26a..107c21b7b047 100644 --- a/drivers/net/ethernet/google/gve/gve_adminq.h +++ b/drivers/net/ethernet/google/gve/gve_adminq.h @@ -655,11 +655,5 @@ 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); -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); =20 #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 338dc0b3249a..1aeee916471f 100644 --- a/drivers/net/ethernet/google/gve/gve_main.c +++ b/drivers/net/ethernet/google/gve/gve_main.c @@ -2380,6 +2380,8 @@ static int gve_set_num_ntfy_blks(struct gve_priv *pri= v) =20 static 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 @@ -2387,12 +2389,14 @@ static void gve_set_num_queues(struct gve_priv *pri= v) =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); - } =20 dev_info(&priv->pdev->dev, "TX queues %d, RX queues %d\n", priv->tx_cfg.num_queues, priv->rx_cfg.num_queues); @@ -2400,54 +2404,69 @@ static void gve_set_num_queues(struct gve_priv *pri= v) priv->tx_cfg.max_queues, priv->rx_cfg.max_queues); } =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 priv->dev->max_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) { - eth_hw_addr_set(priv->dev, descriptor->mac); - dev_info(&priv->pdev->dev, "MAC addr: %pM\n", descriptor->mac); + struct gve_device_info *device_info =3D &priv->device_info; + + eth_hw_addr_set(priv->dev, device_info->mac); + dev_info(&priv->pdev->dev, "MAC addr: %pM\n", device_info->mac); +} + +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) + 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; } =20 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 */ @@ -2463,11 +2482,13 @@ static int gve_init_priv(struct gve_priv *priv, boo= l 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; err =3D gve_adminq_get_device_properties(priv); if (err) 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, @@ -2491,12 +2512,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.54.0.669.g59709faab0-goog From nobody Mon Jun 8 05:25:29 2026 Received: from mail-pl1-f201.google.com (mail-pl1-f201.google.com [209.85.214.201]) (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 0F02D3E1716 for ; Mon, 1 Jun 2026 17:54:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780336487; cv=none; b=ivgWJNYPHGELOrOeTVj8K7/VlyaflVlm2Cw1kOgc2gSZAC+iah/oLnuZzXPe8ScJzFYzDNaQUaCXzOhxUnaiRj5Jua+Q8wL65yC7si/sUbemjgufh7wz8PmeTZ6ajOw4ool45/oVBPqKmV2tFA2ITKtZnP7dBo4+v5/E+ImIXX4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780336487; c=relaxed/simple; bh=irnnGq41SRFMUpY7Cbm8xIGBudp5hRleIGnbca8DrP0=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=rurS50otuO33dQTxaUg26oN1CCOy4qy3sWYYbEVC6JNRuVLhtWw8QSxCIllNxsOOowGFl7ao4lTcydos7ac8kPOE5OUIKHzHIlA4Uo2BDVKyE/OAiSgb+9svQgLyUV+F7pJ1a7pHblmkEuA5xsdkgAi860J5XhiMGNYYjg/Wsqw= 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=d2uYNRei; arc=none smtp.client-ip=209.85.214.201 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="d2uYNRei" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-2c0c36f4b76so17031535ad.3 for ; Mon, 01 Jun 2026 10:54:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1780336484; x=1780941284; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=dxWPvhflFM9Ed7eSo0Zs6V3/7d1+n3E+IvSQjxR6PRk=; b=d2uYNReiChOMLGouXBe2cjnv0BumiuUTVXYk1S+kEYSzEOMBVPs83nQa3KVQ2b51Ft dkvvrm3x1CU4qFVDSZXu+mwZRDsMkTNiuJStr1DMsr9wM4JfK2gxyeaCSPdP7e7YDQuL 7s4iDTiYeae5hWC6LlVSATkDD31Fn2Qugv7ay4R2poRmM7PgLWKdI8bevmoHP0mKEnwI FXCTYZ2v2znce0lI4TChmHBTtyXCztGdCG0tPszSn6BVwymIV4khr3a5rDZPV/u4j0o+ vQoshueEmuOxmfmXFZtRLtRz0jaOcLakgQXvns4ii13DoBw09Z8zGnvypSKNxDWKTDnW 5ZYQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780336484; x=1780941284; h=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; bh=dxWPvhflFM9Ed7eSo0Zs6V3/7d1+n3E+IvSQjxR6PRk=; b=kL9uEKteSBE8hOaQLRvM4zc4gxvXPBf8sLuh9/f6QDrOuxs0xYjvNvEJlBAolkEb0P sdBM8EuspO8fs0Bt/FKl75gfzTFKn3Pb94d/QDsk47S9t/ujkhZch890SEXv0WUt7IlN WyZ57ZSnzqeAQgv+MO+BOURDI4MJdcUYrgb1Mf5/eUekax/aNCwgqOKWEjOdTSx79nyg 26PPrx6wfan6OMWyX4h5bcadjaIeCjjGdJ5v1eywfTRw9T1eaePw2mBHtrm2wK4m07/5 8MRjxXwlvEFD1dWJJRodhYG3YnrLd+7iNI+E/LpTJmxN0YHmfd/8Q1UfBClf0ae3Nb1O 8DkQ== X-Forwarded-Encrypted: i=1; AFNElJ/YQ72d//Ygk1FgVX6hSJyA6ljORNhpHuUb9itb5PeQeaZysOv+z9oPutyRrlmHjxqv2xM3I95yZDByATw=@vger.kernel.org X-Gm-Message-State: AOJu0YwobqRuF7UYQt62rBJSb2c0hUO5tNZjtuwWW4rBmyBJpaZF9W3F XRkZmrDw5gETAb7SdS4VssOjxrRzakhcgsyJW02GtN1fQ4Z+1V4TF92Hs7oZusIYQlxXry2JwUZ GMPr4U1UQXIVpdLCtX7jI7dvtWQ== X-Received: from plxj16.prod.google.com ([2002:a17:902:da90:b0:2bf:2cd5:1d4a]) (user=hramamurthy job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:f60c:b0:2c0:c14c:bf38 with SMTP id d9443c01a7336-2c0c14cc277mr85806675ad.24.1780336484095; Mon, 01 Jun 2026 10:54:44 -0700 (PDT) Date: Mon, 1 Jun 2026 17:54:28 +0000 In-Reply-To: <20260601175437.3767283-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: <20260601175437.3767283-1-hramamurthy@google.com> X-Mailer: git-send-email 2.54.0.1013.g208068f2d8-goog Message-ID: <20260601175437.3767283-7-hramamurthy@google.com> Subject: [PATCH net-next 06/15] 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, willemb@google.com, jordanrhee@google.com, jfraker@google.com, nktgrg@google.com, bpf@vger.kernel.org, linux-kernel@vger.kernel.org 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 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 e780492edee5..9c1d38467bf9 100644 --- a/drivers/net/ethernet/google/gve/gve.h +++ b/drivers/net/ethernet/google/gve/gve.h @@ -827,6 +827,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 */ @@ -966,6 +976,7 @@ struct gve_priv { struct kernel_hwtstamp_config ts_config; 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 4235ef9f4a04..c9ea1ffd22f8 100644 --- a/drivers/net/ethernet/google/gve/gve_adminq.c +++ b/drivers/net/ethernet/google/gve/gve_adminq.c @@ -1670,3 +1670,24 @@ int gve_adminq_query_rss_config(struct gve_priv *pri= v, struct ethtool_rxfh_param dma_pool_free(priv->adminq_pool, descriptor, descriptor_bus); return err; } + +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 107c21b7b047..85e5dbd1270c 100644 --- a/drivers/net/ethernet/google/gve/gve_adminq.h +++ b/drivers/net/ethernet/google/gve/gve_adminq.h @@ -655,5 +655,7 @@ 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_adminq_map_db_bar(struct gve_priv *priv); +void gve_adminq_unmap_db_bar(struct gve_priv *priv); =20 #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 1aeee916471f..51dd4f9b3022 100644 --- a/drivers/net/ethernet/google/gve/gve_main.c +++ b/drivers/net/ethernet/google/gve/gve_main.c @@ -2464,6 +2464,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; @@ -2850,7 +2855,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; @@ -2878,13 +2882,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); @@ -2894,7 +2891,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); @@ -2926,19 +2923,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); @@ -2968,12 +2973,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 @@ -2989,14 +2994,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.54.0.669.g59709faab0-goog From nobody Mon Jun 8 05:25:29 2026 Received: from mail-pj1-f73.google.com (mail-pj1-f73.google.com [209.85.216.73]) (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 D82943E3172 for ; Mon, 1 Jun 2026 17:54:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780336488; cv=none; b=nyUptpnk4xZnYHaM5gBjN0SlXTuD0BAc69BckcdufIbnWaS4GdCfvK+k3Ead7IaoWLGT1s2xP7EwpObvKkgPFnz+tyRwV5nYRdzB7mgZeNHlWpK3AFj/1zSbzE/mFrjS/7022LLUHVCKRIJqHZbCkw10ZGpDouKPBdg4sR88nzE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780336488; c=relaxed/simple; bh=WPIHFJgcVtGgXlghGogtvbRgfVoxegmW2H7v7PaydW4=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=lcTusMwAC7MYXolqcsvPkvWDqcGQ1xJ+4lxoYpN3YapsQdFXpT4oWDuZeT7M56RfJUTeAeLw2cDMRrqCQhU0xRvigRDW8W52HVOiiOcHtmN6QDYJC3NAhHYvEL7pLc8z85mxTOFri0ET/PQY7oEge4g3wh3Gv1OWnJjK7L+nFJA= 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=cbO6nx/s; arc=none smtp.client-ip=209.85.216.73 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="cbO6nx/s" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-36d99333358so1543223a91.3 for ; Mon, 01 Jun 2026 10:54:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1780336485; x=1780941285; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=DIViWg1T1aGVF2yYVGpgkPmWFa/trDD0tyf+jZFvz8A=; b=cbO6nx/sBqbP9+fACARkBq/yb2XtUo0AI5GalGjDzxulXb9BL0MVmFt8LPtYTBu0hE Oi99IAKXD1RRu+3DQF0s8T7OCM2DYHNoLE4rtELsWPdSpiFxWKsdhvaskzAW9Sy3fFFR ts2Qa3D5Q5Ksin+Eq17cGXUT5ItwP2kmMyDZVKcEwRUQCwdPsoJM9fAXfyqa6How9CYm jtJ5CnlkcUiMHJpDykVAZ9dRt6XNlFnRtuZp/OmjAnvfsizfL6Dq1KnX6yljL9jCSlsH 5uRlXJUYRq9yHy1tdWEqy1ql+AmFHkzMECRpgW6HHX4n7UnhEf9a/p5mkFABAB6/Sa5A 3sVw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780336485; x=1780941285; h=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; bh=DIViWg1T1aGVF2yYVGpgkPmWFa/trDD0tyf+jZFvz8A=; b=MPGTnyTWuisJKbtjZd3iAdihMup5ub1svFt4nOG1xw9eMOy/GmsqCByCoyX6yQhiGE ReVUtpr08hoveRL3Rk7I1GGY/6xcKHh50MEVRWpjpTSn7nZCFsPMVCEdPi1jskzCpvu+ HaHcNAvuFkPlY+KlhV0Yb4o2VRrf2trrwMzn04ivhFPAPmU7FvGEZW0KRhyTcAiKqG8J XrKC6SmHr9FXMkUEj3DwG8jzVtH7OrmCm/IzCg3VuRYAmHQqFEbDJ7lk8sEab+ZRmsfj ToYsWfqi7LAVbq+ACueqh4OEByQ61cLPFny6ERy84NE6aWsjczvvjLbmGRNS5HHGOIIO 4p8Q== X-Forwarded-Encrypted: i=1; AFNElJ83iPwqTSsybFnRtacxELArwoyuY10qrluv6AVtL6oPzW1pzVh6iwZdZqb3eX41Qn7Ge94YPg97dTBY8fo=@vger.kernel.org X-Gm-Message-State: AOJu0YzH7aFZYfVcc/rleBdNeERnU8CG4150Eg3oGAPt93vlFUnQDvRI Uj9sbId6DA0XTWHtdmVVL7+1ZRvUqy1JLwRTx64uooL9eC47AYfabyKFd76/l2FXZIpA6xS8FHl dRXsoPUzROMuoJ7NONt3dQReNiA== X-Received: from pgbda11.prod.google.com ([2002:a05:6a02:238b:b0:c85:b574:566b]) (user=hramamurthy job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:3dc8:b0:36d:cf58:b79 with SMTP id 98e67ed59e1d1-36dcf580f7fmr1928828a91.19.1780336484943; Mon, 01 Jun 2026 10:54:44 -0700 (PDT) Date: Mon, 1 Jun 2026 17:54:29 +0000 In-Reply-To: <20260601175437.3767283-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: <20260601175437.3767283-1-hramamurthy@google.com> X-Mailer: git-send-email 2.54.0.1013.g208068f2d8-goog Message-ID: <20260601175437.3767283-8-hramamurthy@google.com> Subject: [PATCH net-next 07/15] 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, willemb@google.com, jordanrhee@google.com, jfraker@google.com, nktgrg@google.com, bpf@vger.kernel.org, linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Introduce following ctrl ops for Adminq mode. This change does not introduce any functional change, just movement of code into ops. - 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. Reviewed-by: Willem de Bruijn Reviewed-by: Jordan Rhee Signed-off-by: Harshitha Ramamurthy --- drivers/net/ethernet/google/gve/gve.h | 6 ++ drivers/net/ethernet/google/gve/gve_adminq.c | 45 ++++++++++++++ drivers/net/ethernet/google/gve/gve_adminq.h | 2 + drivers/net/ethernet/google/gve/gve_main.c | 64 +++----------------- 4 files changed, 63 insertions(+), 54 deletions(-) diff --git a/drivers/net/ethernet/google/gve/gve.h b/drivers/net/ethernet/g= oogle/gve/gve.h index 9c1d38467bf9..a4a558df2019 100644 --- a/drivers/net/ethernet/google/gve/gve.h +++ b/drivers/net/ethernet/google/gve/gve.h @@ -831,10 +831,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 c9ea1ffd22f8..c6680b6ede8a 100644 --- a/drivers/net/ethernet/google/gve/gve_adminq.c +++ b/drivers/net/ethernet/google/gve/gve_adminq.c @@ -1691,3 +1691,48 @@ void gve_adminq_unmap_db_bar(struct gve_priv *priv) =20 pci_iounmap(pdev, priv->db_bar2); } + +int gve_adminq_set_num_ntfy_blks(struct gve_priv *priv) +{ + int num_ntfy; + + num_ntfy =3D pci_msix_vec_count(priv->pdev); + if (num_ntfy <=3D 0) { + dev_err(&priv->pdev->dev, + "could not count MSI-x vectors: err=3D%d\n", num_ntfy); + return num_ntfy; + } else if (num_ntfy < GVE_MIN_MSIX) { + dev_err(&priv->pdev->dev, "gve needs at least %d MSI-x vectors, but only= has %d\n", + GVE_MIN_MSIX, num_ntfy); + return -EINVAL; + } + + /* gvnic has one Notification Block per MSI-x vector, except for the + * management vector + */ + priv->num_ntfy_blks =3D (num_ntfy - 1) & ~0x1; + priv->mgmt_msix_idx =3D priv->num_ntfy_blks; + + return 0; +} + +void gve_adminq_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 + min_t(int, priv->rx_cfg.max_queues, priv->num_ntfy_blks / 2); + + priv->tx_cfg.num_queues =3D priv->tx_cfg.max_queues; + priv->rx_cfg.num_queues =3D priv->rx_cfg.max_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); + 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 85e5dbd1270c..8b6f81d03bc6 100644 --- a/drivers/net/ethernet/google/gve/gve_adminq.h +++ b/drivers/net/ethernet/google/gve/gve_adminq.h @@ -657,5 +657,7 @@ int gve_adminq_get_ptype_map_dqo(struct gve_priv *priv, struct gve_ptype_lut *ptype_lut); int gve_adminq_map_db_bar(struct gve_priv *priv); void gve_adminq_unmap_db_bar(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); =20 #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 51dd4f9b3022..d693caed7e3d 100644 --- a/drivers/net/ethernet/google/gve/gve_main.c +++ b/drivers/net/ethernet/google/gve/gve_main.c @@ -2354,56 +2354,6 @@ static const struct xdp_metadata_ops gve_xdp_metadat= a_ops =3D { .xmo_rx_timestamp =3D gve_xdp_rx_timestamp, }; =20 -static int gve_set_num_ntfy_blks(struct gve_priv *priv) -{ - int num_ntfy; - - num_ntfy =3D pci_msix_vec_count(priv->pdev); - if (num_ntfy <=3D 0) { - dev_err(&priv->pdev->dev, - "could not count MSI-x vectors: err=3D%d\n", num_ntfy); - return num_ntfy; - } else if (num_ntfy < GVE_MIN_MSIX) { - dev_err(&priv->pdev->dev, "gve needs at least %d MSI-x vectors, but only= has %d\n", - GVE_MIN_MSIX, num_ntfy); - return -EINVAL; - } - - /* gvnic has one Notification Block per MSI-x vector, except for the - * management vector - */ - priv->num_ntfy_blks =3D (num_ntfy - 1) & ~0x1; - priv->mgmt_msix_idx =3D priv->num_ntfy_blks; - - return 0; -} - -static 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 - min_t(int, priv->rx_cfg.max_queues, priv->num_ntfy_blks / 2); - - priv->tx_cfg.num_queues =3D priv->tx_cfg.max_queues; - priv->rx_cfg.num_queues =3D priv->rx_cfg.max_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); - 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); - - 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", - priv->tx_cfg.max_queues, priv->rx_cfg.max_queues); -} - static void gve_set_desc_cnt(struct gve_priv *priv) { struct gve_device_info *device_info =3D &priv->device_info; @@ -2465,8 +2415,10 @@ static void gve_set_buf_sizes(struct gve_priv *priv) } =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, + .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) @@ -2494,14 +2446,18 @@ 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", + priv->tx_cfg.max_queues, priv->rx_cfg.max_queues); =20 if (gve_is_dqo(priv)) { /* DQO supports HW-GRO and UDP_GSO */ --=20 2.54.0.669.g59709faab0-goog From nobody Mon Jun 8 05:25:29 2026 Received: from mail-pl1-f201.google.com (mail-pl1-f201.google.com [209.85.214.201]) (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 A52AD3E5572 for ; Mon, 1 Jun 2026 17:54:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780336488; cv=none; b=JSQ6ncTETsi6L09P96+W4u5ENWJBLjKkvxhAztRbjYg5s4zn4pEaqIxrjPAzaAO5nIb+ANPPbrBLmA9cpNae3tMz0AJ1kQkndWauBVDYAE0VwT4FBxig/wR7+w3n8wPEdue3ehjd0Youa4etNfSfjWarenLuALXC2Idl0YKZ5Ok= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780336488; c=relaxed/simple; bh=NfL5EjKadmgXi9WBAeEl0bKGtsFuGHo2xlT8U/k+vHk=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=MI1iZIwqx2lqfj1NKHXht540bk/FTPopGxMfPcf8QVU8Pf1kGUQ0Gv76dtIKg1Z8j3/LgL//BD6X4H4k3F7tQwI+ZbJZRRXbp2KF4RhPJxxXtbc1Zisa9J1dnnkbD8Lpaf41svIg6B2lC4ocvhiuHWbQcQxX/A1szniPSZlvLR4= 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=SWGYS/R9; arc=none smtp.client-ip=209.85.214.201 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="SWGYS/R9" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-2c0c1e08848so22368405ad.0 for ; Mon, 01 Jun 2026 10:54:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1780336486; x=1780941286; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=zxiYjJbFRM78mH7qFZmSWv7J6ghPpKMlXhhwOxQ8XIs=; b=SWGYS/R93Zz3lNdGY2z2VgqatQSkjMsbhgaJKtiqnQBs/nbGSXqn04rxidCp011EoY I9qk4Z0cVZYE3gjZPizg7WikdQTL+wGDDTfUjX4g/4d7VGxNaz1Hk3B7kSBIqlyyh4Qk e28hAm/ttvE5XgsFtcE3V0H5ZmlW0UQNPqkX8L6gcUySof3GozVPGR9iecPH1vuadG05 j7twglP/13vCrJ0NEAwA1S8vpu8ibkKzsmmjlvNqEpS+eq6b98J9NNJmMR25f6jED7/M fwxpwKfCcAhZcDRdyC/IKuHJlxvjLA64LjxACj9e3+9bPF88qvtNyZt51O0Ngo12nb19 ZgPA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780336486; x=1780941286; h=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; bh=zxiYjJbFRM78mH7qFZmSWv7J6ghPpKMlXhhwOxQ8XIs=; b=R7k5h+3EtjX/UC4UteegZnzbYP1clpyKLvha1lFXdj9m85K1s/p2vat475s9+4idBE UZYIA+K3Z77qy8mtOv3dMpRRtJ/DLh+sDb6ajHhFG7U8jzYNvDuZGduUYlwCf2Yc3+ht 7rCV6IzP+5W4jXVJqJ/eEMz/ynYCAmPMaEhc0PUZK0n58EzFUKAXwRAh8oSM0bRvIMa1 7VYlk7RePBPIxp7mlrw11GPsPtN1QtwsrDZ8rBj/a/qijTLjeMwN0AxYfzVJnLklHEP6 QAiQRjphzrG9bUj0tWiDxZnfl6MP1SqA2SjDb/HsBnW+gDrWt23oft0o2eP7d8hyklJQ eQRQ== X-Forwarded-Encrypted: i=1; AFNElJ8kKFq3oE1apAU2RuK0H7zzxA3J4i8+2uqgUH1niJ9ku+dsgQuJEXUP8sFbZ409T7fL0zOFylXZ7ASyF7g=@vger.kernel.org X-Gm-Message-State: AOJu0YypWWG7M/sS7KWpBicg4c9QaWu+8REpBWQiewEZZoweF7ugNgbs HLa/gfc2BOk0fb8ziJp0t2Jgz+Y7u/jcefboS3hHWmB1ShSWeaJ2oy/RiAhXPKCDrAlJFWVq0QZ stwUPbJpudk3i4zMm78phUHkx0w== X-Received: from plld15.prod.google.com ([2002:a17:902:728f:b0:2bf:21c4:c74]) (user=hramamurthy job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:c942:b0:2be:3434:4e28 with SMTP id d9443c01a7336-2bf3682a5f2mr138901485ad.19.1780336485783; Mon, 01 Jun 2026 10:54:45 -0700 (PDT) Date: Mon, 1 Jun 2026 17:54:30 +0000 In-Reply-To: <20260601175437.3767283-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: <20260601175437.3767283-1-hramamurthy@google.com> X-Mailer: git-send-email 2.54.0.1013.g208068f2d8-goog Message-ID: <20260601175437.3767283-9-hramamurthy@google.com> Subject: [PATCH net-next 08/15] 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, willemb@google.com, jordanrhee@google.com, jfraker@google.com, nktgrg@google.com, bpf@vger.kernel.org, linux-kernel@vger.kernel.org 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() - move gve_adminq_get_device_properties() into gve_probe() - 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_register_qpls() since that is a QPL specific property. With these changes, gve_adminq_get_device_properties() and gve_init_priv() are only called once during gve_probe. gve_reset_recovery() can now bypass full initialization and call these 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 Signed-off-by: Harshitha Ramamurthy --- 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 | 132 +++++++++++-------- 4 files changed, 92 insertions(+), 56 deletions(-) diff --git a/drivers/net/ethernet/google/gve/gve.h b/drivers/net/ethernet/g= oogle/gve/gve.h index a4a558df2019..bebdb38ef3bb 100644 --- a/drivers/net/ethernet/google/gve/gve.h +++ b/drivers/net/ethernet/google/gve/gve.h @@ -1261,6 +1261,8 @@ static inline bool gve_is_clock_enabled(struct gve_pr= iv *priv) return priv->ptp; } =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 c6680b6ede8a..3e450f174aae 100644 --- a/drivers/net/ethernet/google/gve/gve_adminq.c +++ b/drivers/net/ethernet/google/gve/gve_adminq.c @@ -296,8 +296,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)) @@ -353,6 +355,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 8b6f81d03bc6..efa4997a1cec 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 d693caed7e3d..746ff69a28dd 100644 --- a/drivers/net/ethernet/google/gve/gve_main.c +++ b/drivers/net/ethernet/google/gve/gve_main.c @@ -797,6 +797,8 @@ static int gve_register_qpls(struct gve_priv *priv) int err; int i; =20 + priv->num_registered_pages =3D 0; + num_tx_qpls =3D gve_num_tx_qpls(&priv->tx_cfg, gve_is_qpl(priv)); num_rx_qpls =3D gve_num_rx_qpls(&priv->rx_cfg, gve_is_qpl(priv)); =20 @@ -2414,6 +2416,33 @@ 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->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, @@ -2421,36 +2450,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; - } - - priv->num_registered_pages =3D 0; - - if (skip_describe_device) - goto setup_device; - - device_info->queue_format =3D GVE_QUEUE_FORMAT_UNSPECIFIED; - err =3D gve_adminq_get_device_properties(priv); - if (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); @@ -2473,10 +2484,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 @@ -2501,30 +2510,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) @@ -2554,15 +2540,29 @@ 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_setup_device(priv); + if (err) + goto err_free_adminq; if (was_up) { err =3D gve_open(priv->dev); if (err) - goto err; + goto err_free_device; } return 0; + +err_free_device: + gve_teardown_device_resources(priv); + bitmap_free(priv->xsk_pools); + priv->xsk_pools =3D NULL; +err_free_adminq: + gve_adminq_free(priv); err: dev_err(&priv->pdev->dev, "Reset failed! !!! DISABLING ALL QUEUES !!!\n"); gve_turndown(priv); @@ -2605,7 +2605,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 @@ -2838,7 +2838,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); @@ -2885,13 +2884,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); @@ -2906,10 +2920,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 @@ -2932,6 +2953,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.54.0.669.g59709faab0-goog From nobody Mon Jun 8 05:25:29 2026 Received: from mail-pf1-f202.google.com (mail-pf1-f202.google.com [209.85.210.202]) (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 9A46E3E5A35 for ; Mon, 1 Jun 2026 17:54:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780336492; cv=none; b=NRqtsAhDDbpGXoUsjy2fa1WCjkMjQVOPpPdSnqZZAcbbkS7aT5lW3FsL9fmY7bb0GRAshQY80KtpvDvHAM8C4Q8c0NvGrAqMAw+NTxzHOFyg67N464d8f91Rx0/AQk/qk9KfIuXsPMtzt1eAaQ8x03JNS0LSqIvuNQM75j7y/bg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780336492; c=relaxed/simple; bh=ATqgyjDFElJdBHpYVK7mOY0mtUPm3ws0D5+guz+bzBQ=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=FMkWfsmSUdLS/9e9eVtHPBMi67nPbqCfnWREbXL9dDBHOyo3MkYprpJF86xCFqgmY4Et1DGLQsWs1+bfH+nZu3peAXpcAoXcDFXRLhqX1k/AL6OZ6GMpcZGIqDL+FhCF4xnjogJsr2h2KAikWp/ctdxhwQ4OKXkEhi9SqsdWkSU= 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=K17xjKNF; arc=none smtp.client-ip=209.85.210.202 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="K17xjKNF" Received: by mail-pf1-f202.google.com with SMTP id d2e1a72fcca58-83f7e7f7457so10633922b3a.1 for ; Mon, 01 Jun 2026 10:54:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1780336487; x=1780941287; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=+pvQv+tEdMdx2J/S27ciDR/KIgnJ8vs2dvnZ0oHevHs=; b=K17xjKNFu/2LRT3W+Fipe6poYKLRvEj1uvYFZfDz9ZGdLvPJ2mjsq3OCRNGe19giwW 1rUxIimdOuMnN9eR6Jmn9wNpFOpWgDmbKSW0U5eibHZeheqf+p6xcwIhj0WISZeVCgVY prdGTiBbiSb3ePuBV7gUEXnCU04ZMqOGfPsJOiV0lW0MJd1sAlhb4VQn3ql+veFel4vH 0lo7dN6MjbIB2mmORKTknyK2Pj4rxFyinrSIbA65DLMX662OhvFMC6MCt5hn1zh2OLw4 22Lf6y9epceWlZHpeoyNkxrN5/xOf56SBrl11AfCq0nh+s8fgJjXIm5KVhXe9TkysTaf I4Vg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780336487; x=1780941287; h=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; bh=+pvQv+tEdMdx2J/S27ciDR/KIgnJ8vs2dvnZ0oHevHs=; b=Fdqg6k5wRP/qwWIkKZn8BwpjImLSWSeeRWdHWIdBj8kMbxxH+4uj74Cvzd0boTCBUz JJ6VSI5GvwXF1pT9Dnj2foJ5uBkjq6P+M/v9BqCwBQMNVN3Z0cbsJ6X/R0Y13JVCN9TS Eog29rPIgUSY3Gqv8yhwyHGcpdIsylZjxhsqBlmZsbPxCgSi0XMxAQpi7WfPDYN2vsO9 jnjK7ZOXnHiVT2dSF3aJayCzEP5MB7gLDK+BPU+RhF98/DaxO9Qb7fzexilZav+n50ca mxpycUs5f7gR98vRuHRtnUoFB71KVVVhtbjlYBfH6ko0CMCxQ4BwxcYU11EDRxMAVBd2 QpUQ== X-Forwarded-Encrypted: i=1; AFNElJ9RHGAoG9rAY+6CrxtAAFLuOeCFH3hjfmQssywt2X/WObiXSz7P7tqqoPYGiLSj01xRsGWJnzHWDpa6wAo=@vger.kernel.org X-Gm-Message-State: AOJu0YzGfMlvRPGJ6D6E8P9vW0k47Lkx1Vi5A6Ecgcinb2WKP//qEU1K qA5b6ztR1US7Gf8IkCqz0lMwFdU6Qu1gw0rydEZMqPRdvP23BtItablwMQRMYWiCCJ0EaBaoQ1V swKUscRZ1iNJGEd64BovVXS+NSg== X-Received: from pgbcz11.prod.google.com ([2002:a05:6a02:230b:b0:c79:7975:38ca]) (user=hramamurthy job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:6005:b0:3b4:661d:8405 with SMTP id adf61e73a8af0-3b47886ce87mr438403637.4.1780336486576; Mon, 01 Jun 2026 10:54:46 -0700 (PDT) Date: Mon, 1 Jun 2026 17:54:31 +0000 In-Reply-To: <20260601175437.3767283-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: <20260601175437.3767283-1-hramamurthy@google.com> X-Mailer: git-send-email 2.54.0.1013.g208068f2d8-goog Message-ID: <20260601175437.3767283-10-hramamurthy@google.com> Subject: [PATCH net-next 09/15] 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, willemb@google.com, jordanrhee@google.com, jfraker@google.com, nktgrg@google.com, bpf@vger.kernel.org, linux-kernel@vger.kernel.org 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. Recusive 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 recusive 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 pre-empt 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 Signed-off-by: Joshua Washington Signed-off-by: Harshitha Ramamurthy --- drivers/net/ethernet/google/gve/gve.h | 2 +- drivers/net/ethernet/google/gve/gve_adminq.c | 5 +- drivers/net/ethernet/google/gve/gve_adminq.h | 1 - drivers/net/ethernet/google/gve/gve_ethtool.c | 2 +- drivers/net/ethernet/google/gve/gve_main.c | 338 +++++++++--------- 5 files changed, 167 insertions(+), 181 deletions(-) diff --git a/drivers/net/ethernet/google/gve/gve.h b/drivers/net/ethernet/g= oogle/gve/gve.h index bebdb38ef3bb..442e4622ab76 100644 --- a/drivers/net/ethernet/google/gve/gve.h +++ b/drivers/net/ethernet/google/gve/gve.h @@ -1356,7 +1356,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 3e450f174aae..8f3a4e63cf37 100644 --- a/drivers/net/ethernet/google/gve/gve_adminq.c +++ b/drivers/net/ethernet/google/gve/gve_adminq.c @@ -363,7 +363,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 @@ -392,7 +392,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) @@ -1402,7 +1401,7 @@ gve_adminq_configure_flow_rule(struct gve_priv *priv, =20 if (err =3D=3D -ETIME) { dev_err(&priv->pdev->dev, "Timeout to configure the flow rule, trigger r= eset"); - gve_reset(priv, true); + gve_reset(priv, false); } else if (!err) { priv->flow_rules_cache.rules_cache_synced =3D false; } diff --git a/drivers/net/ethernet/google/gve/gve_adminq.h b/drivers/net/eth= ernet/google/gve/gve_adminq.h index efa4997a1cec..953da0f2b0e4 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 8a088dcc3603..1a54bbd2cbf6 100644 --- a/drivers/net/ethernet/google/gve/gve_ethtool.c +++ b/drivers/net/ethernet/google/gve/gve_ethtool.c @@ -654,7 +654,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_main.c b/drivers/net/ether= net/google/gve/gve_main.c index 746ff69a28dd..f8289f478e5b 100644 --- a/drivers/net/ethernet/google/gve/gve_main.c +++ b/drivers/net/ethernet/google/gve/gve_main.c @@ -591,7 +591,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 @@ -600,16 +615,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, @@ -619,20 +660,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 @@ -647,7 +683,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, @@ -659,67 +695,61 @@ 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) +/** + * Request the device to release any allocated shared resources. + * + * 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) { @@ -1160,8 +1190,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 @@ -1272,11 +1300,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); } @@ -1419,10 +1448,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)); @@ -1438,6 +1468,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); @@ -1454,41 +1490,18 @@ 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; - - 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_turndown(priv); =20 gve_unreg_xdp_info(priv); + gve_drain_page_cache(priv); + + timer_delete_sync(&priv->stats_report_timer); + 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) @@ -1496,12 +1509,28 @@ 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_queues_stop(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_mem_remove(priv); + priv->interface_down_cnt++; return 0; + +reset: + err =3D gve_reset(priv, true); + return err; } =20 static void gve_handle_link_status(struct gve_priv *priv, bool link_status) @@ -2420,25 +2449,17 @@ static int gve_setup_device(struct gve_priv *priv) { int err; =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; } @@ -2513,30 +2534,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 @@ -2549,54 +2547,52 @@ static int gve_reset_recovery(struct gve_priv *priv= , bool was_up) =20 err =3D gve_setup_device(priv); if (err) - goto err_free_adminq; - if (was_up) { + goto err; + if (setup_queues) { err =3D gve_open(priv->dev); if (err) - goto err_free_device; + goto err; } return 0; =20 -err_free_device: - gve_teardown_device_resources(priv); - bitmap_free(priv->xsk_pools); - priv->xsk_pools =3D NULL; -err_free_adminq: - gve_adminq_free(priv); err: - dev_err(&priv->pdev->dev, "Reset failed! !!! DISABLING ALL QUEUES !!!\n"); - gve_turndown(priv); + 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) { - 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); - } - /* Clean up any remaining resources */ - gve_teardown_priv_resources(priv); + + if (was_up) { + gve_queues_stop(priv); + gve_destroy_rings(priv); + gve_unregister_qpls(priv); } =20 - /* Set it all back up */ - err =3D gve_reset_recovery(priv, was_up); + /* Reset the device by releasing the AQ. Rings and other resources + * within the NIC are implicitly destroyed if commands fail. + */ + gve_adminq_free(priv); + + gve_queues_mem_remove(priv); + gve_teardown_clock(priv); + gve_free_control_plane_resources(priv); + + 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; @@ -2928,7 +2924,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)) @@ -2936,7 +2932,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); @@ -2944,8 +2940,8 @@ 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: + gve_teardown_device(priv); =20 abort_with_wq: destroy_workqueue(priv->gve_wq); @@ -2977,8 +2973,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); destroy_workqueue(priv->gve_wq); + gve_teardown_device(priv); priv->ctrl_ops->unmap_db_bar(priv); free_netdev(netdev); pci_iounmap(pdev, reg_bar); @@ -2996,13 +2992,9 @@ static void gve_shutdown(struct pci_dev *pdev) =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(); } @@ -3017,13 +3009,9 @@ static int gve_suspend(struct device *dev) 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(); @@ -3040,7 +3028,7 @@ 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); + err =3D gve_recover(priv, priv->up_before_suspend); netdev_unlock(netdev); rtnl_unlock(); return err; --=20 2.54.0.669.g59709faab0-goog From nobody Mon Jun 8 05:25:29 2026 Received: from mail-pg1-f202.google.com (mail-pg1-f202.google.com [209.85.215.202]) (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 B8D543E63A6 for ; Mon, 1 Jun 2026 17:54:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780336491; cv=none; b=aveuDZ/viOFwFZR2j6ad0JlwwtevqBMR6QSym3ncwgJBY6krTtW/Vo08ptBNYZ6gE0egjlRnD21mDS82EbQCfo52bYOw4N6zLAW8FgMcPeMqdIIhGTFdtUqBnuhEwp5yvXxFRQKshOSCRtbJ3AMWnPQS2vje5HR8UxR1gKeVqX4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780336491; c=relaxed/simple; bh=NO7ff2MjdNzbLfFOWvir+qy19F9IvmUY1vpeOLqSrMY=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=Ch/BxYyugFgGDd9EgLimNfRKFemGY7biJGs4KFihgUoWpUlYeZpcjOFDMBXZMMOsPdoZe8Wz9HNBqDvR2plHg8tr3JW5Pj3dMa8wfo9Lckrl+uADRJopRJVkVb7Jsoj38wFxtKLrkmvZGugM8D9hhA3DDKF9roFVZBWLfPku6ec= 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=mQET3XET; arc=none smtp.client-ip=209.85.215.202 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="mQET3XET" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-c85a3669a15so980915a12.1 for ; Mon, 01 Jun 2026 10:54:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1780336488; x=1780941288; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=83Wqxzx9G3Fx1CZm6JdVy+MWy9bwrjSI+ye1bNW5Jis=; b=mQET3XETpldZqVY0OhH46OrcrneFRCD/b8SN6wJGJFJYPaeRGJzTS8Rs+QUNz3w68Z /xCZBGVpI9KWeDFBjQwLZyKX77dtRnN1wy1dqEpdX/OC1MWJEoXOZwBauJHX1lBKHbHI 8mndbVFDDD0f3itDNamfp6Baq8tEOLC0BNEbrCClzbYH7vdtK2YcX8VrpyAWjpJdcE9r 7THKE6PCrt9N3QhfCZvdqPa6H8RzyHPFHtPrNw9jqe3s1cve7Xs7BJQCQIQFrjv/YGb8 M8H/QBTlk5i9a0RlKFswrd5zurA6OW9AW7Ap5jWNeSvdkEgI7P4NHtIomZV3xobM//4m onEQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780336488; x=1780941288; h=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; bh=83Wqxzx9G3Fx1CZm6JdVy+MWy9bwrjSI+ye1bNW5Jis=; b=KYjPy3k8tde0KEbxpt59NAxyyCJ00KNEPeYdX12C0acrf/sMQZKglawtSakkpxg9Bq 3h+KPiJ/6XBUIl8YRisCy/VkP6fZyUSybxnL3mXmBAC/lo9qsqYYmbcaqUt9OytfqOYB 9tiyVYhSjqawlRAiBsFs9osRVDUU6tpIs9szH/4Hv6mDtGC3IYE8t34aMmbASBSQxyZy aDAyKgsX9cgSBDxryPJmswD5flSLFjc8EuIhGaKaL7uCIChk7ZdpVAu0kympE7IrKxhK vqqic8WQSPoqH9yiqWqc6pYWExhVyNPjFeQ/fYfkZqT3h7qZmMVO8bXAu2rlPc5540rr Pnxw== X-Forwarded-Encrypted: i=1; AFNElJ+kjgN2lu9q17ZY4FOVjpYPGealpjpoIDcJyU09yxhvOc1dOnIvZD1VjVgy0wvoVJjYslSln8y9LC2+RkE=@vger.kernel.org X-Gm-Message-State: AOJu0Yxi9uNZMwkeLuP7X5XRtqzyHsXWxrwQ/4LvC/go+qmaRwzNdL9z x3oAgF+rxpghcEfphH8ZA9b/EEMlddxP+4t8amTFWTtME666fPZovF5oGSrqWCjssZdHyBxVwjg IzPckWL4wWjVMEsZYk/QrRWOHgA== X-Received: from pgan68.prod.google.com ([2002:a63:4047:0:b0:c85:894e:5b3c]) (user=hramamurthy job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:6005:b0:3b4:661d:8405 with SMTP id adf61e73a8af0-3b47886ce87mr438434637.4.1780336487549; Mon, 01 Jun 2026 10:54:47 -0700 (PDT) Date: Mon, 1 Jun 2026 17:54:32 +0000 In-Reply-To: <20260601175437.3767283-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: <20260601175437.3767283-1-hramamurthy@google.com> X-Mailer: git-send-email 2.54.0.1013.g208068f2d8-goog Message-ID: <20260601175437.3767283-11-hramamurthy@google.com> Subject: [PATCH net-next 10/15] 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, willemb@google.com, jordanrhee@google.com, jfraker@google.com, nktgrg@google.com, bpf@vger.kernel.org, linux-kernel@vger.kernel.org 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 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 442e4622ab76..f8976017ca60 100644 --- a/drivers/net/ethernet/google/gve/gve.h +++ b/drivers/net/ethernet/google/gve/gve.h @@ -835,12 +835,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 8f3a4e63cf37..a9752525d974 100644 --- a/drivers/net/ethernet/google/gve/gve_adminq.c +++ b/drivers/net/ethernet/google/gve/gve_adminq.c @@ -1352,8 +1352,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; @@ -1379,9 +1378,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 953da0f2b0e4..e783589c5ed6 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_map_db_bar(struct gve_priv *priv); void gve_adminq_unmap_db_bar(struct gve_priv *priv); int gve_adminq_set_num_ntfy_blks(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 f8289f478e5b..06df6d8ad429 100644 --- a/drivers/net/ethernet/google/gve/gve_main.c +++ b/drivers/net/ethernet/google/gve/gve_main.c @@ -649,7 +649,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, @@ -664,7 +665,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); @@ -686,12 +687,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 @@ -712,6 +714,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 */ @@ -721,11 +724,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, @@ -1811,6 +1816,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; @@ -1826,15 +1832,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, @@ -2469,6 +2477,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.54.0.669.g59709faab0-goog From nobody Mon Jun 8 05:25:29 2026 Received: from mail-pf1-f202.google.com (mail-pf1-f202.google.com [209.85.210.202]) (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 3D5213E717C for ; Mon, 1 Jun 2026 17:54:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780336491; cv=none; b=bMdsi54aJRJAV+sPX1NX8meO7Yjrp2MfbgYF5PYMTmdk42M17dEzxAtU41VT8Ct8C9TlU6FoWgvwQJJnZ9CSEsMV71NNkpPTI8n2pfRQJRdUcPTANZ5V9ljR+yTKu4q755zQxNk8KMlTznVpG+pgUVe++LCe41GBeCzXTHcGx4o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780336491; c=relaxed/simple; bh=iAUa34wr2sG4wWkLRYAz6J5talu+FiBo/4nXrRuuwn8=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=OxXHHaQGwXKZFsY2U0sAeIt27MSJ9eGnMHwTjp4nkKHm+Xb769Tbo8mkXYkA4SNlA1MQTrqez9ImbM4cJYMUOB4dwK3ip4H6B2CQ0OR8jfCHXVywDNb2TTqIIIurvJAYvQjRt21TvmrO5QiHQ6pka5CS6PEogHoI8DPgvnfFbo8= 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=G0pIXXYG; arc=none smtp.client-ip=209.85.210.202 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="G0pIXXYG" Received: by mail-pf1-f202.google.com with SMTP id d2e1a72fcca58-84237a15547so1378035b3a.3 for ; Mon, 01 Jun 2026 10:54:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1780336489; x=1780941289; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=0ywzuwl+0ezSOXY+MtyKwZEpX1/Y/0FxoeN6/NGkMFU=; b=G0pIXXYGh9NRR6EzHqXildvC/cI5mWDvsyO0AUCCt627aswXJjcX820KDTR5wpZ4iA vhHxQ+EI7i8TSi2NxtG8HLN/S159U1NtDnoyzdYfSwHrZbDYMUXeBFk4MwQMELTW8dca Yl8oW8s9pGzfss+z56mX0h2624NH5NfvedJ1qIU4pvTcEIhyutLIk2UgDPdXXUfXun5+ /rcA8aHZW96rNGmT2W1VMtjuRvJ6ALFTJNIKdLabblw1XoSffQi4Zp0SKCvfd46rTvgo JMW46xHQvXW5OSUFg2u5L43eMgIQ6pd5kzbzXWnWpDAW8Ld0/BfGtRfdrSv3TenVIkBL V+BA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780336489; x=1780941289; h=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; bh=0ywzuwl+0ezSOXY+MtyKwZEpX1/Y/0FxoeN6/NGkMFU=; b=VS6PBv74rMoRYt6P6fGEDns1s4z5BEdX8uVJhk/OYYWJ8seqkyXvNi/ReYukFYknUC 146ryKjCM52esas8iLsm9sXsCDQ0LjthzUnh6ocfVt2Ra0BPGapPR3ctiTc0G1oh9MgY nOE9NqqGdAuKifRRWGxABWOK5WMS9DgsMLWhX0Jy+g+m53GxBHtk6f2l02udy6bAuZ30 sCJpYSOWOzXhGm7DepW+pzy4iCFSovxsm0WfCpNzwb+diIvAUPcuxsMRqwQemvUi2JZx oUF5w35WYYtSooXElP0poZpNWBdBo6k+U+iMSLWJd7u96sW3pFsJLvMw6YqlrhHU9twB cGZg== X-Forwarded-Encrypted: i=1; AFNElJ+1YZz1Dn/zLV3YFSXnj6YvM+VNP4HMgVFKA1lP93mkH8lHFuXEVm/Z3vVAat6P6IUyqPlhd4UzvzSPWFQ=@vger.kernel.org X-Gm-Message-State: AOJu0Yw5ooiRA+eod9OrXqyCSYfc3+PP4df6TAF5syGhPEDvVe9GuP+4 bSa3iW99lbl6ciWxPD10mHRHrthNo1ijcSstQBeG2EpBovLT61gl1aH/FXDv2AxGO8znLzBfU4e eD+TiX4wBnXT0iRAyVW1nB+A/yQ== X-Received: from pfbbr13.prod.google.com ([2002:a05:6a00:440d:b0:842:4a9c:2fd3]) (user=hramamurthy job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:a223:b0:842:5931:7b8c with SMTP id d2e1a72fcca58-8425931803amr4122620b3a.1.1780336488382; Mon, 01 Jun 2026 10:54:48 -0700 (PDT) Date: Mon, 1 Jun 2026 17:54:33 +0000 In-Reply-To: <20260601175437.3767283-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: <20260601175437.3767283-1-hramamurthy@google.com> X-Mailer: git-send-email 2.54.0.1013.g208068f2d8-goog Message-ID: <20260601175437.3767283-12-hramamurthy@google.com> Subject: [PATCH net-next 11/15] 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, willemb@google.com, jordanrhee@google.com, jfraker@google.com, nktgrg@google.com, bpf@vger.kernel.org, linux-kernel@vger.kernel.org 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 Signed-off-by: Joshua Washington Signed-off-by: Harshitha Ramamurthy --- drivers/net/ethernet/google/gve/gve.h | 2 + drivers/net/ethernet/google/gve/gve_main.c | 158 ++++++++++++--------- 2 files changed, 89 insertions(+), 71 deletions(-) diff --git a/drivers/net/ethernet/google/gve/gve.h b/drivers/net/ethernet/g= oogle/gve/gve.h index f8976017ca60..12591a1fd746 100644 --- a/drivers/net/ethernet/google/gve/gve.h +++ b/drivers/net/ethernet/google/gve/gve.h @@ -673,6 +673,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 */ @@ -964,6 +965,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 06df6d8ad429..98970508ae54 100644 --- a/drivers/net/ethernet/google/gve/gve_main.c +++ b/drivers/net/ethernet/google/gve/gve_main.c @@ -425,6 +425,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) @@ -436,11 +454,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); @@ -454,7 +470,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; @@ -477,15 +493,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 * @@ -493,15 +500,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); @@ -519,9 +576,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; @@ -535,61 +593,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) { @@ -743,6 +752,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); /* @@ -2463,13 +2473,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 { @@ -2591,6 +2604,9 @@ int gve_reset(struct gve_priv *priv, bool skip_queue_= setup) gve_unregister_qpls(priv); } =20 + gve_teardown_notify_blocks(priv); + gve_teardown_control_plane_resources(priv); + /* Reset the device by releasing the AQ. Rings and other resources * within the NIC are implicitly destroyed if commands fail. */ --=20 2.54.0.669.g59709faab0-goog From nobody Mon Jun 8 05:25:29 2026 Received: from mail-pg1-f202.google.com (mail-pg1-f202.google.com [209.85.215.202]) (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 3683B3E8337 for ; Mon, 1 Jun 2026 17:54:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780336493; cv=none; b=l8V7dWW178D4Jw84+YAsSshkZ3q27un+lNTIaW+J/RMW98KaDHnu7fIR4qiTl7L7Hv44BegPdgnEpgc36o6voBkvG2UqWtvp1I/DQR0V8NWamUkPvd8O0riXeRST9UvjAK5Jx7HuaREFoP9Q29McIoGHcP2W7DayfIO8RFa3yXE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780336493; c=relaxed/simple; bh=FDTgzU5jwYPlxFUPB7xXeAJa14ZzKu6xRGMoXI/hdgw=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=DHy797Hr3sfnlAMrckjQUMG4DC3pvFgDx56iTg04v4F9OSi9YM4gSUuWPMkQJaiBmm5xDjelsbsqExGy2QA5QKgQWujbJHU5EHSc/AxgqIM5LSmyyiK1d76sBDnCm1EovaifXHXS/6eJPeoQKyZOm38QJ7AUbLyXOZCiZyTLTT8= 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=VOSxabMZ; arc=none smtp.client-ip=209.85.215.202 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="VOSxabMZ" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-c856470fe9fso2795558a12.2 for ; Mon, 01 Jun 2026 10:54:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1780336489; x=1780941289; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=LRE30N2+FLjU6j+wC3395cQ0eD+GH8qgnBq77kKy2+A=; b=VOSxabMZNTFoMMTo/knqtXaj25F8sUMSoYfpRdQQMlQOqv10kQPFEfaexjtoucjhtj DxzuQazmJJqEIbaum25pjUeVEG6Q9wfl2tTjg994nMegJTcN/ungnPfMNUwO74A+jw0m zQf93X/K1zNLM8Y53KxcZCzH9AHzg08A+yJUAO79e/a5CbcUTRcK+fmgCV9ryF6qLPNR TmsXdc427iy/fYtHxy34y4ePmkROvblquTB+KVYwYcyArIWxGCX+Bavc9cLkQaAOMpj8 lK/mKQ6N2Bi8XZYD/UAU9uFxAkB8jpWWYDTlSJcV9MIdmTQgpg8ClntPxkXQgkH9VeuY bfJg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780336489; x=1780941289; h=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; bh=LRE30N2+FLjU6j+wC3395cQ0eD+GH8qgnBq77kKy2+A=; b=svQAFKRxpk2uowSEsx3dl7kQ2eGYNOZJKB9qQLRpStSc5a4nWCWTQMpS1p4sJhipWe pb9l6OW4N7OdD3z82/txPQEyAzDjjYwJ1prijeVhiVzD9Q+jzexKOOM0VSzOYZ8aqbsI YZ6W7k22BBWhw72wNcma626VlDUX1nDq8LwOnnW57ST/eR+aTRe8AFJ1+7DhN1gideO0 DK3/6Z2Cie/XpbWqJ1V9i0xU4TTgEJPo1tDQ7r/ggDAlQvfaUM6srI9AsxCfGOTz6Zf9 PdV3qhbQBYFzXcAU3cBKuahHM2nX/jIPSWJt9zIIJ87SPHibN7sQtWCP1Pcde3k5PhQc JZtg== X-Forwarded-Encrypted: i=1; AFNElJ8whS+wc/PgCeUYjim0IhBf1GKOvQJs8Zl+N6trdBhqAbix0z8rYBtXVrYxEQCg5LXalZsouq9yS6hXADA=@vger.kernel.org X-Gm-Message-State: AOJu0Yxd2bX0HzO0L9hOnwfe6bvlRdoWDN622YKWL7UojVUmx+TaFWEu Y3onfBBTwu+ETSbzNGBsCx5a0q2DBDkQxWOtJPC+a4aij6spwPSCNl8JiJqEHG17I7rVJXf7Gfd dVStsLTk3rgJLc/j73vfvqWS4XQ== X-Received: from pfbfx22.prod.google.com ([2002:a05:6a00:8216:b0:838:4903:1f13]) (user=hramamurthy job=prod-delivery.src-stubby-dispatcher) by 2002:aa7:9a87:0:b0:836:5c3c:2054 with SMTP id d2e1a72fcca58-842254979a0mr12281388b3a.37.1780336489188; Mon, 01 Jun 2026 10:54:49 -0700 (PDT) Date: Mon, 1 Jun 2026 17:54:34 +0000 In-Reply-To: <20260601175437.3767283-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: <20260601175437.3767283-1-hramamurthy@google.com> X-Mailer: git-send-email 2.54.0.1013.g208068f2d8-goog Message-ID: <20260601175437.3767283-13-hramamurthy@google.com> Subject: [PATCH net-next 12/15] 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, willemb@google.com, jordanrhee@google.com, jfraker@google.com, nktgrg@google.com, bpf@vger.kernel.org, linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Joshua Washington Introduce `request_db_info` and `free_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. All behaviors related to the IRQ doorbell indices 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 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 | 71 ++++++++++++++++++++ drivers/net/ethernet/google/gve/gve_adminq.h | 2 + drivers/net/ethernet/google/gve/gve_main.c | 70 +++++-------------- 4 files changed, 103 insertions(+), 52 deletions(-) diff --git a/drivers/net/ethernet/google/gve/gve.h b/drivers/net/ethernet/g= oogle/gve/gve.h index 12591a1fd746..2cc66dfb6098 100644 --- a/drivers/net/ethernet/google/gve/gve.h +++ b/drivers/net/ethernet/google/gve/gve.h @@ -836,6 +836,8 @@ 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 + * @free_db_resources: Free DMA memory holding doorbell 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) @@ -846,6 +848,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 (*free_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); @@ -1172,6 +1176,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 || @@ -1384,6 +1393,9 @@ int gve_adjust_queues(struct gve_priv *priv, struct gve_rx_queue_config new_rx_config, struct gve_tx_queue_config new_tx_config, bool reset_rss); +/* Initialization sequence */ +int gve_alloc_counter_array(struct gve_priv *priv); +void gve_free_counter_array(struct gve_priv *priv); /* flow steering rule */ int gve_get_flow_rule_entry(struct gve_priv *priv, struct ethtool_rxnfc *c= md); int gve_get_flow_rule_ids(struct gve_priv *priv, struct ethtool_rxnfc *cmd= , u32 *rule_locs); diff --git a/drivers/net/ethernet/google/gve/gve_adminq.c b/drivers/net/eth= ernet/google/gve/gve_adminq.c index a9752525d974..966b1776ae44 100644 --- a/drivers/net/ethernet/google/gve/gve_adminq.c +++ b/drivers/net/ethernet/google/gve/gve_adminq.c @@ -1744,3 +1744,74 @@ void gve_adminq_set_num_queues(struct gve_priv *priv) device_info->default_rx_queues, priv->rx_cfg.num_queues); } + +int gve_adminq_request_db_info(struct gve_priv *priv) +{ + int err; + int i; + + /* Alloc dma addrs needed for shm regions */ + err =3D gve_alloc_counter_array(priv); + if (err) { + dev_err(&priv->pdev->dev, + "Failed to alloc db counter array."); + return err; + } + + 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_with_counter_array; + } + + 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; + goto abort_with_irq_db_indices; + } + + 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; + +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_counter_array: + gve_free_counter_array(priv); + return err; +} + +void gve_adminq_free_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); + + 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; + gve_free_counter_array(priv); +} diff --git a/drivers/net/ethernet/google/gve/gve_adminq.h b/drivers/net/eth= ernet/google/gve/gve_adminq.h index e783589c5ed6..948bd3b17496 100644 --- a/drivers/net/ethernet/google/gve/gve_adminq.h +++ b/drivers/net/ethernet/google/gve/gve_adminq.h @@ -657,5 +657,7 @@ int gve_adminq_map_db_bar(struct gve_priv *priv); void gve_adminq_unmap_db_bar(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_request_db_info(struct gve_priv *priv); +void gve_adminq_free_db_resources(struct gve_priv *priv); =20 #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 98970508ae54..55f48aee125e 100644 --- a/drivers/net/ethernet/google/gve/gve_main.c +++ b/drivers/net/ethernet/google/gve/gve_main.c @@ -179,7 +179,7 @@ static void gve_free_rss_config_cache(struct gve_priv *= priv) memset(rss_config, 0, sizeof(*rss_config)); } =20 -static int gve_alloc_counter_array(struct gve_priv *priv) +int gve_alloc_counter_array(struct gve_priv *priv) { priv->counter_array =3D dma_alloc_coherent(&priv->pdev->dev, @@ -192,7 +192,7 @@ static int gve_alloc_counter_array(struct gve_priv *pri= v) return 0; } =20 -static void gve_free_counter_array(struct gve_priv *priv) +void gve_free_counter_array(struct gve_priv *priv) { if (!priv->counter_array) return; @@ -428,15 +428,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); @@ -493,24 +484,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; @@ -525,13 +506,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; } @@ -560,12 +542,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)); @@ -575,14 +556,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 @@ -599,7 +579,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); @@ -608,9 +587,8 @@ static void gve_free_control_plane_resources(struct gve= _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_counter_array(priv); + gve_free_stats_report(priv); gve_free_rss_config_cache(priv); gve_free_flow_rule_caches(priv); } @@ -623,9 +601,6 @@ static int gve_alloc_control_plane_resources(struct gve= _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); @@ -661,15 +636,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 @@ -678,7 +647,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 free_db_resources; } } =20 @@ -708,8 +677,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); +free_db_resources: + ops->free_db_resources(priv); return err; } =20 @@ -739,12 +708,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->free_db_resources(priv); } =20 gve_clear_device_resources_ok(priv); @@ -2494,6 +2458,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, + .free_db_resources =3D gve_adminq_free_db_resources, }; =20 static int gve_init_priv(struct gve_priv *priv) --=20 2.54.0.669.g59709faab0-goog From nobody Mon Jun 8 05:25:29 2026 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (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 EFC693E6DC8 for ; Mon, 1 Jun 2026 17:54:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780336493; cv=none; b=DFg3ScBA+fgFj/21+Q4fNdSFZH6CbyLCd5tC/APqNChKm4UTfXjX0NTfPQuxSlrScDQyHRo2AY9UH9cVfoOkomdpe55O/OdZb261LWIuIWzXXX22AllUMHlWacNXefwgt8RaLA9retgZC3avdY9xEOfQhXcn7cVZ8qBIAihSph0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780336493; c=relaxed/simple; bh=DaaUDYb14AbxXDSG3GajKEistk5ab2cZr9oWRTPGei8=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=dJUBQXBPpymRtB2n6YUG8iDTS1jCf58PxOqHX19gBFzIgR959BHC9hmTooMsBY+mxLbPg/PuYbDWIc17bSeA0kExLLZ7+42G/63hfG7T/697A+b802tZTkC7KZCLqTzrLpWly4GMB9SHCwn7L5E2K7wmAsrLhqa1dGa7vnsHO3w= 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=FVYdJrYC; arc=none smtp.client-ip=209.85.214.202 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="FVYdJrYC" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-2c0c32f4b1bso18116945ad.2 for ; Mon, 01 Jun 2026 10:54:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1780336490; x=1780941290; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=IJUyKllpvSpdWZxcbGcFBQ57vMGzd+2g9rnoMrkdHYE=; b=FVYdJrYCMFk39g/eoHP+h1fcLjRCJv0n7Enc1gYKIiJ1nlP53A9eDLeAgFUy0X/x2t iloOsygrBw8kEqRT2vvL0LPOdxwej2Kl4MmliYrckVKruEd3Dfhf1PU9NC9CFtxywr+/ 7cGlq1fdLAkFXMToCu50p1I7GjgkzmWojSV7wz2GUkaj/t4Djhm4yd80bujx5icQe4hb odjWrlqs7C8Xg8ZGH+b9ICQtgwiScSQ8RGzR+NM2zXBu/UqSsH/5zdbWzUuIA8c47NOh c+xm6plWdoQNjjkTWGL1Qo8rXSNacGIfMno42FYjw87HLaijy8V9qRm1oRFeKY3lssLO r3NA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780336490; x=1780941290; h=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; bh=IJUyKllpvSpdWZxcbGcFBQ57vMGzd+2g9rnoMrkdHYE=; b=MU5r57mGzqZKhoJcfKyTUwGt/1tsraDFe2Owl7lTNHr8PQrxsPRgV7T/u7GxSetDuj njYTg74mI8BDE2bT7CrY7grdyeeAWMdlkrLFtytM8rhB37YEa9x71UsGng164rZaoTZb YegjlHq+SXN9UCEmRdSxvtPfabE87l/q3Cel7dcXPlGCE0tnqWpCdj8bCVT4M4xJtL6V hD8V0UoSFfShKP68sdhGbhxLLJXSYm8RFnKv023UQWLc+qJ/Qop1PQKhp4pvLh/+hNIk D8tEvmt9+q2Wdkyl0BeaL/+KO3ys4eVda3nUpLPZRgfdrtgrHFGnD8mGvNtVhgZy+fK6 s+5g== X-Forwarded-Encrypted: i=1; AFNElJ/zWodgS2+aoMS5OMOznQLQdM7hHUlU3XF6/vrSWYWc8oivpd9Ik0aE5HIO6R8wozyt4lE873+1mWRLLWY=@vger.kernel.org X-Gm-Message-State: AOJu0YybncEAEA2Kqo5vgL4NAFksgf4Rpj6hsdDH+YuzwKJjWsp21iFT /m2OUkMzbnhW3EYdRl6X/1Kg4AKIW1F8rhMw4SSEoJYtPSfgUu44jrhB9jhmSPFIWknzmJtBWec QkQYKTNlzXGDtPLTR0uGiZxXZ+A== X-Received: from plbt6.prod.google.com ([2002:a17:903:c86:b0:2bf:522:6125]) (user=hramamurthy job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:d4c5:b0:2c1:ef9:4516 with SMTP id d9443c01a7336-2c10ef96145mr1275375ad.35.1780336490052; Mon, 01 Jun 2026 10:54:50 -0700 (PDT) Date: Mon, 1 Jun 2026 17:54:35 +0000 In-Reply-To: <20260601175437.3767283-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: <20260601175437.3767283-1-hramamurthy@google.com> X-Mailer: git-send-email 2.54.0.1013.g208068f2d8-goog Message-ID: <20260601175437.3767283-14-hramamurthy@google.com> Subject: [PATCH net-next 13/15] 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, willemb@google.com, jordanrhee@google.com, jfraker@google.com, nktgrg@google.com, bpf@vger.kernel.org, linux-kernel@vger.kernel.org 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 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 | 32 ++++++++++++++++++++ drivers/net/ethernet/google/gve/gve_adminq.h | 2 ++ drivers/net/ethernet/google/gve/gve_main.c | 28 ++++++----------- 4 files changed, 47 insertions(+), 19 deletions(-) diff --git a/drivers/net/ethernet/google/gve/gve.h b/drivers/net/ethernet/g= oogle/gve/gve.h index 2cc66dfb6098..bb661e3b528f 100644 --- a/drivers/net/ethernet/google/gve/gve.h +++ b/drivers/net/ethernet/google/gve/gve.h @@ -838,6 +838,8 @@ struct gve_device_info { * initialization. * @request_db_info: Request and store doorbell information into @priv * @free_db_resources: Free DMA memory holding doorbell 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) @@ -850,6 +852,8 @@ struct gve_ctrl_ops { int (*set_num_ntfy_blks)(struct gve_priv *priv); int (*request_db_info)(struct gve_priv *priv); void (*free_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 966b1776ae44..5c95c737f2fd 100644 --- a/drivers/net/ethernet/google/gve/gve_adminq.c +++ b/drivers/net/ethernet/google/gve/gve_adminq.c @@ -1815,3 +1815,35 @@ void gve_adminq_free_db_resources(struct gve_priv *p= riv) priv->irq_db_indices =3D NULL; gve_free_counter_array(priv); } + +static irqreturn_t gve_mgmnt_intr(int irq, void *arg) +{ + struct gve_priv *priv =3D arg; + + 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 948bd3b17496..0c5d14c46ee8 100644 --- a/drivers/net/ethernet/google/gve/gve_adminq.h +++ b/drivers/net/ethernet/google/gve/gve_adminq.h @@ -659,5 +659,7 @@ int gve_adminq_set_num_ntfy_blks(struct gve_priv *priv); void gve_adminq_set_num_queues(struct gve_priv *priv); int gve_adminq_request_db_info(struct gve_priv *priv); void gve_adminq_free_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); =20 #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 55f48aee125e..9d00093826e3 100644 --- a/drivers/net/ethernet/google/gve/gve_main.c +++ b/drivers/net/ethernet/google/gve/gve_main.c @@ -267,14 +267,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; - - 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; @@ -499,6 +491,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) @@ -518,29 +511,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); @@ -2460,6 +2448,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, .free_db_resources =3D gve_adminq_free_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.54.0.669.g59709faab0-goog From nobody Mon Jun 8 05:25:29 2026 Received: from mail-pl1-f201.google.com (mail-pl1-f201.google.com [209.85.214.201]) (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 C91463E92B7 for ; Mon, 1 Jun 2026 17:54:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780336495; cv=none; b=mICaVVNE1+pOIEnoMakXZ4JdXxMoNB3eYo7lrguVuuTv6NRoyQyWLEascFG1UOY4fey1uibwd4nktvdSRJR6LOJPJa6Kj9FDl81P2vKX5UWCxX4utXwcRG7ge54d6wuFSKeoVZY4xEPTtMgCzf7yCgdr5IAd+vpRkLIInj+Y3u0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780336495; c=relaxed/simple; bh=3nzR0RPgLc2OQP6PE5bQxNNqLKM+b7Gh0DKZU4wrHB0=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=pJcihbtUy4sxSN3pjOG4IRKk4rqYsiMpYnTo4iKZcjY8J9RIlx/i07XjG4thS1PB31oGjRbxfIeZc4Ce+L0U+J+fuSnYHNzkaRBpNDMCbfHEJX7UjY4+fvwC+a8knmfeiLNJQOmFtE2pYg3ZYe+wTySI31EeEUqfWdmeGESBfmc= 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=OEjcnNp9; arc=none smtp.client-ip=209.85.214.201 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="OEjcnNp9" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-2c0bf6904a6so31689115ad.1 for ; Mon, 01 Jun 2026 10:54:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1780336491; x=1780941291; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=TLKzZRRRojDjqZtSuZs3O799GeA/EKRkHpD9U9xVQuo=; b=OEjcnNp9BO4l6Jt2VKG6aNSZgZYuF5K459X/8LQSDlswnbjGSjrYZkDmMsfMYCFIt2 aulGK5ZqZotlwoUc9gXbTdGaMXJ4IC4H1KGb+jyh9/Gb3PaMEYIWJik2Weixr6hm6fwZ 5bANIqRPFZRp7HjIsoX2/gZn+y7iI3LG9qBBnWvl31/Bnzni4WtUfV1Cemxl2YD6olWU jfrOKcmlFDP6HRBpvP7VFKCIBnRjvbs3GYqziMcCsNWrdcrhnfx+8QD8FEddI0HVakdw RnXbPHK15RNfWy9Ua22XDDDMsqcxdi85TuvGroDYo80zvuz+an4nywtZ1KyIiAOygKJ9 am5g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780336491; x=1780941291; h=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; bh=TLKzZRRRojDjqZtSuZs3O799GeA/EKRkHpD9U9xVQuo=; b=j3dgZw2B97uG6YRujTZ2DEZqKMhoHtO1sVYgVegtu4uoWSFCkG6KG+Y5Snz6B6K7CT CmrVYUyLYSsncfkjN9EMMu/ys5UUaTImCDamL5k1i97KqKjgKitileUh1Ee9dhOqG9ab SvVn5geoxvVehTrEHvPw73T5JGiJShKDn0FxRi1PRiqiRDkaNxiXNkKoF+iGJy/I8uRG F8TSTicycld8/O4N6uHHnA2CyJAWx86Ck8zTgOjqTppjeBzVbkT40FsPW5upNwe43s7p Iv69thnKMUVLbkV+P1zLUtpx7mXA0mZh94ISX2Lx68yjiZ9NMArU1OBl078nhkhp7MPv NBjA== X-Forwarded-Encrypted: i=1; AFNElJ/LeEjBeyG92OD647m72y9tnutnqgB1LVaPPF8uiHy10xRwtZpT+/j8siIu9JREaNXh0rBfe0r35Y5z3As=@vger.kernel.org X-Gm-Message-State: AOJu0YwPqdheAKcWY35ENxiUqYwkFsb3iw09Jnmc1E9pz+SapHD8Pj3N wZpJBGyKMPQv7xclosyIvrJjbDj/ZO+/E9TgJ1/j0/ggUkGnamicgX2m1TJmRYWTsdbz+cAXRd5 CtJKuVob6YhPr/kM6qtkj8OIHGQ== X-Received: from plbmi12.prod.google.com ([2002:a17:902:fccc:b0:2b0:51f0:272d]) (user=hramamurthy job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:8d0:b0:2bd:c5f8:504f with SMTP id d9443c01a7336-2bf368d9ee5mr133687865ad.40.1780336490834; Mon, 01 Jun 2026 10:54:50 -0700 (PDT) Date: Mon, 1 Jun 2026 17:54:36 +0000 In-Reply-To: <20260601175437.3767283-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: <20260601175437.3767283-1-hramamurthy@google.com> X-Mailer: git-send-email 2.54.0.1013.g208068f2d8-goog Message-ID: <20260601175437.3767283-15-hramamurthy@google.com> Subject: [PATCH net-next 14/15] 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, willemb@google.com, jordanrhee@google.com, jfraker@google.com, nktgrg@google.com, bpf@vger.kernel.org, linux-kernel@vger.kernel.org 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 exisiting code into ops, no functional change. Reviewed-by: Willem de Bruijn Reviewed-by: Jordan Rhee Signed-off-by: Harshitha Ramamurthy --- 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 | 3 +- drivers/net/ethernet/google/gve/gve_main.c | 41 ++++------------ 4 files changed, 65 insertions(+), 33 deletions(-) diff --git a/drivers/net/ethernet/google/gve/gve.h b/drivers/net/ethernet/g= oogle/gve/gve.h index b2e578b3d450..4283cb9b49de 100644 --- a/drivers/net/ethernet/google/gve/gve.h +++ b/drivers/net/ethernet/google/gve/gve.h @@ -841,6 +841,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); @@ -859,6 +861,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 5dc5c63cee32..799381d24c71 100644 --- a/drivers/net/ethernet/google/gve/gve_adminq.c +++ b/drivers/net/ethernet/google/gve/gve_adminq.c @@ -941,6 +941,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 @@ -1822,3 +1846,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 ff656fb4f113..03e8318f7327 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); @@ -661,5 +663,4 @@ int gve_adminq_request_db_info(struct gve_priv *priv); void gve_adminq_free_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 9d00093826e3..dfc734d8bec9 100644 --- a/drivers/net/ethernet/google/gve/gve_main.c +++ b/drivers/net/ethernet/google/gve/gve_main.c @@ -841,33 +841,18 @@ 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); + netif_err(priv, drv, priv->dev, + "failed to create queues\n"); /* 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 @@ -1022,26 +1007,16 @@ 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); + err =3D priv->ctrl_ops->destroy_queues(priv); + 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; + "failed to destroy queues\n"); } - netif_dbg(priv, drv, priv->dev, "destroyed rx queues\n"); - return 0; + return err; } =20 static void gve_queues_mem_free(struct gve_priv *priv, @@ -2450,6 +2425,8 @@ static const struct gve_ctrl_ops gve_adminq_ops =3D { .free_db_resources =3D gve_adminq_free_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.54.0.794.g4f17f83d09-goog From nobody Mon Jun 8 05:25:29 2026 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (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 90D033E9C37 for ; Mon, 1 Jun 2026 17:54:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780336495; cv=none; b=BvO2dEWrzBJZXQSnEbbV/taASMqanmR0jxovcubwJ8y4LiSxxCD4vb7d7ppRcC2OsPlVhJTAj0i90XxWMXM9seL3S5wzfvo8IrHE/hq7iI2O/rL0wwr+G2dXKfyy9TcK3KZ0X4n2vC9pNPzd72dcOZDeB1iMlxwnXBWeWVQFLK4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780336495; c=relaxed/simple; bh=h3KWSxMN/qgHst94bYY4WUtCFjOCMGganwOkBkt8sGg=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=NjOxr3EptZACE9SgafAIlT3DlYAjlrqHF7qfnjvuyWsjMBKeEyiA6/DzfWLh9s3c3ZVHUOn6GZnBeosgU1G1ENyDpYrrFNZVBpwrfhC6t3VetsyCE2XVtOcuKhpdHfBqKip0UBG3UP3DJ/m96KZ3XXFTqnkopAi5TkQVwiCp1RU= 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=a4FtoiOb; arc=none smtp.client-ip=209.85.214.202 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="a4FtoiOb" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-2c0c32f4b1bso18117255ad.2 for ; Mon, 01 Jun 2026 10:54:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1780336492; x=1780941292; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=rz53fEfSGvhiqDn6NlNiGo55xLa79XIY0IpZD8TlaYs=; b=a4FtoiObBB4fcO+3EvnsgAmY4mD7dw+aExcht0rrEs5c7GUOPKruar5KCqh2cpVszu YUr25qsTDMkWiwbFmIdhVAp3146rlsCrfcaPDmr0GFJCQIzLl3p9NhsgdmhH1iBBX+Ot S9cE76fCDOGkC+B1S14XEO0xpPnG1PXsiR6SQ0Rpdlk7/K5uP4wLSnMy+yEZxVJuJDk9 0jtVrT1PUf0Wx+Ofd/b/2l0B17r4Ylnbj0+yNkNx8liDz7PVIbkv3ukhNuR7GyDFJhnc 2yhE6OAy0p759J30XcE7LyMYXFmw7XkDUAp5f+B+odeftw7WWheObmjp9UJdup6/BYMM +8hg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780336492; x=1780941292; h=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; bh=rz53fEfSGvhiqDn6NlNiGo55xLa79XIY0IpZD8TlaYs=; b=QKG7AnzqoRR3L9s9v+PewahtmSG7SDifGvbundga6GGgBD/uzNJ9c7nw6lNijMtiRG P5f5pz+6SYUTeoRh32rcBBItOuH1U3yoWNYbWn0N4p0ETAEjyIxiOeR+9HPhQyXWN9bg 2kdvte5rvy6G4xQbLAMcj2+qz6zBMujuVMowKX5DuOfFPgJvUhOKbl10rTHUzYg7AcP7 ut9OtBeeQs/NDzd+oel8dadR6gZwPJ6/QcBWFda0ovY8MwFQzsZ4ltyfUKpuIJ1AHUf0 ifZpoMNBIuZQG+HShqfzBDwGLmYHqWyYjppv8EvrBhMcvlZMKOa5P2LWNALH8+LdIWsK AJoA== X-Forwarded-Encrypted: i=1; AFNElJ8D6NQxCawibAOqE65YDXEIWNrU2ZKCor80Wyi8C/3ZQTBRPIpPZ3fNHJtwwD16DB4jnLftrfUx09GoqjY=@vger.kernel.org X-Gm-Message-State: AOJu0Yzc3mWNIRg8eL9pPM/wJ/m/ptNMU4ArDN7uq3pmsgMrsor8Hu/V uTTnlMyF/FdIjfs32gGaq5yCHMYmB7f+NvDRhJakXphk++hhJu0FivoGxtrOitHvXnJdh/cwoUs w53vN7bZpgTZ0VlwdxnQ2jYZqaA== X-Received: from plgy12.prod.google.com ([2002:a17:903:22cc:b0:2bf:21c9:7d27]) (user=hramamurthy job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:cf01:b0:2c0:a959:8677 with SMTP id d9443c01a7336-2c0a95987dcmr125550505ad.14.1780336491643; Mon, 01 Jun 2026 10:54:51 -0700 (PDT) Date: Mon, 1 Jun 2026 17:54:37 +0000 In-Reply-To: <20260601175437.3767283-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: <20260601175437.3767283-1-hramamurthy@google.com> X-Mailer: git-send-email 2.54.0.1013.g208068f2d8-goog Message-ID: <20260601175437.3767283-16-hramamurthy@google.com> Subject: [PATCH net-next 15/15] 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, willemb@google.com, jordanrhee@google.com, jfraker@google.com, nktgrg@google.com, bpf@vger.kernel.org, linux-kernel@vger.kernel.org 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 Signed-off-by: Joshua Washington Signed-off-by: Harshitha Ramamurthy --- drivers/net/ethernet/google/gve/gve.h | 5 ++++ 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 | 3 +-- drivers/net/ethernet/google/gve/gve_main.c | 23 +++++++++++-------- 5 files changed, 29 insertions(+), 12 deletions(-) diff --git a/drivers/net/ethernet/google/gve/gve.h b/drivers/net/ethernet/g= oogle/gve/gve.h index 6cd993221488..67f0633e4b89 100644 --- a/drivers/net/ethernet/google/gve/gve.h +++ b/drivers/net/ethernet/google/gve/gve.h @@ -846,6 +846,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 status into @priv->link_speed */ struct gve_ctrl_ops { int (*map_db_bar)(struct gve_priv *priv); @@ -866,6 +868,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 { @@ -975,6 +979,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 c4932a258244..81c81bf1fd5f 100644 --- a/drivers/net/ethernet/google/gve/gve_adminq.c +++ b/drivers/net/ethernet/google/gve/gve_adminq.c @@ -1897,3 +1897,12 @@ 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); + priv->link_up =3D !!(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 8c72295bfc15..979ffe693229 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 1a54bbd2cbf6..71ed62fb1d71 100644 --- a/drivers/net/ethernet/google/gve/gve_ethtool.c +++ b/drivers/net/ethernet/google/gve/gve_ethtool.c @@ -752,12 +752,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 dfc734d8bec9..181ec6919051 100644 --- a/drivers/net/ethernet/google/gve/gve_main.c +++ b/drivers/net/ethernet/google/gve/gve_main.c @@ -1475,15 +1475,15 @@ 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) { if (!gve_get_napi_enabled(priv)) return; =20 - if (link_status =3D=3D netif_carrier_ok(priv->dev)) + if (priv->link_up =3D=3D netif_carrier_ok(priv->dev)) return; =20 - if (link_status) { + if (priv->link_up) { netdev_info(priv->dev, "Device link is up.\n"); netif_carrier_on(priv->dev); } else { @@ -1510,7 +1510,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)) { @@ -1537,8 +1536,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 @@ -1971,11 +1970,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, @@ -2299,12 +2298,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) @@ -2427,6 +2428,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.54.0.669.g59709faab0-goog