Skip to content

Commit 3d970ed

Browse files
agarg2008Paolo Abeni
authored andcommitted
gve: defer interrupt enabling until NAPI registration
Currently, interrupts are automatically enabled immediately upon request. This allows interrupt to fire before the associated NAPI context is fully initialized and cause failures like below: [ 0.946369] Call Trace: [ 0.946369] <IRQ> [ 0.946369] __napi_poll+0x2a/0x1e0 [ 0.946369] net_rx_action+0x2f9/0x3f0 [ 0.946369] handle_softirqs+0xd6/0x2c0 [ 0.946369] ? handle_edge_irq+0xc1/0x1b0 [ 0.946369] __irq_exit_rcu+0xc3/0xe0 [ 0.946369] common_interrupt+0x81/0xa0 [ 0.946369] </IRQ> [ 0.946369] <TASK> [ 0.946369] asm_common_interrupt+0x22/0x40 [ 0.946369] RIP: 0010:pv_native_safe_halt+0xb/0x10 Use the `IRQF_NO_AUTOEN` flag when requesting interrupts to prevent auto enablement and explicitly enable the interrupt in NAPI initialization path (and disable it during NAPI teardown). This ensures that interrupt lifecycle is strictly coupled with readiness of NAPI context. Cc: [email protected] Fixes: 1dfc2e4 ("gve: Refactor napi add and remove functions") Signed-off-by: Ankit Garg <[email protected]> Reviewed-by: Jordan Rhee <[email protected]> Reviewed-by: Joshua Washington <[email protected]> Signed-off-by: Harshitha Ramamurthy <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Paolo Abeni <[email protected]>
1 parent a48e232 commit 3d970ed

2 files changed

Lines changed: 3 additions & 1 deletion

File tree

drivers/net/ethernet/google/gve/gve_main.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -558,7 +558,7 @@ static int gve_alloc_notify_blocks(struct gve_priv *priv)
558558
block->priv = priv;
559559
err = request_irq(priv->msix_vectors[msix_idx].vector,
560560
gve_is_gqi(priv) ? gve_intr : gve_intr_dqo,
561-
0, block->name, block);
561+
IRQF_NO_AUTOEN, block->name, block);
562562
if (err) {
563563
dev_err(&priv->pdev->dev,
564564
"Failed to receive msix vector %d\n", i);

drivers/net/ethernet/google/gve/gve_utils.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,11 +112,13 @@ void gve_add_napi(struct gve_priv *priv, int ntfy_idx,
112112

113113
netif_napi_add_locked(priv->dev, &block->napi, gve_poll);
114114
netif_napi_set_irq_locked(&block->napi, block->irq);
115+
enable_irq(block->irq);
115116
}
116117

117118
void gve_remove_napi(struct gve_priv *priv, int ntfy_idx)
118119
{
119120
struct gve_notify_block *block = &priv->ntfy_blocks[ntfy_idx];
120121

122+
disable_irq(block->irq);
121123
netif_napi_del_locked(&block->napi);
122124
}

0 commit comments

Comments
 (0)