Skip to content

Commit b6ecc66

Browse files
Souradeep Chakrabartidavem330
authored andcommitted
net: mana: Fix error handling in mana_create_txq/rxq's NAPI cleanup
Currently napi_disable() gets called during rxq and txq cleanup, even before napi is enabled and hrtimer is initialized. It causes kernel panic. ? page_fault_oops+0x136/0x2b0 ? page_counter_cancel+0x2e/0x80 ? do_user_addr_fault+0x2f2/0x640 ? refill_obj_stock+0xc4/0x110 ? exc_page_fault+0x71/0x160 ? asm_exc_page_fault+0x27/0x30 ? __mmdrop+0x10/0x180 ? __mmdrop+0xec/0x180 ? hrtimer_active+0xd/0x50 hrtimer_try_to_cancel+0x2c/0xf0 hrtimer_cancel+0x15/0x30 napi_disable+0x65/0x90 mana_destroy_rxq+0x4c/0x2f0 mana_create_rxq.isra.0+0x56c/0x6d0 ? mana_uncfg_vport+0x50/0x50 mana_alloc_queues+0x21b/0x320 ? skb_dequeue+0x5f/0x80 Cc: stable@vger.kernel.org Fixes: e1b5683 ("net: mana: Move NAPI from EQ to CQ") Signed-off-by: Souradeep Chakrabarti <schakrabarti@linux.microsoft.com> Reviewed-by: Haiyang Zhang <haiyangz@microsoft.com> Reviewed-by: Shradha Gupta <shradhagupta@linux.microsoft.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 33f339a commit b6ecc66

File tree

2 files changed

+15
-9
lines changed

2 files changed

+15
-9
lines changed

drivers/net/ethernet/microsoft/mana/mana_en.c

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1872,10 +1872,12 @@ static void mana_destroy_txq(struct mana_port_context *apc)
18721872

18731873
for (i = 0; i < apc->num_queues; i++) {
18741874
napi = &apc->tx_qp[i].tx_cq.napi;
1875-
napi_synchronize(napi);
1876-
napi_disable(napi);
1877-
netif_napi_del(napi);
1878-
1875+
if (apc->tx_qp[i].txq.napi_initialized) {
1876+
napi_synchronize(napi);
1877+
napi_disable(napi);
1878+
netif_napi_del(napi);
1879+
apc->tx_qp[i].txq.napi_initialized = false;
1880+
}
18791881
mana_destroy_wq_obj(apc, GDMA_SQ, apc->tx_qp[i].tx_object);
18801882

18811883
mana_deinit_cq(apc, &apc->tx_qp[i].tx_cq);
@@ -1931,6 +1933,7 @@ static int mana_create_txq(struct mana_port_context *apc,
19311933
txq->ndev = net;
19321934
txq->net_txq = netdev_get_tx_queue(net, i);
19331935
txq->vp_offset = apc->tx_vp_offset;
1936+
txq->napi_initialized = false;
19341937
skb_queue_head_init(&txq->pending_skbs);
19351938

19361939
memset(&spec, 0, sizeof(spec));
@@ -1997,6 +2000,7 @@ static int mana_create_txq(struct mana_port_context *apc,
19972000

19982001
netif_napi_add_tx(net, &cq->napi, mana_poll);
19992002
napi_enable(&cq->napi);
2003+
txq->napi_initialized = true;
20002004

20012005
mana_gd_ring_cq(cq->gdma_cq, SET_ARM_BIT);
20022006
}
@@ -2008,7 +2012,7 @@ static int mana_create_txq(struct mana_port_context *apc,
20082012
}
20092013

20102014
static void mana_destroy_rxq(struct mana_port_context *apc,
2011-
struct mana_rxq *rxq, bool validate_state)
2015+
struct mana_rxq *rxq, bool napi_initialized)
20122016

20132017
{
20142018
struct gdma_context *gc = apc->ac->gdma_dev->gdma_context;
@@ -2023,15 +2027,15 @@ static void mana_destroy_rxq(struct mana_port_context *apc,
20232027

20242028
napi = &rxq->rx_cq.napi;
20252029

2026-
if (validate_state)
2030+
if (napi_initialized) {
20272031
napi_synchronize(napi);
20282032

2029-
napi_disable(napi);
2033+
napi_disable(napi);
20302034

2035+
netif_napi_del(napi);
2036+
}
20312037
xdp_rxq_info_unreg(&rxq->xdp_rxq);
20322038

2033-
netif_napi_del(napi);
2034-
20352039
mana_destroy_wq_obj(apc, GDMA_RQ, rxq->rxobj);
20362040

20372041
mana_deinit_cq(apc, &rxq->rx_cq);

include/net/mana/mana.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,8 @@ struct mana_txq {
9898

9999
atomic_t pending_sends;
100100

101+
bool napi_initialized;
102+
101103
struct mana_stats_tx stats;
102104
};
103105

0 commit comments

Comments
 (0)