From nobody Sun Apr 12 12:02:27 2026 Received: from smtpout-03.galae.net (smtpout-03.galae.net [185.246.85.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D18E63DA5DD for ; Wed, 4 Mar 2026 18:24:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.85.4 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772648645; cv=none; b=HW9FmDcP/dS68ahF7ERs9F9lszkNTiRwGRiPrB3cVqXhRqhq7Du1052xZYb6b/5+l5+j3vigD3XTequ3GVnJoihwjjuLkWCcOcOyQdbyA1EscY0tw2kZG3thpZUp0A9bJREt2eNGs+FsM7BiTg81SrEkKppEp6GNc+8NeEEoa6U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772648645; c=relaxed/simple; bh=lQQjYjZNPUbQ7rcixRKkV5WLW2kgdqScBVux9Qg7dOE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=YMUu0yAVWe9npOqvxwMlxvMNVGicNpa4dLwXvWOhRfurOKaod5FFMj+ayjTpWD3Yv+LhtT2EQbJ9zxRJr3IoLQANXpnj2e8AUl5Wz4bp9v7DM4GHZkosz2BnwlYV+/9rVPR2BwVBH+NuxQPw2WOQJQIs81hAzerJ+o1Hq7oCwr4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=K0g/+RgJ; arc=none smtp.client-ip=185.246.85.4 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="K0g/+RgJ" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 991334E42543; Wed, 4 Mar 2026 18:24:02 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 697095FF5C; Wed, 4 Mar 2026 18:24:02 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id A9007103695EE; Wed, 4 Mar 2026 19:23:59 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1772648641; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=JtnE5Dd9ijOOlqqPU5d8+YUT29h7RsvROog7pXP+pnI=; b=K0g/+RgJ1llz1pIWEUZ1pnnkBvnbJtYaiRJaIaUSr+FpcuHTW5EUK27nrZk6QaDR+WTKZe fIP8vq/tNu26z/feB9y0IRfZbqX0z+0ECOU4y8F136n4UPB4r1skP490r1Un8Y4ixu63T6 vGj9E7gLSQ+0DDRASx8wN3tMy8FRCFmuPNS1KgivTmXfcaXAABRiF3sACy++s1oHnYptvS +w9aVhLiKHOLzjHZTac1KZWzu9i2o+6RoIuMRO4kUpaQwHhPkH+3droRPw0WXykS0nfaXg meoxskiPDFsgCqFoI/tld+tFEfKdjD9kd0sc1zgcLj7PtulE9JBWDY4e65w5zg== From: =?utf-8?q?Th=C3=A9o_Lebrun?= Date: Wed, 04 Mar 2026 19:23:48 +0100 Subject: [PATCH net-next 5/8] net: macb: move macb_xdp_submit_frame() body to helper function Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260304-macb-xsk-v1-5-3d036076abf5@bootlin.com> References: <20260304-macb-xsk-v1-0-3d036076abf5@bootlin.com> In-Reply-To: <20260304-macb-xsk-v1-0-3d036076abf5@bootlin.com> To: Nicolas Ferre , Claudiu Beznea , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Alexei Starovoitov , Daniel Borkmann , Jesper Dangaard Brouer , John Fastabend , Stanislav Fomichev , Richard Cochran Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, bpf@vger.kernel.org, Vladimir Kondratiev , Gregory CLEMENT , =?utf-8?q?Beno=C3=AEt_Monin?= , Tawfik Bayouk , Thomas Petazzoni , Maxime Chevallier , =?utf-8?q?Th=C3=A9o_Lebrun?= X-Mailer: b4 0.14.3 X-Last-TLS-Session-Version: TLSv1.3 Part of macb_xdp_submit_frame() is specific to the handling of an XDP buffer (pick a queue for emission, DMA map or sync, report emitted bytes), part is chitchat with hardware to update DMA descriptor and start transmit. Move the hardware specific code out of macb_xdp_submit_frame() into a macb_xdp_submit_buff() helper function. The goal is to make code reusable to support XSK buffers. The macb_xdp_submit_frame() body is modified slightly: we bring the dma_map_single() call outside of the queue->tx_ptr_lock critical section, to minimise its span. Signed-off-by: Th=C3=A9o Lebrun --- drivers/net/ethernet/cadence/macb_main.c | 143 +++++++++++++++++----------= ---- 1 file changed, 78 insertions(+), 65 deletions(-) diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/etherne= t/cadence/macb_main.c index ed94f9f0894b..65c2ec2a843c 100644 --- a/drivers/net/ethernet/cadence/macb_main.c +++ b/drivers/net/ethernet/cadence/macb_main.c @@ -1208,6 +1208,52 @@ static bool ptp_one_step_sync(struct sk_buff *skb) return false; } =20 +static void macb_xdp_submit_buff(struct macb *bp, unsigned int queue_index, + struct macb_tx_buff buff) +{ + struct macb_queue *queue =3D &bp->queues[queue_index]; + struct net_device *netdev =3D bp->dev; + struct macb_tx_buff *tx_buff; + struct macb_dma_desc *desc; + unsigned int next_head; + u32 ctrl; + + next_head =3D queue->tx_head + 1; + + ctrl =3D MACB_BIT(TX_USED); + desc =3D macb_tx_desc(queue, next_head); + desc->ctrl =3D ctrl; + + desc =3D macb_tx_desc(queue, queue->tx_head); + tx_buff =3D macb_tx_buff(queue, queue->tx_head); + *tx_buff =3D buff; + + ctrl =3D (u32)buff.size; + ctrl |=3D MACB_BIT(TX_LAST); + + if (unlikely(macb_tx_ring_wrap(bp, queue->tx_head) =3D=3D (bp->tx_ring_si= ze - 1))) + ctrl |=3D MACB_BIT(TX_WRAP); + + /* Set TX buffer descriptor */ + macb_set_addr(bp, desc, buff.mapping); + /* desc->addr must be visible to hardware before clearing + * 'TX_USED' bit in desc->ctrl. + */ + wmb(); + desc->ctrl =3D ctrl; + queue->tx_head =3D next_head; + + /* Make newly initialized descriptor visible to hardware */ + wmb(); + + spin_lock(&bp->lock); + macb_writel(bp, NCR, macb_readl(bp, NCR) | MACB_BIT(TSTART)); + spin_unlock(&bp->lock); + + if (CIRC_SPACE(queue->tx_head, queue->tx_tail, bp->tx_ring_size) < 1) + netif_stop_subqueue(netdev, queue_index); +} + static int macb_tx_complete(struct macb_queue *queue, int budget) { struct macb *bp =3D queue->bp; @@ -1430,44 +1476,25 @@ static void discard_partial_frame(struct macb_queue= *queue, unsigned int begin, } =20 static int macb_xdp_submit_frame(struct macb *bp, struct xdp_frame *xdpf, - struct net_device *dev, bool dma_map, + struct net_device *netdev, bool dma_map, dma_addr_t addr) { + struct device *dev =3D &bp->pdev->dev; enum macb_tx_buff_type buff_type; - struct macb_tx_buff *tx_buff; int cpu =3D smp_processor_id(); - struct macb_dma_desc *desc; struct macb_queue *queue; - unsigned int next_head; unsigned long flags; dma_addr_t mapping; u16 queue_index; int err =3D 0; - u32 ctrl; - - queue_index =3D cpu % bp->num_queues; - queue =3D &bp->queues[queue_index]; - buff_type =3D dma_map ? MACB_TYPE_XDP_NDO : MACB_TYPE_XDP_TX; - - spin_lock_irqsave(&queue->tx_ptr_lock, flags); - - /* This is a hard error, log it. */ - if (CIRC_SPACE(queue->tx_head, queue->tx_tail, bp->tx_ring_size) < 1) { - netif_stop_subqueue(dev, queue_index); - netdev_dbg(bp->dev, "tx_head =3D %u, tx_tail =3D %u\n", - queue->tx_head, queue->tx_tail); - err =3D -ENOMEM; - goto unlock; - } =20 if (dma_map) { - mapping =3D dma_map_single(&bp->pdev->dev, - xdpf->data, - xdpf->len, DMA_TO_DEVICE); - if (unlikely(dma_mapping_error(&bp->pdev->dev, mapping))) { - err =3D -ENOMEM; - goto unlock; - } + mapping =3D dma_map_single(dev, xdpf->data, xdpf->len, DMA_TO_DEVICE); + err =3D dma_mapping_error(&bp->pdev->dev, mapping); + if (unlikely(err)) + return err; + + buff_type =3D MACB_TYPE_XDP_NDO; } else { /* progs can adjust the head. Sync and set the adjusted one. * This also implicitly takes into account ip alignment, @@ -1476,52 +1503,38 @@ static int macb_xdp_submit_frame(struct macb *bp, s= truct xdp_frame *xdpf, mapping =3D addr + xdpf->headroom + sizeof(*xdpf); dma_sync_single_for_device(&bp->pdev->dev, mapping, xdpf->len, DMA_BIDIRECTIONAL); + + buff_type =3D MACB_TYPE_XDP_TX; } =20 - next_head =3D queue->tx_head + 1; + queue_index =3D cpu % bp->num_queues; + queue =3D &bp->queues[queue_index]; =20 - ctrl =3D MACB_BIT(TX_USED); - desc =3D macb_tx_desc(queue, next_head); - desc->ctrl =3D ctrl; + spin_lock_irqsave(&queue->tx_ptr_lock, flags); =20 - desc =3D macb_tx_desc(queue, queue->tx_head); - tx_buff =3D macb_tx_buff(queue, queue->tx_head); - tx_buff->ptr =3D xdpf; - tx_buff->type =3D buff_type; - tx_buff->mapping =3D dma_map ? mapping : 0; - tx_buff->size =3D xdpf->len; - tx_buff->mapped_as_page =3D false; + if (CIRC_SPACE(queue->tx_head, queue->tx_tail, bp->tx_ring_size) < 1) { + /* This is a hard error, log it. */ + netif_stop_subqueue(netdev, queue_index); + netdev_dbg(netdev, "tx_head =3D %u, tx_tail =3D %u\n", + queue->tx_head, queue->tx_tail); + err =3D -ENOMEM; + } else { + macb_xdp_submit_buff(bp, queue_index, (struct macb_tx_buff){ + .ptr =3D xdpf, + .mapping =3D dma_map ? mapping : 0, + .size =3D xdpf->len, + .mapped_as_page =3D false, + .type =3D buff_type, + }); =20 - ctrl =3D (u32)tx_buff->size; - ctrl |=3D MACB_BIT(TX_LAST); + netdev_tx_sent_queue(netdev_get_tx_queue(bp->dev, queue_index), xdpf->le= n); + } =20 - if (unlikely(macb_tx_ring_wrap(bp, queue->tx_head) =3D=3D (bp->tx_ring_si= ze - 1))) - ctrl |=3D MACB_BIT(TX_WRAP); - - /* Set TX buffer descriptor */ - macb_set_addr(bp, desc, mapping); - /* desc->addr must be visible to hardware before clearing - * 'TX_USED' bit in desc->ctrl. - */ - wmb(); - desc->ctrl =3D ctrl; - queue->tx_head =3D next_head; - - /* Make newly initialized descriptor visible to hardware */ - wmb(); - - spin_lock(&bp->lock); - macb_writel(bp, NCR, macb_readl(bp, NCR) | MACB_BIT(TSTART)); - spin_unlock(&bp->lock); - - netdev_tx_sent_queue(netdev_get_tx_queue(bp->dev, queue_index), xdpf->len= ); - - if (CIRC_SPACE(queue->tx_head, queue->tx_tail, bp->tx_ring_size) < 1) - netif_stop_subqueue(dev, queue_index); - -unlock: spin_unlock_irqrestore(&queue->tx_ptr_lock, flags); =20 + if (err && dma_map) + dma_unmap_single(dev, mapping, xdpf->len, DMA_TO_DEVICE); + return err; } =20 --=20 2.53.0