From: mingming cao <mmc@linux.ibm.com>
To: Jakub Kicinski <kuba@kernel.org>
Cc: netdev@vger.kernel.org, horms@kernel.org, bjking1@linux.ibm.com,
haren@linux.ibm.com, ricklind@linux.ibm.com, edumazet@google.com,
pabeni@redhat.com, davem@davemloft.net,
linuxppc-dev@lists.ozlabs.org, maddy@linux.ibm.com,
mpe@ellerman.id.au, simon.horman@corigine.com,
shaik.abdulla1@ibm.com, davemarq@linux.ibm.com
Subject: Re: [PATCH net-next v4 05/14] ibmveth: Refactor RX interrupt control for MQ RX queues
Date: Mon, 10 Aug 2026 15:07:15 -0700 [thread overview]
Message-ID: <9ab40b36-8c2f-4207-b2a9-6bc280811781@linux.ibm.com> (raw)
In-Reply-To: <20260806183703.3175289-1-kuba@kernel.org>
On 8/6/26 11:37 AM, Jakub Kicinski wrote:
> This is an AI-generated review of your patch. The human sending this
> email has considered the AI review valid, or at least plausible.
> ---
> ibmveth: Refactor RX interrupt control for MQ RX queues
>
> This patch introduces queue-indexed RX interrupt helpers (toggle/enable/
> disable, setup/cleanup, schedule) and wires them into open(), close(),
> poll(), the IRQ handler and the process-context RX kick paths. request_irq()
> now passes &adapter->napi[i] as the cookie so the handler can derive the
> queue index, and napi_enable()/napi_disable() move into the new setup and
> cleanup helpers. Runtime behaviour stays single-queue.
>
> A few questions below.
Hi Jakub,
Thanks for the review.
>> diff --git a/drivers/net/ethernet/ibm/ibmveth.c b/drivers/net/ethernet/ibm/ibmveth.c
>> index 7a2ed49cad4f1..664169c4d27a4 100644
>> --- a/drivers/net/ethernet/ibm/ibmveth.c
>> +++ b/drivers/net/ethernet/ibm/ibmveth.c
> [ ... ]
>
>> @@ -329,6 +331,203 @@ ibmveth_cleanup_rx_resources(struct ibmveth_adapter *adapter)
>> }
>> }
>>
>> +/**
>> + * ibmveth_toggle_irq - Common helper to enable/disable queue interrupts
>> + * @adapter: ibmveth adapter structure
>> + * @queue_index: Index of the queue (0 for primary, 1+ for subordinate)
>> + * @enable: true to enable, false to disable
>> + *
>> + * For queue 0 (primary), uses h_vio_signal() as it's registered via
>> + * h_register_logical_lan(). For subordinate queues (1+), uses H_VIOCTL
>> + * with H_ENABLE/DISABLE_VIO_INTERRUPT for per-queue interrupt control.
>> + *
>> + * Return: 0 on success, error code otherwise
>> + */
>> +static int
>> +ibmveth_toggle_irq(struct ibmveth_adapter *adapter, int queue_index,
>> + bool enable)
>> +{
>> + unsigned long rc;
>> + unsigned long irq = adapter->queue_irq[queue_index];
>> + const char *action = enable ? "enable" : "disable";
>> +
>> + if (queue_index == 0) {
>> + /* Primary queue: use h_vio_signal() */
>> + rc = h_vio_signal(adapter->vdev->unit_address,
>> + enable ? VIO_IRQ_ENABLE : VIO_IRQ_DISABLE);
>> + } else {
>> + /* Subordinate queues: use H_VIOCTL with hardware IRQ */
>> + struct irq_data *irq_data = irq_get_irq_data(irq);
>> + irq_hw_number_t hwirq;
>> + u64 vioctl_cmd = enable ? H_ENABLE_VIO_INTERRUPT :
>> + H_DISABLE_VIO_INTERRUPT;
>> +
>> + if (!irq_data) {
>> + netdev_err(adapter->netdev,
>> + "Failed to get IRQ data for queue %d (virq=%lu)\n",
>> + queue_index, irq);
>> + return -EINVAL;
>> + }
>> +
>> + hwirq = irqd_to_hwirq(irq_data);
>> + rc = plpar_hcall_norets(H_VIOCTL,
>> + adapter->vdev->unit_address,
>> + vioctl_cmd,
>> + hwirq, 0, 0);
>> +
>> + if (rc == H_PARAMETER) {
>> + /* H_PARAMETER is non-fatal when IRQ is already in
>> + * the requested state.
>> + */
>> + netdev_warn_once(adapter->netdev,
>> + "H_VIOCTL %s IRQ returned H_PARAMETER for queue %d (hwirq=%lu)\n",
>> + action, queue_index, hwirq);
>> + return 0;
>> + }
> [Severity: Medium]
> Is folding H_PARAMETER into success correct for both directions here?
>
> hvcall.h documents H_PARAMETER as "Parameter invalid, out-of-range or
> conflicting", and ibmveth_toggle_irq() cannot distinguish "already in the
> requested state" from a bad hwirq, wrong unit address, or a queue that is no
> longer registered.
>
> In the enable direction the swallowed status bypasses the recovery in
> ibmveth_poll():
>
> lpar_rc = ibmveth_enable_irq(adapter, 0);
> if (WARN_ON(lpar_rc != H_SUCCESS)) {
> schedule_work(&adapter->work);
> goto out;
> }
>
> so NAPI can complete with the queue still masked at the hypervisor and
> nothing left to reschedule it, i.e. that queue stops receiving, with a
> single warn_once as the only trace.
>
> In the disable direction, ibmveth_schedule_rx_queue() goes on to
> __napi_schedule() and ibmveth_cleanup_rx_interrupts() goes on to
> synchronize_irq()/free_irq() while believing delivery is masked.
>
> For comparison, ibmvnic treats any non-zero rc from the same hypercalls as
> an error in both directions, in disable_scrq_irq() and enable_scrq_irq().
>
> The branch is dead in this commit (num_rx_queues is 1), but it becomes live
> once the MQ patches land, where setup, resize and poll all depend on this
> return value. Would restricting the folding to the disable direction, plus a
> rate-limited per-queue message instead of netdev_warn_once(), be closer to
> the intent?
Agreed. Treating `H_PARAMETER` as success on the enable side is wrong.
For the disable side, I do not want to assume it is harmless without
firmer justification, so if any special handling remains there I will
make it explicit and better diagnosed rather than silently folding it
away.
>> + }
>> +
>> + if (rc)
>> + netdev_err(adapter->netdev,
>> + "Failed to %s IRQ for queue %d, rc=%ld\n",
>> + action, queue_index, rc);
>> + return rc;
>> +}
> [Severity: Medium]
> Does this mix two error domains in one int return?
>
> rc holds an unsigned long hypervisor status from h_vio_signal() or
> plpar_hcall_norets() (H_BUSY 1, H_HARDWARE -1, H_FUNCTION -2, H_PARAMETER
> -4), truncated to int on return, while the irq_get_irq_data() failure path
> returns -EINVAL.
>
> The callers then disagree about what they got. ibmveth_schedule_rx_queue()
> and ibmveth_poll() do:
>
> unsigned long lpar_rc;
> lpar_rc = ibmveth_disable_irq(adapter, qindex);
> WARN_ON(lpar_rc != H_SUCCESS);
>
> while ibmveth_setup_rx_interrupts()/ibmveth_open() treat the same value as
> an errno. One printk formats it with %ld, the other site logs it with %d.
>
> By the end of the series this reaches userspace: the scale-up loop in
> ibmveth_resize_rx_queues_incremental() does
>
> rc = ibmveth_enable_irq(adapter, i);
> if (rc) { ... goto cleanup_new_queues; }
>
> and cleanup_new_queues ends with return rc, which flows through
> ibmveth_resize_rx_channels() -> ibmveth_set_channels() to ethtool. H_PARAMETER
> (-4) then surfaces as -EINTR, and H_BUSY (1) or H_CLOSED (2) as a positive
> return that ethtool reads as success even though the queue count was rolled
> back.
>
> Since this commit establishes the helper API for the whole series, would it
> make sense to settle the convention now, either normalizing to errno or
> keeping the raw hcall status with a matching type, name, kernel-doc and
> format specifier?
>
> [ ... ]
Agreed. These helpers should return one error domain only. In v5 I will
keep the IRQ helper contract errno-based so later resize /
ethtool-facing paths do not have to interpret mixed H_*/errno returns.
>> +/**
>> + * ibmveth_setup_rx_interrupts - Register IRQs and enable NAPI
>> + * @adapter: ibmveth adapter structure
>> + *
>> + * Registers interrupt handlers for all RX queues and enables NAPI polling.
>> + * On error, cleans up any successfully registered IRQs before returning.
>> + *
>> + * Return: 0 on success, negative error code on failure
>> + */
>> +static int
>> +ibmveth_setup_rx_interrupts(struct ibmveth_adapter *adapter)
>> +{
>> + struct net_device *netdev = adapter->netdev;
>> + int i, rc;
>> +
>> + for (i = 0; i < adapter->num_rx_queues; i++) {
>> + if (!adapter->queue_irq[i]) {
>> + netdev_err(netdev, "queue %d has invalid IRQ (0)\n", i);
>> + rc = -EINVAL;
>> + goto err_free_irqs;
>> + }
>> +
>> + rc = request_irq(adapter->queue_irq[i], ibmveth_interrupt,
>> + 0, netdev->name, &adapter->napi[i]);
>> + if (rc) {
>> + netdev_err(netdev,
>> + "request_irq() failed for irq 0x%x queue %d: %d\n",
>> + adapter->queue_irq[i], i, rc);
>> + goto err_free_irqs;
>> + }
>> + }
>> +
>> + for (i = 0; i < adapter->num_rx_queues; i++)
>> + napi_enable(&adapter->napi[i]);
> [Severity: Medium]
> Can an interrupt arrive in the window between these two loops?
>
> request_irq() unmasks the virq via irq_startup(), and the LAN is already
> registered with the hypervisor by the time ibmveth_setup_rx_interrupts()
> runs, yet NAPI is only enabled in the second loop. Previously
> napi_enable(&adapter->napi[0]) was the first statement of ibmveth_open(), so
> this window did not exist.
>
> If an interrupt (including one latched at the controller while the line was
> shut down by the previous close's free_irq()) is delivered inside the
> window, ibmveth_interrupt() -> ibmveth_schedule_rx_queue() finds
> napi_schedule_prep() failing:
>
> if (napi_schedule_prep(napi)) {
> lpar_rc = ibmveth_disable_irq(adapter, qindex);
> WARN_ON(lpar_rc != H_SUCCESS);
> __napi_schedule(napi);
> }
>
> so nothing is scheduled and nothing is masked, while the handler still
> returns IRQ_HANDLED. For a level-asserted hypervisor source that repeats
> until napi_enable() runs.
>
> This is also the inverse of the invariant the later scale-up path in this
> series states, "publish -> replenish -> napi_enable -> enable_irq ... so
> ibmveth_interrupt() cannot run on an unpublished, empty, or NAPI-disabled
> queue". Would enabling a queue's NAPI before installing its handler restore
> that ordering?
I agree the ordering needs to be coherent. Open and scale-up are not
identical cases, and the ordering here came from keeping the tested open
path with PHYP delivery still masked until `ibmveth_enable_irq()`. I
will clarify that invariant in the changelog and make sure the
open-path comments do not overstate it.
>> +
>> + return 0;
>> +
>> +err_free_irqs:
>> + while (--i >= 0)
>> + free_irq(adapter->queue_irq[i], &adapter->napi[i]);
>> + return rc;
>> +}
>> +
>> +/**
>> + * ibmveth_cleanup_rx_interrupts - Mask PHYP, disable NAPI, free IRQs
>> + * @adapter: ibmveth adapter structure
>> + *
>> + * Tears down RX interrupt delivery for all queues. Mask PHYP before
>> + * napi_disable so ibmveth_interrupt cannot return IRQ_HANDLED without
>> + * masking (same storm window as scale-down). Safe for close and for
>> + * open failure after setup_rx_interrupts() already unmasked PHYP.
>> + */
> [Severity: Low]
> Do these comments describe what the commit actually does?
>
> "Safe for close and for open failure after setup_rx_interrupts() already
> unmasked PHYP" - ibmveth_setup_rx_interrupts() only does request_irq() and
> napi_enable(), and the changelog agrees ("setup does not yet unmask PHYP").
> No ibmveth_open() failure path calls this helper either; setup rolls back
> through its own err_free_irqs label and open goes to
> out_free_buffer_pools/out_free_tx_ltb/out.
>
> "Mask PHYP before napi_disable so ibmveth_interrupt cannot return
> IRQ_HANDLED without masking" - see the question on the mask/napi_disable
> ordering below; an in-flight ibmveth_poll() can undo the mask.
>
> "Dispose IRQ mappings for subordinate queues (1-15)" sits above a loop that
> starts at 1, but ibmveth.h defines IBMVETH_MAX_RX_QUEUES as 1U and
> num_rx_queues is set to IBMVETH_DEFAULT_RX_QUEUES, so the loop cannot
> iterate in this commit.
>
> And ibmveth_toggle_irq()'s "Return: 0 on success, error code otherwise"
> conflicts with returning raw H_* codes that callers compare against
> H_SUCCESS.
>
> The first and third become accurate later in the series; the second and
> fourth remain as they are. Could the comments be trimmed to what this
> commit provides?
Agreed. I will trim the kerneldoc/comments so they match the actual
behavior in this patch rather than describing stronger later-series
guarantees.
>> +static void
>> +ibmveth_cleanup_rx_interrupts(struct ibmveth_adapter *adapter)
>> +{
>> + int i;
>> +
>> + for (i = 0; i < adapter->num_rx_queues; i++) {
>> + if (adapter->queue_irq[i]) {
>> + ibmveth_disable_irq(adapter, i);
>> + synchronize_irq(adapter->queue_irq[i]);
>> + }
>> + }
> [Severity: Medium]
> Can a running poll undo this mask before free_irq()?
>
> synchronize_irq() waits for the hardirq handler only, not for an
> ibmveth_poll() already running in softirq context, and that poll
> unconditionally re-arms delivery on its completion path:
>
> lpar_rc = ibmveth_enable_irq(adapter, 0);
>
> Sequence with RX traffic flowing during "ip link set ethN down":
>
> CPU0 ibmveth_close() -> ibmveth_cleanup_rx_interrupts()
> ibmveth_disable_irq(adapter, 0); /* PHYP masked */
> synchronize_irq(queue_irq[0]); /* no hardirq running */
> napi_disable(&adapter->napi[0]); /* blocks on the poll */
>
> CPU1 softirq ibmveth_poll()
> lpar_rc = ibmveth_enable_irq(adapter, 0); /* PHYP unmasked */
> napi_complete_done(...)
>
> CPU0 then resumes and calls free_irq() with the source unmasked, and nothing
> re-checks or re-masks after napi_disable(). If an interrupt lands in that
> window, ibmveth_interrupt() -> ibmveth_schedule_rx_queue() takes the
> napi_schedule_prep() failure path, so no mask is applied while the handler
> still returns IRQ_HANDLED - the storm window the new kernel-doc says this
> ordering avoids. The window is bounded by the following free_irq(), but the
> teardown no longer reliably ends with the source masked.
>
> Should ibmveth_poll() avoid re-enabling while teardown is in progress, or
> should cleanup re-mask after napi_disable()?
Agreed. That teardown race is real. Later shutdown/quiesce fixes stop
poll from re-enabling delivery while teardown is in progress, and I
will fold that behavior back into the owning path rather than leaving it
as a tail fixup.
>> +
>> + for (i = 0; i < adapter->num_rx_queues; i++)
>> + napi_disable(&adapter->napi[i]);
>> +
>> + for (i = 0; i < adapter->num_rx_queues; i++) {
>> + if (adapter->queue_irq[i])
>> + free_irq(adapter->queue_irq[i], &adapter->napi[i]);
>> + }
> [Severity: High]
> This isn't a bug introduced by this patch, but the refactor makes the
> unbalanced teardown harder to see and hands the same invariant to the rest
> of the series, so it seems worth raising here.
>
> napi_disable() runs unconditionally for every queue, and free_irq() is gated
> only on queue_irq[i]. After a failed ibmveth_open() that leaves the
> interface administratively up, NAPI was never enabled and no handler was
> installed, yet both run on the next ndo_stop.
>
> napi_disable_locked() does:
>
> while (val & (NAPIF_STATE_SCHED | NAPIF_STATE_NPSVC))
> usleep_range(20, 200);
>
> and sets SCHED|NPSVC when it completes, so a second napi_disable() with no
> intervening napi_enable() loops forever, under rtnl_lock() plus the netdev
> lock. free_irq() on a never-requested IRQ additionally warns with "Trying to
> free already-free IRQ".
>
> Trigger in this tree: veth_pool_store() calls ibmveth_close() and then
> ibmveth_open() directly; if open fails (-ENOMEM from
> ibmveth_alloc_rx_queues(), -ENONET from ibmveth_register_logical_lan(), or
> request_irq() failure inside ibmveth_setup_rx_interrupts()) it restores the
> pool values and returns the error with the netdev still up. The same
> close()/open() pattern exists in ibmveth_set_csum_offload() and
> ibmveth_set_tso(). A later "ip link set dev ethN down" then reaches
> ibmveth_cleanup_rx_interrupts() and hangs.
>
> In the baseline, open() did napi_enable() at entry and napi_disable() at
> out:, and close() called free_irq(netdev->irq, netdev) unconditionally, so
> the same hang existed. What changes here is that queue_irq[0] is published
> in open() before request_irq() can succeed and is deliberately never
> cleared, so the new "if (adapter->queue_irq[i])" guard means "we have a virq
> number", not "a handler is installed". Could the helper track whether
> napi_enable()/request_irq() actually ran for each queue?
Agreed. This one is high priority. The close/cleanup path needs explicit
state tracking so a second teardown after close()+failed-open does not
walk partially initialized state as if it were live. In v5 I will keep
the `opened` / `rx_irq_setup` state tracking so cleanup is idempotent
and resize/open paths key off real setup state rather than bare
`IFF_UP`.
>> +
>> + /* Dispose IRQ mappings for subordinate queues (1-15).
>> + * Queue 0 uses netdev->irq from device tree, not irq_create_mapping().
>> + */
>> + for (i = 1; i < adapter->num_rx_queues; i++) {
>> + if (adapter->queue_irq[i]) {
>> + irq_dispose_mapping(adapter->queue_irq[i]);
>> + adapter->queue_irq[i] = 0;
>> + }
>> + }
>> +
>> + /* Queue 0 uses netdev->irq; leave queue_irq[0] for next open. */
>> +}
>> +
>> +/**
>> + * ibmveth_schedule_rx_queue - Mask PHYP IRQ and schedule NAPI for one RX queue
>> + * @adapter: ibmveth adapter structure
>> + * @qindex: RX queue index
>> + *
>> + * Shared by the IRQ handler and process-context kick paths (open, resume,
>> + * pool sysfs, netpoll). Keep ibmveth_interrupt() as the IRQ-only wrapper.
>> + */
>> +static void ibmveth_schedule_rx_queue(struct ibmveth_adapter *adapter,
>> + int qindex)
>> +{
>> + struct napi_struct *napi = &adapter->napi[qindex];
>> + unsigned long lpar_rc;
>> +
>> + if (WARN_ON(qindex < 0 || qindex >= adapter->num_rx_queues))
>> + return;
>> +
>> + if (napi_schedule_prep(napi)) {
>> + lpar_rc = ibmveth_disable_irq(adapter, qindex);
>> + WARN_ON(lpar_rc != H_SUCCESS);
>> + __napi_schedule(napi);
>> + }
>> +}
>> +
>> /* setup the initial settings for a buffer pool */
>> static void ibmveth_init_buffer_pool(struct ibmveth_buff_pool *pool,
>> u32 pool_index, u32 pool_size,
>> @@ -947,8 +1146,6 @@ static int ibmveth_open(struct net_device *netdev)
>>
>> netdev_dbg(netdev, "open starting\n");
>>
>> - napi_enable(&adapter->napi[0]);
>> -
>> for (i = 0; i < IBMVETH_NUM_BUFF_POOLS; i++)
>> rxq_entries += adapter->rx_buff_pool[0][i].size;
>>
>> @@ -972,7 +1169,8 @@ static int ibmveth_open(struct net_device *netdev)
>> adapter->rx_queue[0].queue_len;
>> rxq_desc.fields.address = adapter->rx_queue[0].queue_dma;
>>
>> - h_vio_signal(adapter->vdev->unit_address, VIO_IRQ_DISABLE);
>> + adapter->queue_irq[0] = netdev->irq;
>> + ibmveth_disable_irq(adapter, 0);
> Related to the teardown question above: queue_irq[0] is published here,
> before h_register_logical_lan(), the buffer pool allocation and
> request_irq(), and it is never cleared on any failure path.
>
>>
>> lpar_rc = ibmveth_register_logical_lan(adapter, rxq_desc, mac_address);
>>
>> @@ -993,21 +1191,16 @@ static int ibmveth_open(struct net_device *netdev)
>> if (rc)
>> goto out_free_tx_ltb;
>>
>> - netdev_dbg(netdev, "registering irq 0x%x\n", netdev->irq);
>> - rc = request_irq(netdev->irq, ibmveth_interrupt, 0, netdev->name,
>> - netdev);
>> - if (rc != 0) {
>> - netdev_err(netdev, "unable to request irq 0x%x, rc %d\n",
>> - netdev->irq, rc);
>> + rc = ibmveth_setup_rx_interrupts(adapter);
>> + if (rc) {
>> do {
>> lpar_rc = h_free_logical_lan(adapter->vdev->unit_address);
>> } while (H_IS_LONG_BUSY(lpar_rc) || (lpar_rc == H_BUSY));
>> -
>> goto out_free_buffer_pools;
>> }
>>
>> netdev_dbg(netdev, "initial replenish cycle\n");
>> - ibmveth_interrupt(netdev->irq, netdev);
>> + ibmveth_schedule_rx_queue(adapter, 0);
>>
>> netif_tx_start_all_queues(netdev);
>>
>> @@ -1024,7 +1217,6 @@ static int ibmveth_open(struct net_device *netdev)
>> out_free_filter_list:
>> ibmveth_free_filter_list(adapter);
>> out:
>> - napi_disable(&adapter->napi[0]);
>> return rc;
>> }
>>
>> @@ -1036,11 +1228,10 @@ static int ibmveth_close(struct net_device *netdev)
>>
>> netdev_dbg(netdev, "close starting\n");
>>
>> - napi_disable(&adapter->napi[0]);
>> -
>> netif_tx_stop_all_queues(netdev);
>>
>> - h_vio_signal(adapter->vdev->unit_address, VIO_IRQ_DISABLE);
>> + /* PHYP mask + napi_disable + free_irq live in cleanup_rx_interrupts */
>> + ibmveth_cleanup_rx_interrupts(adapter);
>>
>> do {
>> lpar_rc = h_free_logical_lan(adapter->vdev->unit_address);
>> @@ -1051,8 +1242,6 @@ static int ibmveth_close(struct net_device *netdev)
>> "continuing with close\n", lpar_rc);
>> }
>>
>> - free_irq(netdev->irq, netdev);
>> -
> Also part of the teardown question: free_irq() now happens inside
> ibmveth_cleanup_rx_interrupts(), i.e. before h_free_logical_lan(), where the
> baseline order was napi_disable -> tx stop -> h_vio_signal(DISABLE) ->
> h_free_logical_lan -> free_irq. The changelog mentions the mask/napi_disable
> reordering but not this one. Was the free_irq/h_free_logical_lan inversion
> intended?
That ordering is intentional. Once PHYP delivery is masked, the Linux
handler is no longer needed for `h_free_logical_lan()`, and freeing the
IRQ first avoids leaving a handler around while the LAN handles are
being torn down. The separate `queue_irq[0]` point is the lifecycle
issue above: it can mean "have a virq number" before `request_irq()`
succeeds, which is why cleanup needs `rx_irq_setup` / `opened` rather
than `queue_irq[]` alone. I will call that ordering out in the
changelog.
>> ibmveth_update_rx_no_buffer(adapter);
>>
>> ibmveth_free_buffer_pools(adapter);
>> @@ -1798,15 +1987,14 @@ static int ibmveth_poll(struct napi_struct *napi, int budget)
>> /* We think we are done - reenable interrupts,
>> * then check once more to make sure we are done.
>> */
>> - lpar_rc = h_vio_signal(adapter->vdev->unit_address, VIO_IRQ_ENABLE);
>> + lpar_rc = ibmveth_enable_irq(adapter, 0);
>> if (WARN_ON(lpar_rc != H_SUCCESS)) {
>> schedule_work(&adapter->work);
>> goto out;
>> }
>>
>> if (ibmveth_rxq_pending_buffer(adapter) && napi_schedule(napi)) {
>> - lpar_rc = h_vio_signal(adapter->vdev->unit_address,
>> - VIO_IRQ_DISABLE);
>> + lpar_rc = ibmveth_disable_irq(adapter, 0);
>> goto restart_poll;
>> }
>>
> [ ... ]
>
> Cross-instance finding from sashiko-gemini (e3f4ca1fbf9d3f3114fde9e903e88e76f2f763bdede83ba454f20f9e157db105):
> [Severity: Medium]
> Incomplete Refactoring / Future Out-of-Bounds Access in ibmveth_poll
Agreed that the poll-side MQ wiring needed follow-up hardening, but I do
not want to overclaim that as fully owned by patch 5. The queue-index /
completion cleanup belongs with the later poll-path work, so I would
treat that as a follow-on fix rather than claim it is resolved here.
Thanks again for the detailed review,
Mingming
next prev parent reply other threads:[~2026-08-10 22:07 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-31 0:47 [PATCH net-next v4 00/14] ibmveth: Add multi-queue RX support Mingming Cao
2026-07-31 0:47 ` [PATCH net-next v4 01/14] ibmveth: Add MQ RX hypercall wrappers and call definitions Mingming Cao
2026-08-06 18:36 ` Jakub Kicinski
2026-08-10 19:19 ` mingming cao
2026-07-31 0:47 ` [PATCH net-next v4 02/14] ibmveth: Prepare MQ RX adapter data structures Mingming Cao
2026-08-06 18:36 ` Jakub Kicinski
2026-08-10 19:40 ` mingming cao
2026-07-31 0:47 ` [PATCH net-next v4 03/14] ibmveth: Refactor RX resource allocation for MQ RX bring-up Mingming Cao
2026-08-06 18:37 ` Jakub Kicinski
2026-08-10 20:44 ` mingming cao
2026-07-31 0:47 ` [PATCH net-next v4 04/14] ibmveth: Refactor buffer pool management for per-queue MQ RX Mingming Cao
2026-08-06 18:37 ` Jakub Kicinski
2026-08-10 21:11 ` mingming cao
2026-07-31 0:47 ` [PATCH net-next v4 05/14] ibmveth: Refactor RX interrupt control for MQ RX queues Mingming Cao
2026-08-06 18:37 ` Jakub Kicinski
2026-08-10 22:07 ` mingming cao [this message]
2026-07-31 0:47 ` [PATCH net-next v4 06/14] ibmveth: Refactor TX resource allocation in open/close paths Mingming Cao
2026-08-06 18:37 ` Jakub Kicinski
2026-08-10 22:21 ` mingming cao
2026-07-31 0:47 ` [PATCH net-next v4 07/14] ibmveth: Add RX queue register/deregister helpers for MQ Mingming Cao
2026-08-06 18:37 ` Jakub Kicinski
2026-08-10 22:32 ` mingming cao
2026-07-31 0:47 ` [PATCH net-next v4 08/14] ibmveth: Add queue-aware RX buffer submit helper " Mingming Cao
2026-08-06 18:37 ` Jakub Kicinski
2026-08-10 22:51 ` mingming cao
2026-07-31 0:47 ` [PATCH net-next v4 09/14] ibmveth: Enable multi-queue RX receive path Mingming Cao
2026-08-06 18:37 ` Jakub Kicinski
2026-08-10 23:28 ` mingming cao
2026-07-31 0:47 ` [PATCH net-next v4 10/14] ibmveth: Add per-queue RX and TX statistics collection Mingming Cao
2026-08-06 18:37 ` Jakub Kicinski
2026-08-10 23:42 ` mingming cao
2026-07-31 0:47 ` [PATCH net-next v4 11/14] ibmveth: Expose per-queue buffer pool details via debugfs Mingming Cao
2026-08-06 18:37 ` Jakub Kicinski
2026-08-10 23:53 ` mingming cao
2026-07-31 0:47 ` [PATCH net-next v4 12/14] ibmveth: Implement incremental MQ RX queue resize Mingming Cao
2026-08-06 18:37 ` Jakub Kicinski
2026-08-11 1:21 ` mingming cao
2026-07-31 0:47 ` [PATCH net-next v4 13/14] ibmveth: Wire ethtool set_channels to " Mingming Cao
2026-08-06 18:37 ` Jakub Kicinski
2026-08-11 2:47 ` mingming cao
2026-07-31 0:47 ` [PATCH net-next v4 14/14] ibmveth: Fix MQ RX poll and shutdown hangs after " Mingming Cao
2026-08-06 18:37 ` Jakub Kicinski
2026-08-06 18:49 ` Jakub Kicinski
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=9ab40b36-8c2f-4207-b2a9-6bc280811781@linux.ibm.com \
--to=mmc@linux.ibm.com \
--cc=bjking1@linux.ibm.com \
--cc=davem@davemloft.net \
--cc=davemarq@linux.ibm.com \
--cc=edumazet@google.com \
--cc=haren@linux.ibm.com \
--cc=horms@kernel.org \
--cc=kuba@kernel.org \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=maddy@linux.ibm.com \
--cc=mpe@ellerman.id.au \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=ricklind@linux.ibm.com \
--cc=shaik.abdulla1@ibm.com \
--cc=simon.horman@corigine.com \
/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