[PATCH net v4 0/3] Fix to possible skb leak due to race condtion in tx path
From: Selvamani Rajagopal via B4 Relay <devnull+Selvamani.Rajagopal.onsemi.com@kernel.org>
Date: 2026-07-21 02:21:31
Also in:
b4-sent, lkml
Now the traffic is handled in threaded IRQ, and the disable_traffic flag is checked before handling the data, new race condition is exposed, in which buffer may leak, if threaded IRQ interrupts the trasmit path midway. With this change, disable_traffic and waiting_tx_skb pointer are protected by spin lock/unlock pair. This is highlighted in Sashiko review https://netdev-ai.bots.linux.dev/sashiko/#/patchset/20260611-level-trigger-v5-0-4533a9e85ce2%40onsemi.com Also on buffer overrun condition, probably due to loss of SPI data chunks, receive path doesn't see the expected data chunk with end_valid bit set. As a result, driver keeps adding data chunks to the skb before running out of space and kernel panic is seen. With this change, before adding data to the skb, if there is no space, skb is freed and driver starts looking for new frame by looking for a data chunk with start_valid bit set. [ 705.405490] skbuff: skb_over_panic: text:ffffffd2eb72a264 len:1600 put:64 head:ffffff804e5cdc40 data:ffffff804e5cdc80 tail:0x680 end:0x640 dev:eth1 [ 705.405569] ------------[ cut here ]------------ [ 705.405575] kernel BUG at net/core/skbuff.c:214! [ 705.405589] Internal error: Oops - BUG: 00000000f2000800 [#1] SMP [ 6703.427690] Call trace: [ 705.925157] skb_panic+0x58/0x68 (P) [ 705.928726] skb_put+0x74/0x80 [ 705.931772] oa_tc6_update_rx_skb+0x44/0x98 [oa_tc6_mod] [ 705.937084] oa_tc6_macphy_threaded_irq+0x3f4/0x900 [oa_tc6_mod] [ 705.943084] irq_thread_fn+0x34/0xb8 [ 705.946654] irq_thread+0x1a0/0x300 [ 705.950134] kthread+0x138/0x150 [ 705.953356] ret_from_fork+0x10/0x20 Signed-off-by: Selvamani Rajagopal <redacted> --- Changes in v4: - As disable_traffic means device is uselss unless driver re-loaded, all tx queues are turned off. - Process all the received chunks on buffer overflow, as long as data chunks doesn't have any error bits set in their footer. - Added spin lock protection in every place wait_tx_skb is used. - Carrier is not turned off on disable_traffic. - Link to v3: https://lore.kernel.org/r/20260705-fix-race-condition-and-crash-v3-0-3e51841e4d08@onsemi.com (local) Changes in v3: - Cover all the instances of disable_traffic flag with spin lock to serialize the access - Disabling the tx queue and mark the carrier off when disable_traffic is set. - Continue processing received chunks on buffer overflow error and "out of skb" error. - Link to v2: https://lore.kernel.org/r/20260626-fix-race-condition-and-crash-v2-0-b6c5c10e604f@onsemi.com (local) Changes in v2: - Improvment to how error -EAGAIN is handled. Took care of couple of use cases where start_bit and end_bit may be missing or repeated due to lost data chunks. - Protected handling of waiting_tx_skb pointer with spin lock - Link to v1: https://lore.kernel.org/r/20260621-fix-race-condition-and-crash-v1-0-87e290d9357f@onsemi.com (local) --- Selvamani Rajagopal (3): net: ethernet: oa_tc6: Protect skb pointer used by two different kernel instances net: ethernet: oa_tc6: Improvements to error recovery net: ethernet: oa_tc6: Disabled tx queues when disable_traffic is set drivers/net/ethernet/oa_tc6.c | 236 +++++++++++++++++++++++++++++++----------- 1 file changed, 175 insertions(+), 61 deletions(-) --- base-commit: 1c975de3343cdef506f2eecc833cc1f14b0401c4 change-id: 20260621-fix-race-condition-and-crash-94d055a665c4 Best regards, -- Selvamani Rajagopal [off-list ref]