mirror of
https://github.com/torvalds/linux.git
synced 2026-09-11 20:13:02 +02:00
Merge branch 'net-bcmasp-fix-tx-ring-accounting-bugs'
Danesh Petigara says:
====================
net: bcmasp: fix TX ring accounting bugs
Two fixes for TX descriptor ring handling in the bcmasp driver:
- tx_spb_ring_full() re-initialized next_index from
intf->tx_spb_index on every loop iteration instead of advancing
it, so it only ever checked a single descriptor slot regardless
of cnt. This let bcmasp_xmit() proceed even when the ring didn't
actually have enough free slots for the SKB's fragments.
- bcmasp_xmit() only set txcb->last for the final fragment of an
SKB, leaving stale true values in reused descriptor slots from a
prior transmission. Combined with the ring-full miscount above,
this could cause bcmasp_tx_reclaim() to treat a mid-SKB
descriptor as the last one and free the sk_buff while later
fragments were still in flight.
Patch 1 clears txcb->last unconditionally before it is set, and
patch 2 fixes the ring-full slot check to advance through each
candidate slot.
====================
Link: https://patch.msgid.link/20260831184235.4133351-1-danesh.petigara@broadcom.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
b6dd676d32
|
|
@ -148,8 +148,9 @@ static int tx_spb_ring_full(struct bcmasp_intf *intf, int cnt)
|
|||
int next_index, i;
|
||||
|
||||
/* Check if we have enough room for cnt descriptors */
|
||||
next_index = intf->tx_spb_index;
|
||||
for (i = 0; i < cnt; i++) {
|
||||
next_index = incr_ring(intf->tx_spb_index, DESC_RING_COUNT);
|
||||
next_index = incr_ring(next_index, DESC_RING_COUNT);
|
||||
if (next_index == intf->tx_spb_clean_index)
|
||||
return 1;
|
||||
}
|
||||
|
|
@ -301,6 +302,7 @@ static netdev_tx_t bcmasp_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
txcb->bytes_sent = total_bytes;
|
||||
dma_unmap_addr_set(txcb, dma_addr, mapping);
|
||||
dma_unmap_len_set(txcb, dma_len, size);
|
||||
txcb->last = false;
|
||||
if (!i) {
|
||||
desc->flags |= DESC_SOF;
|
||||
if (csum_hw)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user