From: sashiko-bot@kernel.org
To: "Yangyu Chen" <cyy@cyyself.name>
Cc: bpf@vger.kernel.org
Subject: Re: [PATCH net 2/2] net: atlantic: free RX pages of consumed but not refilled buffers
Date: Mon, 03 Aug 2026 15:46:52 +0000 [thread overview]
Message-ID: <20260803154652.CD4691F00A3A@smtp.kernel.org> (raw)
In-Reply-To: <tencent_607CBA8237DA438E36B844318B21538DE008@qq.com>
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
Pre-existing issues:
- [High] Malformed or oversized RX descriptor chains cause a permanent NAPI polling lockup or hard infinite loop.
--
--- Patch [2]: [PATCH net 2/2] net: atlantic: free RX pages of consumed but not refilled buffers ---
commit f13d9fd8fe93327bbe27469851140df3b966b786
Author: Yangyu Chen <cyy@cyyself.name>
net: atlantic: free RX pages of consumed but not refilled buffers
aq_ring_rx_deinit() only walks the region posted to hardware. Slots that
were consumed but not yet reposted sit in a gap with a live page, and the
deinit walk never visits them, causing a page and DMA mapping leak. This
patch walks the whole ring instead and releases whatever is still there.
Cc: stable@vger.kernel.org # v5.2+
> diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_ring.c b/drivers/net/ethernet/aquantia/atlantic/aq_ring.c
> index 81685a4dc5a6d..e1193c6719d9d 100644
> --- a/drivers/net/ethernet/aquantia/atlantic/aq_ring.c
> +++ b/drivers/net/ethernet/aquantia/atlantic/aq_ring.c
[ ... ]
> @@ -950,15 +950,29 @@ int aq_ring_rx_fill(struct aq_ring_s *self)
>
> void aq_ring_rx_deinit(struct aq_ring_s *self)
> {
[ ... ]
[Severity: High]
This is a pre-existing issue, but does the error handling in
__aq_ring_rx_clean() and __aq_ring_xdp_clean() cause a permanent NAPI polling
lockup or an infinite loop when processing malformed RX descriptors?
In __aq_ring_rx_clean(), if a descriptor chain is out of bounds or exceeds the
maximum fragment count, the function exits early without advancing sw_head:
drivers/net/ethernet/aquantia/atlantic/aq_ring.c:__aq_ring_rx_clean() {
...
if (buff_->next >= self->size) {
err = -EIO;
goto err_exit;
}
...
if (unlikely(!is_rsc_completed) ||
frag_cnt > MAX_SKB_FRAGS) {
err = 0;
goto err_exit;
}
...
}
Because sw_head is not advanced, wouldn't the next NAPI poll process the
exact same malformed descriptor again, resulting in an infinite NAPI polling
loop?
Additionally, in __aq_ring_xdp_clean(), there is a do-while loop that lacks a
fragment count limit:
drivers/net/ethernet/aquantia/atlantic/aq_ring.c:__aq_ring_xdp_clean() {
...
do {
if (buff_->next >= rx_ring->size) {
err = -EIO;
goto err_exit;
}
next_ = buff_->next;
buff_ = &rx_ring->buff_ring[next_];
is_rsc_completed =
aq_ring_dx_in_range(rx_ring->sw_head,
next_,
rx_ring->hw_head);
if (unlikely(!is_rsc_completed))
break;
buff->is_error |= buff_->is_error;
buff->is_cso_err |= buff_->is_cso_err;
} while (!buff_->is_eop);
...
}
If the descriptor chain is cyclic and within the valid range, could this
cause a hard infinite loop inside the softirq handler?
Also, if the index is out of bounds in __aq_ring_xdp_clean(), it jumps to
err_exit without advancing sw_head. Could this cause the same NAPI poll storm
as in __aq_ring_rx_clean()?
--
Sashiko AI review · https://sashiko.dev/#/patchset/tencent_29B860317921D68DE77C718242DA418EB608@qq.com?part=2
next prev parent reply other threads:[~2026-08-03 15:46 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-02 15:44 [PATCH net 0/2] net: atlantic: fix two ring teardown leaks Yangyu Chen
2026-08-02 15:46 ` [PATCH net 1/2] net: atlantic: free stranded TX buffers on ring deinit Yangyu Chen
2026-08-03 15:46 ` sashiko-bot
2026-08-03 18:31 ` Mina Almasry
2026-08-02 15:46 ` [PATCH net 2/2] net: atlantic: free RX pages of consumed but not refilled buffers Yangyu Chen
2026-08-03 15:46 ` sashiko-bot [this message]
2026-08-03 18:35 ` Mina Almasry
2026-08-05 1:20 ` [PATCH net 0/2] net: atlantic: fix two ring teardown leaks patchwork-bot+netdevbpf
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260803154652.CD4691F00A3A@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=cyy@cyyself.name \
--cc=sashiko-reviews@lists.linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.