Skip to content

Commit 47b1576

Browse files
Shravya KNvijay-suman
authored andcommitted
bnxt_en: Fix receive ring space parameters when XDP is active
[ Upstream commit 3051a77 ] The MTU setting at the time an XDP multi-buffer is attached determines whether the aggregation ring will be used and the rx_skb_func handler. This is done in bnxt_set_rx_skb_mode(). If the MTU is later changed, the aggregation ring setting may need to be changed and it may become out-of-sync with the settings initially done in bnxt_set_rx_skb_mode(). This may result in random memory corruption and crashes as the HW may DMA data larger than the allocated buffer size, such as: BUG: kernel NULL pointer dereference, address: 00000000000003c0 PGD 0 P4D 0 Oops: 0000 [#1] PREEMPT SMP NOPTI CPU: 17 PID: 0 Comm: swapper/17 Kdump: loaded Tainted: G S OE 6.1.0-226bf9805506 #1 Hardware name: Wiwynn Delta Lake PVT BZA.02601.0150/Delta Lake-Class1, BIOS F0E_3A12 08/26/2021 RIP: 0010:bnxt_rx_pkt+0xe97/0x1ae0 [bnxt_en] Code: 8b 95 70 ff ff ff 4c 8b 9d 48 ff ff ff 66 41 89 87 b4 00 00 00 e9 0b f7 ff ff 0f b7 43 0a 49 8b 95 a8 04 00 00 25 ff 0f 00 00 <0f> b7 14 42 48 c1 e2 06 49 03 95 a0 04 00 00 0f b6 42 33f RSP: 0018:ffffa19f40cc0d18 EFLAGS: 00010202 RAX: 00000000000001e0 RBX: ffff8e2c805c6100 RCX: 00000000000007ff RDX: 0000000000000000 RSI: ffff8e2c271ab990 RDI: ffff8e2c84f12380 RBP: ffffa19f40cc0e48 R08: 000000000001000d R09: 974ea2fcddfa4cbf R10: 0000000000000000 R11: ffffa19f40cc0ff8 R12: ffff8e2c94b58980 R13: ffff8e2c952d6600 R14: 0000000000000016 R15: ffff8e2c271ab990 FS: 0000000000000000(0000) GS:ffff8e3b3f840000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00000000000003c0 CR3: 0000000e8580a004 CR4: 00000000007706e0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 PKRU: 55555554 Call Trace: <IRQ> __bnxt_poll_work+0x1c2/0x3e0 [bnxt_en] To address the issue, we now call bnxt_set_rx_skb_mode() within bnxt_change_mtu() to properly set the AGG rings configuration and update rx_skb_func based on the new MTU value. Additionally, BNXT_FLAG_NO_AGG_RINGS is cleared at the beginning of bnxt_set_rx_skb_mode() to make sure it gets set or cleared based on the current MTU. Fixes: 08450ea ("bnxt_en: Fix max_mtu setting for multi-buf XDP") Co-developed-by: Somnath Kotur <[email protected]> Signed-off-by: Somnath Kotur <[email protected]> Signed-off-by: Shravya KN <[email protected]> Signed-off-by: Michael Chan <[email protected]> Signed-off-by: Paolo Abeni <[email protected]> Signed-off-by: Sasha Levin <[email protected]> (cherry picked from commit bf54a7660fc8d2166f41ff1d67a643b15d8b2250) Orabug: 37433562 CVE: CVE-2024-53209 Signed-off-by: Saeed Mirzamohammadi <[email protected]> Reviewed-by: Harshit Mogalapalli <[email protected]> Conflicts: drivers/net/ethernet/broadcom/bnxt/bnxt.c - due to 1eb2cde not in codebase. Signed-off-by: Vijayendra Suman <[email protected]>
1 parent f52496b commit 47b1576

File tree

1 file changed

+9
-1
lines changed
  • drivers/net/ethernet/broadcom/bnxt

1 file changed

+9
-1
lines changed

drivers/net/ethernet/broadcom/bnxt/bnxt.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4352,7 +4352,7 @@ int bnxt_set_rx_skb_mode(struct bnxt *bp, bool page_mode)
43524352
struct net_device *dev = bp->dev;
43534353

43544354
if (page_mode) {
4355-
bp->flags &= ~BNXT_FLAG_AGG_RINGS;
4355+
bp->flags &= ~(BNXT_FLAG_AGG_RINGS | BNXT_FLAG_NO_AGG_RINGS);
43564356
bp->flags |= BNXT_FLAG_RX_PAGE_MODE;
43574357

43584358
if (bp->xdp_prog->aux->xdp_has_frags)
@@ -13452,6 +13452,14 @@ static int bnxt_change_mtu(struct net_device *dev, int new_mtu)
1345213452
bnxt_close_nic(bp, true, false);
1345313453

1345413454
dev->mtu = new_mtu;
13455+
13456+
/* MTU change may change the AGG ring settings if an XDP multi-buffer
13457+
* program is attached. We need to set the AGG rings settings and
13458+
* rx_skb_func accordingly.
13459+
*/
13460+
if (READ_ONCE(bp->xdp_prog))
13461+
bnxt_set_rx_skb_mode(bp, true);
13462+
1345513463
bnxt_set_ring_params(bp);
1345613464

1345713465
if (netif_running(dev))

0 commit comments

Comments
 (0)