From: mingming cao <mmc@linux.ibm.com>
To: netdev-bot+sashiko@kernel.org
Cc: netdev@vger.kernel.org, davem@davemloft.net, kuba@kernel.org,
horms@kernel.org, edumazet@google.com, pabeni@redhat.com,
andrew+netdev@lunn.ch, nnac123@linux.ibm.com,
maddy@linux.ibm.com, mpe@ellerman.id.au,
linuxppc-dev@lists.ozlabs.org, haren@linux.ibm.com,
ricklind@linux.ibm.com, davemarq@linux.ibm.com,
bjking1@linux.ibm.com, shaik.abdulla1@ibm.com
Subject: Re: [net-next,v6,05/15] ibmveth: Refactor RX interrupt control for MQ RX queues
Date: Thu, 24 Sep 2026 23:21:14 -0700 [thread overview]
Message-ID: <6415b44b-a525-4412-b200-8bfb4d43b82e@linux.ibm.com> (raw)
In-Reply-To: <178845903415.3394541.17814919508760286151@kernel.org>
Hi, Thanks for the view.
On 9/3/26 11:10 AM, netdev-bot+sashiko@kernel.org wrote:
> Thank you for your contribution! Sashiko AI review found 5 potential
> issue(s) to consider:
>
> Critical: 0 · High: 0 (1) · Medium: 3 · Low: 2
>
> - [Medium] A user-triggerable rtnl hang fix is bundled into a 400-line
> refactor with an incorrect justification for omitting a Fixes: tag.
> - [Medium] ibmveth_poll() re-arms the PHYP interrupt
> (ibmveth_enable_irq(), ibmveth.c:2123) only *after*…
> - [Medium] Teardown frees Linux IRQ handlers (and, on the MQ paths,
> disposes subordinate virq mappings) without ensuring PHYP delivery was…
> - [Low] Two permanent behavioural changes to ibmveth_close() are absent
> from the commit message: (a) ibmveth_update_rx_no_buffer() is moved…
> - [Low] Claimed: ibmveth_schedule_rx_queue()'s kernel-doc documents an
> out-of-range index as an ordinary `return false`, while the body…
>
> Pre-existing issues:
> - [High] Claimed: on the ibmveth_alloc_buffer_pools() failure path,
> ibmveth_open() jumps to out_free_tx_ltb without h_free_logical_lan(),…
>
> --
>
> 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 sites. It also adds
> two new adapter flags, opened and rx_irq_setup, that gate close/cleanup
> work. Runtime behaviour stays single-queue.
>
> A few questions below.
>
>> diff --git a/drivers/net/ethernet/ibm/ibmveth.c b/drivers/net/ethernet/ibm/ibmveth.c
>> index 37a6d13e603ea..335712faaa42a 100644
>> --- a/drivers/net/ethernet/ibm/ibmveth.c
>> +++ b/drivers/net/ethernet/ibm/ibmveth.c
> [ ... ]
>
>> @@ -338,6 +340,320 @@ ibmveth_cleanup_rx_resources(struct ibmveth_adapter *adapter)
>> }
>> }
>>
>> +/**
>> + * ibmveth_toggle_irq - Common helper to enable/disable queue interrupts
> [ ... ]
>
>> + /*
>> + * H_PARAMETER is ambiguous (already in requested state vs bad
>> + * args). Fold only on disable as an idempotent mask. On enable
>> + * keep it an error so a stuck-masked queue stays visible to
>> + * poll/resize recovery.
>> + */
>> + if (h_rc == H_PARAMETER && !enable) {
>> + dev_warn_ratelimited(&adapter->netdev->dev,
>> + "H_VIOCTL %s IRQ returned H_PARAMETER for queue %d (hwirq=%lu)\n",
>> + action, queue_index, hwirq);
>> + return 0;
>> + }
>> + }
>> +
>> + if (h_rc) {
>> + dev_err_ratelimited(&adapter->netdev->dev,
>> + "Failed to %s IRQ for queue %d, rc=0x%lx\n",
>> + action, queue_index, h_rc);
>> + return -EIO;
>> + }
>> + return 0;
>> +}
> [ ... ]
>
>> +static int
>> +ibmveth_setup_rx_interrupts(struct ibmveth_adapter *adapter)
>> +{
> [ ... ]
>
>> + if (adapter->multi_queue && num > 1) {
>> + for (i = 0; i < num; i++) {
>> + rc = ibmveth_enable_irq(adapter, i);
>> + if (rc) {
>> + netdev_err(netdev,
>> + "Failed to enable IRQ for queue %d, rc=%d\n",
>> + i, rc);
>> + for (; i >= 0; i--) {
>> + ibmveth_disable_irq(adapter, i);
>> + synchronize_irq(adapter->queue_irq[i]);
>> + }
>> + rc = -EIO;
>> + goto err_disable_napi;
>> + }
>> + }
>> + }
> [ ... ]
>
>> +err_disable_napi:
>> + /* STOP: remask after napi_disable; an in-flight poll can re-arm. */
>> + for (i = 0; i < num; i++)
>> + napi_disable(&adapter->napi[i]);
>> + for (i = 0; i < num; i++) {
>> + if (!adapter->queue_irq[i])
>> + continue;
>> + ibmveth_disable_irq(adapter, i);
>> + synchronize_irq(adapter->queue_irq[i]);
>> + }
>> + for (i = 0; i < num; i++) {
>> + if (adapter->queue_irq[i])
>> + free_irq(adapter->queue_irq[i], &adapter->napi[i]);
>> + }
>> + goto err_dispose_mappings;
> [ ... ]
>
>> +static void
>> +ibmveth_cleanup_rx_interrupts(struct ibmveth_adapter *adapter)
>> +{
>> + int i;
>> +
>> + if (!adapter->rx_irq_setup)
>> + return;
>> +
>> + for (i = 0; i < adapter->num_rx_queues; i++) {
>> + if (!adapter->queue_irq[i])
>> + continue;
>> + ibmveth_disable_irq(adapter, i);
>> + synchronize_irq(adapter->queue_irq[i]);
>> + }
>> +
>> + 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])
>> + continue;
>> + ibmveth_disable_irq(adapter, i);
>> + synchronize_irq(adapter->queue_irq[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: Medium]
> The commit message says cleanup "remasks and synchronizes again after it
> because an in-flight poll can re-arm". Does the second remask really close
> that window?
>
> ibmveth_poll() re-arms only after NAPI ownership has already been dropped:
>
> if (!napi_complete_done(napi, frames_processed))
> goto out;
> ...
> rc = ibmveth_enable_irq(adapter, 0);
>
> napi_disable() waits for NAPIF_STATE_SCHED / NAPIF_STATE_NPSVC to clear, not
> for the poll function to return, so this interleaving looks possible:
>
> CPU1 (softirq) CPU0 (ibmveth_close)
> ibmveth_poll()
> napi_complete_done()
> /* SCHED cleared */
> <delayed>
> ibmveth_cleanup_rx_interrupts()
> disable_irq + synchronize_irq
> napi_disable() /* returns at once */
> disable_irq + synchronize_irq
> free_irq()
> ibmveth_enable_irq(adapter, 0)
> That leaves PHYP delivery unmasked on a queue with no handler installed
> until h_free_logical_lan() runs. The synchronize_net() added in close()
> runs after free_irq(), so it cannot cover this either, and the
> err_disable_napi path above has the same shape.
No — not that window. napi_disable() only waits for
SCHED to clear, not for poll to return, so after
napi_complete_done() it can return at once. The
second remask then runs, and enable_irq can still
land after both remasks and after free_irq. PHYP
comes back up with no handler. synchronize_net()
is after free_irq, so it does not cover this
either. The second remask only catches a re-arm
that lands before it. v7 drops that overclaim from
the commit message.
> The ordering is unchanged at the end of the series; the poll_stopping()
> check added later is passed by CPU1 before CPU0 sets the teardown state.
> Would arming the interrupt before napi_complete_done(), or gating the arm
> on a teardown flag ordered with the mask, work better here?
The arm stays after napi_complete_done. Moving it
before would re-enable PHYP while this poll still
owns NAPI.
Patch 9 adds a stopping check after complete
(napi_disable pending, or the device is down).
That skips enable_irq when cleanup has already
started. It is not ordered with the PHYP mask,
and it does not close the hole if poll already
passed that check before napi_disable. I am
leaving that in Patch 9 rather than inverting
poll here. This teardown sequence pre-dates MQ,
and completely closing the late enable requires a
poll/teardown handshake (or an RCU grace period
before free_irq) across the driver, which is listed
under Known leftovers in the cover letter.
> [Severity: Medium]
> Both ibmveth_disable_irq() calls in this function discard their return
> value, and free_irq() below then runs unconditionally. In close(),
> h_free_logical_lan() now runs after free_irq(), where the baseline freed
> the LAN first and only then removed the handler.
>
> If the mask hcall did not take effect, can PHYP deliver an interrupt in the
> interval between free_irq() and h_free_logical_lan(), with no handler
> installed? synchronize_irq() only drains a handler that is already running;
> it does not stop the hypervisor source.
Yes. We ask PHYP to mask, then free_irq even if
that hcall failed, so a delivery can still land
before h_free. synchronize_irq only waits for a
handler that is already running.
> Related: ibmveth_toggle_irq() folds H_PARAMETER into success on the disable
> path, while its own comment says H_PARAMETER may mean bad arguments rather
> than "already in requested state", so teardown can treat a rejected mask as
> a completed one. The MQ rollback loop in ibmveth_setup_rx_interrupts() has
> the same unchecked-remask-then-free_irq pattern. I could not demonstrate
> these hcalls failing in practice, so this one may be theoretical.
I am keeping free_irq before h_free in this 15,
after we have issued the mask, because I do not
want ndo_stop to fail on a disable hcall. As you
said, this one may be theoretical.
>> +
>> + ibmveth_dispose_subordinate_irq_mappings(adapter);
>> +
>> + /* Queue 0 uses netdev->irq; leave queue_irq[0] for next open. */
>> + adapter->rx_irq_setup = false;
>> +}
>> +
>> +/**
>> + * 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 sites (open, resume,
>> + * pool sysfs, poll_controller).
>> + *
>> + * Return: true if napi_schedule_prep() succeeded and NAPI was scheduled.
>> + * Mask is attempted in that case; a failed disable_irq() is logged by the
>> + * helper and does not change the return (queue may still be unmasked).
>> + * false if the index is out of range or prep failed (including NAPI
>> + * already scheduled).
>> + */
>> +static bool ibmveth_schedule_rx_queue(struct ibmveth_adapter *adapter,
>> + int qindex)
>> +{
>> + struct napi_struct *napi = &adapter->napi[qindex];
>> +
>> + if (WARN_ON(qindex < 0 || qindex >= adapter->num_rx_queues))
>> + return false;
> [Severity: Low]
> This isn't a bug, but the kdoc and the body disagree. The kdoc describes an
> out-of-range index as an ordinary return:
>
> * false if the index is out of range or prep failed (including NAPI
> * already scheduled).
>
> while the body splats on it. ibmveth_interrupt() documents the opposite for
> the same condition:
>
> /*
> * Quiet on out-of-range: teardown can leave a residual IRQ after the
> * live count drops. Do not WARN-storm; return IRQ_NONE until free_irq.
> */
>
> A later patch in the series changes this helper to WARN only on qindex < 0
> and to return false quietly when qindex is past the live queue count. Could
> that form be used from the start?
>
> The napi pointer is also formed from qindex before the range check; it is
> never dereferenced before the check, but computing it afterwards would read
> more clearly.
Thanks. v7 rewords the kdoc to match this helper: out of
range is WARN_ON, then false.
The helper keeps the WARN form here rather than the
later quiet one. At this commit num_rx_queues does not shrink,
so >= num is still a driver bug and the WARN is useful.
interrupt() already returns IRQ_NONE before it calls
this helper, so a residual IRQ does not hit the splat.
The quiet >= live path becomes the right one when
resize can publish a lower count; that is Patch 14.
>> +
>> + /*
>> + * Only mask PHYP when NAPI will run. Masking on prep failure can
>> + * race a completing poll that already re-enabled the queue, leaving
>> + * NAPI idle with the IRQ masked (TX works, RX stalls) until reload.
>> + * Storm prevention on teardown remains in cleanup/disable paths.
>> + */
>> + if (napi_schedule_prep(napi)) {
>> + /* Failure is already logged with the hcall rc by the helper. */
>> + ibmveth_disable_irq(adapter, qindex);
>> + __napi_schedule(napi);
>> + return true;
>> + }
>> + return false;
>> +}
>> +
> [ ... ]
>
>> @@ -1000,24 +1315,20 @@ static int ibmveth_open(struct net_device *netdev)
>> if (rc)
>> goto out_free_tx_ltb;
>>
> [Severity: High]
> This isn't a bug introduced by this patch, but the buffer-pool allocation
> failure just above (ibmveth_alloc_buffer_pools() -> goto out_free_tx_ltb)
> still skips h_free_logical_lan(), unlike the setup_rx_interrupts() failure
> right below it.
>
> The out_free_tx_ltb path continues into ibmveth_cleanup_rx_resources(),
> which unmaps and frees the buffer list, the filter list and the RX ring
> while the logical LAN registration is still live, so PHYP keeps DMA
> addresses for freed pages.
>
> Does the new opened gate in ibmveth_close() also remove the last site that
> could have deregistered that residue? A later ndo_stop now returns 0
> without calling h_free_logical_lan().
>
> Two later patches in this series rework this ladder, first routing the pool
> failure through a path that loops on h_free_logical_lan() and then moving
> pool allocation ahead of registration, so the window does not survive the
> series. Would it be worth ordering those ahead of this one so this commit
> does not carry it?
Yes, PHYP can still write those pages on that path.
Pre-existing — the old pool-fail path already jumped to
the same labels without h_free. The request_irq /
setup_rx_interrupts failure below it does issue h_free.
The later register-helper reorder stays out of
this patch.
The opened gate does drop the accidental recovery: a
later ndo_stop now returns 0 and never reaches h_free.
That residue stays until Patch 6.
Patch 6 ("Refactor TX resource allocation in open/close
paths") issues h_free on that pool-fail path. Patch 7
("Add RX queue register helpers for MQ") then allocates
the pools before register, and every later failure goes
through ibmveth_free_all_queues().
>> - 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);
>>
>> + adapter->opened = true;
>> netdev_dbg(netdev, "open complete\n");
>>
>> return 0;
> [ ... ]
>
>> @@ -1041,27 +1351,32 @@ static int ibmveth_close(struct net_device *netdev)
>> long lpar_rc;
>> int i;
>>
>> - netdev_dbg(netdev, "close starting\n");
>> + /* Gate on opened, not IFF_UP: pool_store/change_mtu close+open can
>> + * leave IFF_UP set after a failed reopen.
>> + */
>> + if (!adapter->opened)
>> + return 0;
> [Severity: Medium]
> The commit message says:
>
> "Opened / rx_irq_setup also closes a pre-existing hang: after a
> failed reopen, a later ndo_stop used to napi_disable and free_irq
> a second time (rtnl spin + already-free IRQ). That depends on the
> helpers in this patch, so there is no standalone Fixes: tag."
>
> Is that dependency real? This gate reads only adapter->opened, and the
> matching "adapter->opened = true" at the end of ibmveth_open() does not
> reference ibmveth_toggle_irq(), ibmveth_setup_rx_interrupts() or
> ibmveth_cleanup_rx_interrupts() either.
>
> The hang itself is reachable in the baseline: ibmveth_open() calls
> napi_enable() on entry and napi_disable() on its out: path, and
> ibmveth_close() starts with napi_disable(). veth_pool_store(),
> ibmveth_change_mtu(), ibmveth_set_csum_offload() and ibmveth_set_tso() call
> ibmveth_close() then ibmveth_open() directly and do not clear IFF_UP when
> the reopen fails, so a later "ip link set dev X down" enters
> ibmveth_close() and the second napi_disable() spin-waits forever with rtnl
> held.
>
> Could the opened flag and this gate be split into their own patch with a
> Fixes: tag, so the fix can be backported without the refactor?
This patch already fixes that hang: open sets opened
only on success, and close() returns if !opened, so a
later ndo_stop does not napi_disable a second time.
There is no Fixes: tag; the commit message names the
hang and declines one. I am keeping it self-contained
in this 15 to avoid cross-tree dependencies; a
standalone fix for net can follow separately (and we
can rebase on top of it if requested).
That is not the later unwind standalone (h_free / TX LTB).
>>
>> - napi_disable(&adapter->napi[0]);
>> + adapter->opened = false;
>> +
>> + netdev_dbg(netdev, "close starting\n");
>>
>> netif_tx_stop_all_queues(netdev);
>>
>> - h_vio_signal(adapter->vdev->unit_address, VIO_IRQ_DISABLE);
>> + ibmveth_cleanup_rx_interrupts(adapter);
>> + /* Wait for softirq/poll that already passed shutdown checks. */
>> + synchronize_net();
>>
>> + ibmveth_update_rx_no_buffer(adapter);
>> + /* Full LAN teardown (subordinates arrive with register helpers). */
>> do {
>> lpar_rc = h_free_logical_lan(adapter->vdev->unit_address);
>> } while (H_IS_LONG_BUSY(lpar_rc) || (lpar_rc == H_BUSY));
> [Severity: Low]
> Two permanent changes to ibmveth_close() are not described in the commit
> message.
>
> ibmveth_update_rx_no_buffer() moves from after h_free_logical_lan() and
> free_irq() to before h_free_logical_lan(). It reads the absolute counter
> that the hypervisor writes at the end of the buffer list page, and the
> hypervisor still owns that page until h_free_logical_lan() returns, so the
> final rx_no_buffer / rx_errors value can now miss drops recorded after the
> read. Was the reordering intentional?
>
> The new synchronize_net() in the ndo_stop path is mentioned only in the v5
> changelog below the --- separator, which does not land in git history.
> Could it be described in the commit message as well?
Yes — both are intentional. v7 names them in the commit message.
The harvest stays before h_free so the read still hits a
live buffer-list page. synchronize_net() after IRQ/NAPI
teardown waits for a poll that already passed the
shutdown checks.
Thanks,
Mingming
>> -
>> if (lpar_rc != H_SUCCESS) {
>> - netdev_err(netdev, "h_free_logical_lan failed with %lx, "
>> - "continuing with close\n", lpar_rc);
>> + netdev_err(adapter->netdev,
>> + "h_free_logical_lan failed with %lx, continuing\n",
>> + lpar_rc);
>> }
>> -
>> - free_irq(netdev->irq, netdev);
>> -
>> - ibmveth_update_rx_no_buffer(adapter);
>> -
>> ibmveth_free_buffer_pools(adapter);
>> ibmveth_cleanup_rx_resources(adapter);
>> ibmveth_free_filter_list(adapter);
> [ ... ]
>
>> @@ -1805,15 +2120,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);
>> - if (WARN_ON(lpar_rc != H_SUCCESS)) {
>> + rc = ibmveth_enable_irq(adapter, 0);
>> + if (rc) {
>> schedule_work(&adapter->work);
>> goto out;
>> }
> [ ... ]
>
next prev parent reply other threads:[~2026-09-25 6:21 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-31 15:07 [PATCH net-next v6 00/15] ibmveth: Add multi-queue RX support Mingming Cao
2026-08-31 15:07 ` [PATCH net-next v6 01/15] ibmveth: Add MQ RX hypercall wrappers and call definitions Mingming Cao
2026-09-03 18:10 ` [net-next,v6,01/15] " netdev-bot+sashiko
2026-09-25 5:52 ` mingming cao
2026-08-31 15:07 ` [PATCH net-next v6 02/15] ibmveth: Prepare MQ RX adapter data structures Mingming Cao
2026-08-31 15:07 ` [PATCH net-next v6 03/15] ibmveth: Refactor RX resource allocation for MQ RX bring-up Mingming Cao
2026-09-03 18:10 ` [net-next,v6,03/15] " netdev-bot+sashiko
2026-09-25 6:08 ` mingming cao
2026-08-31 15:07 ` [PATCH net-next v6 04/15] ibmveth: Refactor buffer pool management for per-queue MQ RX Mingming Cao
2026-09-03 18:10 ` [net-next,v6,04/15] " netdev-bot+sashiko
2026-09-25 6:16 ` mingming cao
2026-08-31 15:07 ` [PATCH net-next v6 05/15] ibmveth: Refactor RX interrupt control for MQ RX queues Mingming Cao
2026-09-03 18:10 ` [net-next,v6,05/15] " netdev-bot+sashiko
2026-09-25 6:21 ` mingming cao [this message]
2026-08-31 15:07 ` [PATCH net-next v6 06/15] ibmveth: Refactor TX resource allocation in open/close paths Mingming Cao
2026-09-03 18:10 ` [net-next,v6,06/15] " netdev-bot+sashiko
2026-09-25 6:28 ` mingming cao
2026-08-31 15:07 ` [PATCH net-next v6 07/15] ibmveth: Add RX queue register helpers for MQ Mingming Cao
2026-08-31 15:07 ` [PATCH net-next v6 08/15] ibmveth: Add queue-aware RX buffer submit helper " Mingming Cao
2026-09-03 18:10 ` [net-next,v6,08/15] " netdev-bot+sashiko
2026-09-25 6:32 ` mingming cao
2026-08-31 15:07 ` [PATCH net-next v6 09/15] ibmveth: Harden RX poll path with helpers Mingming Cao
2026-09-03 18:10 ` [net-next,v6,09/15] " netdev-bot+sashiko
2026-09-25 6:40 ` mingming cao
2026-08-31 15:07 ` [PATCH net-next v6 10/15] ibmveth: Enable multi-queue RX receive path Mingming Cao
2026-09-03 18:10 ` [net-next,v6,10/15] " netdev-bot+sashiko
2026-09-25 6:48 ` mingming cao
2026-08-31 15:07 ` [PATCH net-next v6 11/15] ibmveth: Add per-queue RX and TX statistics collection Mingming Cao
2026-09-03 18:10 ` [net-next,v6,11/15] " netdev-bot+sashiko
2026-09-25 7:08 ` mingming cao
2026-08-31 15:07 ` [PATCH net-next v6 12/15] ibmveth: Report MQ-aware RX counts in ethtool get_channels Mingming Cao
2026-09-03 18:10 ` [net-next,v6,12/15] " netdev-bot+sashiko
2026-09-25 7:43 ` mingming cao
2026-08-31 15:07 ` [PATCH net-next v6 13/15] ibmveth: Expose per-queue buffer pool details via debugfs Mingming Cao
2026-08-31 15:07 ` [PATCH net-next v6 14/15] ibmveth: Implement incremental MQ RX queue resize Mingming Cao
2026-09-03 18:10 ` [net-next,v6,14/15] " netdev-bot+sashiko
2026-09-25 7:43 ` mingming cao
2026-08-31 15:07 ` [PATCH net-next v6 15/15] ibmveth: Complete set_channels down-path and mq_fallback max_rx cap Mingming Cao
2026-09-03 18:10 ` [net-next,v6,15/15] " netdev-bot+sashiko
2026-09-25 7:43 ` 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=6415b44b-a525-4412-b200-8bfb4d43b82e@linux.ibm.com \
--to=mmc@linux.ibm.com \
--cc=andrew+netdev@lunn.ch \
--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-bot+sashiko@kernel.org \
--cc=netdev@vger.kernel.org \
--cc=nnac123@linux.ibm.com \
--cc=pabeni@redhat.com \
--cc=ricklind@linux.ibm.com \
--cc=shaik.abdulla1@ibm.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