[PATCH net-next v9 10/12] gve: setup and teardown management interrupts
flat view
COOLING5d
IN NET-NEXT: 3 (2M)
From: Harshitha Ramamurthy <hramamurthy@google.com>
Date: 2026-09-30 19:04:41
Also in:
bpf, lkml
Subsystem:
networking drivers, the rest · Maintainers:
Andrew Lunn, "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Linus Torvalds
Revision v9 of 5 in this series; 3 review trailers; queued in net-next as 5e86cf5e2f24 on 2026-10-05.
Revisions (5)
From: Joshua Washington <joshwash@google.com> Introduce control ops to setup/teardown control plane IRQs. Admin queue-specific functionality is moved to admin queue files. Reviewed-by: Willem de Bruijn <willemb@google.com> Reviewed-by: Jordan Rhee <redacted> Reviewed-by: Przemek Kitszel <przemyslaw.kitszel@intel.com> Signed-off-by: Joshua Washington <joshwash@google.com> Signed-off-by: Harshitha Ramamurthy <hramamurthy@google.com> --- 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 | 26 +++++----------- 4 files changed, 46 insertions(+), 18 deletions(-)
diff --git a/drivers/net/ethernet/google/gve/gve.h b/drivers/net/ethernet/google/gve/gve.h
index 6c46c842070b..016e85ed91a5 100644
--- a/drivers/net/ethernet/google/gve/gve.h
+++ b/drivers/net/ethernet/google/gve/gve.h@@ -837,6 +837,8 @@ struct gve_device_info { * @request_db_info: Request and store doorbell information into @priv * @release_db_resources: Release device hold on DMA memory holding 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)
@@ -849,6 +851,8 @@ struct gve_ctrl_ops { int (*set_num_ntfy_blks)(struct gve_priv *priv); int (*request_db_info)(struct gve_priv *priv); void (*release_db_resources)(struct gve_priv *priv); + int (*setup_mgmt_irq)(struct gve_priv *priv); + void (*teardown_mgmt_irq)(struct gve_priv *priv); int (*get_ptype_map)(struct gve_priv *priv); int (*configure_rss)(struct gve_priv *priv, struct ethtool_rxfh_param *param);
diff --git a/drivers/net/ethernet/google/gve/gve_adminq.c b/drivers/net/ethernet/google/gve/gve_adminq.c
index b89825a85db8..05b011417bf3 100644
--- a/drivers/net/ethernet/google/gve/gve_adminq.c
+++ b/drivers/net/ethernet/google/gve/gve_adminq.c@@ -1755,3 +1755,35 @@ void gve_adminq_release_db_resources(struct gve_priv *priv) "Could not deconfigure device resources: err=%d\n", err); } + +static irqreturn_t gve_mgmnt_intr(int irq, void *arg) +{ + struct gve_priv *priv = 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 = 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 = 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 = false; + } +}
diff --git a/drivers/net/ethernet/google/gve/gve_adminq.h b/drivers/net/ethernet/google/gve/gve_adminq.h
index 52172bf228eb..0b48e9f2a82a 100644
--- a/drivers/net/ethernet/google/gve/gve_adminq.h
+++ b/drivers/net/ethernet/google/gve/gve_adminq.h@@ -659,4 +659,6 @@ int gve_adminq_map_db_bar(struct gve_priv *priv); void gve_adminq_unmap_db_bar(struct gve_priv *priv); int gve_adminq_request_db_info(struct gve_priv *priv); void gve_adminq_release_db_resources(struct gve_priv *priv); +int gve_adminq_setup_mgmt_irq(struct gve_priv *priv); +void gve_adminq_teardown_mgmt_irq(struct gve_priv *priv); #endif /* _GVE_ADMINQ_H */
diff --git a/drivers/net/ethernet/google/gve/gve_main.c b/drivers/net/ethernet/google/gve/gve_main.c
index d8fafe56f5b8..63377bf2a0f8 100644
--- a/drivers/net/ethernet/google/gve/gve_main.c
+++ b/drivers/net/ethernet/google/gve/gve_main.c@@ -291,14 +291,6 @@ static void gve_free_stats_report(struct gve_priv *priv) priv->stats_report = NULL; } -static irqreturn_t gve_mgmnt_intr(int irq, void *arg) -{ - struct gve_priv *priv = 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 = arg;
@@ -523,12 +515,10 @@ static int gve_alloc_notify_blocks(struct gve_priv *priv) static void gve_teardown_notify_blocks(struct gve_priv *priv) { + const struct gve_ctrl_ops *ops = priv->ctrl_ops; int i; - if (priv->mgmt_irq_requested) { - free_irq(priv->msix_vectors[priv->mgmt_msix_idx].vector, priv); - priv->mgmt_irq_requested = false; - } + ops->teardown_mgmt_irq(priv); if (!priv->ntfy_blocks) return;
@@ -549,21 +539,19 @@ static void gve_teardown_notify_blocks(struct gve_priv *priv) static int gve_setup_notify_blocks(struct gve_priv *priv) { + const struct gve_ctrl_ops *ops = priv->ctrl_ops; const struct cpumask *node_mask; unsigned int cur_cpu; int i; int err; /* Setup Management Vector */ - snprintf(priv->mgmt_msix_name, sizeof(priv->mgmt_msix_name), - "gve-mgmnt@pci:%s", pci_name(priv->pdev)); - err = request_irq(priv->msix_vectors[priv->mgmt_msix_idx].vector, - gve_mgmnt_intr, 0, priv->mgmt_msix_name, priv); + err = 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 = true; node_mask = gve_get_node_mask(priv); cur_cpu = cpumask_first(node_mask);
@@ -2506,6 +2494,8 @@ static const struct gve_ctrl_ops gve_adminq_ops = { .configure_rss = gve_adminq_configure_rss, .request_db_info = gve_adminq_request_db_info, .release_db_resources = gve_adminq_release_db_resources, + .setup_mgmt_irq = gve_adminq_setup_mgmt_irq, + .teardown_mgmt_irq = gve_adminq_teardown_mgmt_irq, }; static int gve_init_priv(struct gve_priv *priv)
--
2.56.0.rc1.315.gc6ed9934b7-goog