From: netdev-bot+sashiko@kernel.org
To: mmc@linux.ibm.com
Cc: netdev@vger.kernel.org, horms@kernel.org, davemarq@linux.ibm.com,
bjking1@linux.ibm.com, nnac123@linux.ibm.com,
maddy@linux.ibm.com, mpe@ellerman.id.au, npiggin@gmail.com,
chleroy@kernel.org, ritesh.list@gmail.com, sshegde@linux.ibm.com,
andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@kernel.org,
kuba@kernel.org, pabeni@redhat.com, stephen@networkplumber.org,
linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH net-next v2 4/8] ibmveth: step past bad RX correlators instead of spinning or oopsing
Date: Thu, 08 Oct 2026 21:08:43 +0000 [thread overview]
Message-ID: <179149372321.434549.3176990477501610987@kernel.org> (raw)
In-Reply-To: <26003e69cff6824798d289d67c163f868bfbefc1.1791178212.git.mmc@linux.ibm.com>
Thank you for your contribution! Sashiko AI review found 1 potential
issue(s) to consider.
Critical: 0 · High: 1 · Medium: 0 (1) · Low: 0
If you believe none of the issues are legitimate, please reply to each
issue of Medium severity or higher and explain why the AI is wrong.
If any of them are legitimate and you plan to respin, please let patchwork
know by including "pw-bot: cr" as a separate line at the end of your reply
(one such reply per series is enough).
- [High] net: NAPI list corruption and panic on bad RX correlator
Pre-existing issues:
- [Medium] Not introduced by this patch, but ibmveth_poll() takes the
frame offset (flags & IBMVETH_RXQ_OFF_MASK, up to 0xFFFF) and length…
--
ibmveth: step past bad RX correlators instead of spinning or oopsing
This patch moves RX correlator validation into one helper. The helper also
rejects pools that have no skbuff array, such as inactive pools. On a bad
slot, ibmveth_poll() now advances the RX ring, counts the drop in
rx_dropped and schedules a reset, and it logs with a ratelimited
netdev_err() instead of WARN_ON(). The patch also adds and extends KUnit
cases for these paths.
> diff --git a/drivers/net/ethernet/ibm/ibmveth.c b/drivers/net/ethernet/ibm/ibmveth.c
> index d269599f5a990..3bac6cabbbb4c 100644
> --- a/drivers/net/ethernet/ibm/ibmveth.c
> +++ b/drivers/net/ethernet/ibm/ibmveth.c
[ ... ]
> @@ -1515,12 +1556,19 @@ static int ibmveth_poll(struct napi_struct *napi, int budget)
> if (rx_flush)
> ibmveth_flush_buffer(skb->data,
> length + offset);
> - if (unlikely(ibmveth_rxq_harvest_buffer(adapter, true)))
> + rc = ibmveth_rxq_harvest_buffer(adapter, true);
> + if (unlikely(rc)) {
> + dev_kfree_skb_any(new_skb);
> + netdev->stats.rx_dropped++;
> break;
> + }
> skb = new_skb;
> } else {
> - if (unlikely(ibmveth_rxq_harvest_buffer(adapter, false)))
> + rc = ibmveth_rxq_harvest_buffer(adapter, false);
> + if (unlikely(rc)) {
> + netdev->stats.rx_dropped++;
> break;
> + }
> skb_reserve(skb, offset);
> }
>
[Severity: High]
Now that the ring is advanced before each of these break statements,
can ibmveth_poll() leave the loop with descriptors still pending and
go down the completion path before the budget is used up?
After the break, frames_processed is below budget, so poll calls
napi_complete_done(), re-enables the interrupt with h_vio_signal() and
then finds ibmveth_rxq_pending_buffer() true for the next slot. It
calls napi_schedule() and jumps to restart_poll without resetting
frames_processed.
If the restarted loop then uses the rest of the budget, ibmveth_poll()
returns budget after it has already rescheduled itself. The NAPI core
expects a driver that consumes its whole budget to leave the NAPI
state alone.
In net_rx_action(), __napi_poll() catches this and only prints the
"Budget exhausted after napi rescheduled" warning. However,
busy_poll_stop() calls __napi_schedule() whenever poll returns
budget. Would that put napi->poll_list on the per-CPU poll list a
second time and corrupt it?
A burst of traffic right behind a single bad correlator would be
enough to get there.
The !ibmveth_rxq_buffer_valid() recycle path already keeps looping
after it harvests a slot. Now that the ring is advanced on every
error, is there still a reason to break here rather than continue
with the next slot?
The same restart_poll sequence can already return budget today if a
burst arrives right after the interrupt is re-enabled. Should the
restart also avoid returning the full budget once napi_schedule()
has succeeded?
[Severity: Medium]
This is a pre-existing issue, not one introduced by this patch. The patch
hardens ibmveth_poll() against bad correlators from PHYP, so should the
frame offset and length from the same RX descriptor be checked as well?
ibmveth_poll() reads both values straight from the queue entry:
int length = ibmveth_rxq_frame_length(adapter);
int offset = ibmveth_rxq_frame_offset(adapter);
offset is flags_off & IBMVETH_RXQ_OFF_MASK, so it can be up to 0xFFFF.
length is a full be32. Neither is compared against
rx_buff_pool[pool].buff_size.
On the rx_copybreak path:
skb_copy_to_linear_data(new_skb,
skb->data + offset,
length);
Can this read past the end of the RX buffer? If so, nearby heap memory
would be copied into a packet that is passed up the stack.
On the non-copybreak path:
skb_reserve(skb, offset);
...
skb_put(skb, length);
If offset + length is too large, would this reach skb_over_panic() and
BUG() in softirq context?
As with the bad correlator case, this can only happen if PHYP reports an
offset or length larger than the buffer it was given.
--
Sashiko AI review · https://netdev-ai.bots.linux.dev/sashiko/#/patchset/cover.1791178212.git.mmc%40linux.ibm.com
next prev parent reply other threads:[~2026-10-08 21:08 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-05 6:06 [PATCH net-next v2 0/8] ibmveth: fix hangs, use-after-frees and netpoll races Mingming Cao
2026-10-05 6:06 ` Mingming Cao
2026-10-05 6:06 ` [PATCH net-next v2 1/8] ibmveth: fix netpoll races with RX replenish Mingming Cao
2026-10-05 6:06 ` [PATCH net-next v2 2/8] ibmveth: do not close twice after a failed reopen Mingming Cao
2026-10-05 6:06 ` [PATCH net-next v2 3/8] ibmveth: disable the reset work before unregister in remove Mingming Cao
2026-10-05 6:06 ` [PATCH net-next v2 4/8] ibmveth: step past bad RX correlators instead of spinning or oopsing Mingming Cao
2026-10-08 21:08 ` netdev-bot+sashiko [this message]
2026-10-08 22:04 ` mingming cao
2026-10-05 6:06 ` [PATCH net-next v2 5/8] ibmveth: release the pool kobjects when probe fails Mingming Cao
2026-10-05 6:06 ` [PATCH net-next v2 6/8] ibmveth: return the error when set_channels cannot add TX queues Mingming Cao
2026-10-05 6:06 ` [PATCH net-next v2 7/8] ibmveth: wait for in-flight transmits in ibmveth_close() Mingming Cao
2026-10-05 6:06 ` [PATCH net-next v2 8/8] ibmveth: wait for the RX poll to return before freeing the RX queue Mingming Cao
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=179149372321.434549.3176990477501610987@kernel.org \
--to=netdev-bot+sashiko@kernel.org \
--cc=andrew+netdev@lunn.ch \
--cc=bjking1@linux.ibm.com \
--cc=chleroy@kernel.org \
--cc=davem@davemloft.net \
--cc=davemarq@linux.ibm.com \
--cc=edumazet@kernel.org \
--cc=horms@kernel.org \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=maddy@linux.ibm.com \
--cc=mmc@linux.ibm.com \
--cc=mpe@ellerman.id.au \
--cc=netdev@vger.kernel.org \
--cc=nnac123@linux.ibm.com \
--cc=npiggin@gmail.com \
--cc=pabeni@redhat.com \
--cc=ritesh.list@gmail.com \
--cc=sshegde@linux.ibm.com \
--cc=stephen@networkplumber.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox