From: "Théo Lebrun" <theo.lebrun@bootlin.com>
To: theo.lebrun@bootlin.com
Cc: andrew+netdev@lunn.ch, claudiu.beznea@tuxon.dev,
davem@davemloft.net, edumazet@google.com,
gregory.clement@bootlin.com, kuba@kernel.org, lorenzo@kernel.org,
netdev@vger.kernel.org, nicolas.ferre@microchip.com,
pabeni@redhat.com, pvalerio@redhat.com,
thomas.petazzoni@bootlin.com
Subject: [PATCH 6/6] net: macb: rework macb_tx_complete() processing loop
Date: Fri, 13 Feb 2026 17:57:59 +0100 [thread overview]
Message-ID: <20260213165759.225449-6-theo.lebrun@bootlin.com> (raw)
In-Reply-To: <20260213165759.225449-1-theo.lebrun@bootlin.com>
The SKB case of macb_tx_complete() must iterate over buffers taking into
account frames might be multi-buffer. Following that, the code for XDP
got integrated into the same loop. But in XDP cases, frames must be
single buffer.
Knowing that, we reverse operations: first we check the buffer type,
then we iterate to consume all frame buffers if it is an SKB buffer.
Side-effects:
- Statistics tx_packets and tx_bytes are now incremented for
XDP_TX and XDP_NDO frames as well.
- Only increment statistics once per macb_tx_complete() call rather
than once per frame.
Signed-off-by: Théo Lebrun <theo.lebrun@bootlin.com>
---
drivers/net/ethernet/cadence/macb_main.c | 71 +++++++++++-------------
1 file changed, 33 insertions(+), 38 deletions(-)
diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/ethernet/cadence/macb_main.c
index 2c7644f2215a..6c33af667405 100644
--- a/drivers/net/ethernet/cadence/macb_main.c
+++ b/drivers/net/ethernet/cadence/macb_main.c
@@ -1202,11 +1202,10 @@ static int macb_tx_complete(struct macb_queue *queue, int budget)
spin_lock_irqsave(&queue->tx_ptr_lock, flags);
head = queue->tx_head;
for (tail = queue->tx_tail; tail != head && packets < budget; tail++) {
- void *data = NULL;
- struct macb_tx_buff *tx_buff;
- struct sk_buff *skb;
- struct macb_dma_desc *desc;
- u32 ctrl;
+ struct macb_tx_buff *tx_buff;
+ struct macb_dma_desc *desc;
+ struct sk_buff *skb;
+ u32 ctrl;
desc = macb_tx_desc(queue, tail);
@@ -1221,48 +1220,44 @@ static int macb_tx_complete(struct macb_queue *queue, int budget)
if (!(ctrl & MACB_BIT(TX_USED)))
break;
- /* Process all buffers of the current transmitted frame */
- for (;; tail++) {
- tx_buff = macb_tx_buff(queue, tail);
+ tx_buff = macb_tx_buff(queue, tail);
- if (tx_buff->type != MACB_TYPE_SKB) {
- data = tx_buff->ptr;
- goto unmap;
+ switch (tx_buff->type) {
+ case MACB_TYPE_SKB:
+ /* Process all buffers of the current transmitted frame */
+ while (!tx_buff->ptr) {
+ macb_tx_unmap(bp, tx_buff, budget);
+ tail++;
+ tx_buff = macb_tx_buff(queue, tail);
}
- /* First, update TX stats if needed */
- if (tx_buff->type == MACB_TYPE_SKB && tx_buff->ptr) {
- data = tx_buff->ptr;
- skb = tx_buff->ptr;
+ skb = tx_buff->ptr;
- if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) &&
- !ptp_one_step_sync(skb))
- gem_ptp_do_txstamp(bp, skb, desc);
+ if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) &&
+ !ptp_one_step_sync(skb))
+ gem_ptp_do_txstamp(bp, skb, desc);
- netdev_vdbg(bp->dev, "skb %u (data %p) TX complete\n",
- macb_tx_ring_wrap(bp, tail),
- skb->data);
- bp->dev->stats.tx_packets++;
- queue->stats.tx_packets++;
- bp->dev->stats.tx_bytes += skb->len;
- queue->stats.tx_bytes += skb->len;
- packets++;
- bytes += skb->len;
- }
+ netdev_vdbg(bp->dev, "skb %u (data %p) TX complete\n",
+ macb_tx_ring_wrap(bp, tail),
+ skb->data);
+ bytes += skb->len;
+ break;
-unmap:
- /* Now we can safely release resources */
- macb_tx_unmap(bp, tx_buff, budget);
-
- /* skb is set only for the last buffer of the frame.
- * WARNING: at this point skb has been freed by
- * macb_tx_unmap().
- */
- if (data)
- break;
+ case MACB_TYPE_XDP_TX:
+ case MACB_TYPE_XDP_NDO:
+ bytes += tx_buff->size;
+ break;
}
+
+ packets++;
+ macb_tx_unmap(bp, tx_buff, budget);
}
+ bp->dev->stats.tx_packets += packets;
+ queue->stats.tx_packets += packets;
+ bp->dev->stats.tx_bytes += bytes;
+ queue->stats.tx_bytes += bytes;
+
netdev_tx_completed_queue(netdev_get_tx_queue(bp->dev, queue_index),
packets, bytes);
--
2.53.0
next prev parent reply other threads:[~2026-02-13 16:58 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-01-15 22:25 [PATCH net-next 0/8] net: macb: Add XDP support and page pool integration Paolo Valerio
2026-01-15 22:25 ` [PATCH net-next 1/8] net: macb: move Rx buffers alloc from link up to open Paolo Valerio
2026-01-15 22:25 ` [PATCH net-next 2/8] net: macb: rename rx_skbuff into rx_buff Paolo Valerio
2026-01-15 22:25 ` [PATCH net-next 3/8] cadence: macb: Add page pool support handle multi-descriptor frame rx Paolo Valerio
2026-01-16 17:16 ` Andrew Lunn
2026-01-19 18:58 ` Paolo Valerio
2026-01-22 22:24 ` Paolo Valerio
2026-01-22 23:04 ` Andrew Lunn
2026-01-25 19:02 ` Paolo Valerio
2026-01-26 14:29 ` Andrew Lunn
2026-01-26 18:45 ` Théo Lebrun
2026-01-26 23:51 ` Paolo Valerio
2026-01-27 15:48 ` Théo Lebrun
2026-01-26 23:34 ` Paolo Valerio
2026-01-19 19:36 ` [net-next,3/8] " Jakub Kicinski
2026-01-22 14:39 ` Théo Lebrun
2026-01-22 15:16 ` Jakub Kicinski
2026-01-26 14:55 ` [PATCH net-next 3/8] " Théo Lebrun
2026-02-20 15:45 ` Théo Lebrun
2026-01-15 22:25 ` [PATCH net-next 4/8] cadence: macb: use the current queue number for stats Paolo Valerio
2026-01-15 22:25 ` [PATCH net-next 5/8] cadence: macb: add XDP support for gem Paolo Valerio
2026-01-19 19:36 ` [net-next,5/8] " Jakub Kicinski
2026-01-15 22:25 ` [PATCH net-next 6/8] cadence: macb: make macb_tx_skb generic Paolo Valerio
2026-01-15 22:25 ` [PATCH net-next 7/8] cadence: macb: make tx path skb agnostic Paolo Valerio
2026-01-15 22:25 ` [PATCH net-next 8/8] cadence: macb: introduce xmit support Paolo Valerio
2026-01-19 19:36 ` [net-next,8/8] " Jakub Kicinski
2026-02-02 16:31 ` [PATCH net-next 0/8] net: macb: Add XDP support and page pool integration Théo Lebrun
2026-02-13 16:57 ` [PATCH 1/6] net: macb: rename release_buff() -> macb_tx_release_buff() Théo Lebrun
2026-02-13 16:57 ` [PATCH 2/6] net: macb: drop two labels in gem_rx() Théo Lebrun
2026-02-13 16:57 ` [PATCH 3/6] net: macb: always use DMA_BIDIRECTIONAL on page pool buffers Théo Lebrun
2026-02-13 16:57 ` [PATCH 4/6] net: macb: account for stats in Rx XDP codepaths Théo Lebrun
2026-02-13 16:57 ` [PATCH 5/6] net: macb: improve Rx refill error message Théo Lebrun
2026-02-13 16:57 ` Théo Lebrun [this message]
2026-02-13 16:57 ` [PATCH net-next 0/8] net: macb: Add XDP support and page pool integration Théo Lebrun
2026-02-13 17:02 ` Théo Lebrun
2026-02-14 15:37 ` Paolo Valerio
2026-02-16 9:17 ` Théo Lebrun
2026-02-19 18:05 ` Paolo Valerio
2026-02-20 15:58 ` Théo Lebrun
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=20260213165759.225449-6-theo.lebrun@bootlin.com \
--to=theo.lebrun@bootlin.com \
--cc=andrew+netdev@lunn.ch \
--cc=claudiu.beznea@tuxon.dev \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=gregory.clement@bootlin.com \
--cc=kuba@kernel.org \
--cc=lorenzo@kernel.org \
--cc=netdev@vger.kernel.org \
--cc=nicolas.ferre@microchip.com \
--cc=pabeni@redhat.com \
--cc=pvalerio@redhat.com \
--cc=thomas.petazzoni@bootlin.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