From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-oi1-f227.google.com (mail-oi1-f227.google.com [209.85.167.227]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B3FBF3D5232 for ; Thu, 19 Mar 2026 21:34:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.227 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773956059; cv=none; b=Sofwlbh1JeqlPtvYPfePL5wc2Kmkf8llR4GVSP4bqemjILNOc50rvEl5YrrWSkKucdcy1v6eB00L6mLe0xIipyQUgA1SLH+JS/aRM/+sBjNLXfQxv24i/nw/ymQbBZEgXUoyAXT/+/0EZ5bYSGQ/i5kANuknu01TxM7ED5hrZ0I= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773956059; c=relaxed/simple; bh=lG7rGzi3OC6nDMoSjr9UVsfX8Z+lay1soEw8+JaEcLk=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=hQqp7+LFEmhBOEM1Pmw2r+csp0z1L3fK7lpm+fxnYoWFOjl3OGwUEJdhay3B8F9bqTEfucUVI3b3JroiIDXq6aPmiAL+dkKZqXWgrnXLLhMn6SPopMWPHz1WmtzkDIwVHYm4wtHdqlTUx1xepGzzGFrijbGXRz+C9i7Pl2USgXM= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=broadcom.com; spf=fail smtp.mailfrom=broadcom.com; dkim=pass (1024-bit key) header.d=broadcom.com header.i=@broadcom.com header.b=gUKLIXJt; arc=none smtp.client-ip=209.85.167.227 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=broadcom.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=broadcom.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=broadcom.com header.i=@broadcom.com header.b="gUKLIXJt" Received: by mail-oi1-f227.google.com with SMTP id 5614622812f47-467e8aaa865so10200b6e.2 for ; Thu, 19 Mar 2026 14:34:17 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773956057; x=1774560857; h=content-transfer-encoding:in-reply-to:from:content-language :references:cc:to:subject:user-agent:mime-version:date:message-id :dkim-signature:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=Q6Nrx0bSsouA08qG3vFSADaw9hcTHYzowASvPsD/ztQ=; b=GZHwqJnUhN0g0AIcyPNV+OTMzrryHShAVmeaTo0FC1AC7bRBx4yDxWVReC3rIHSZv/ xfMyp5jtUWaRuN4eogtM2ZQeXjBc2C4vgQ+smv3E3saHrQHRLkoBnTYY03M6Yc/5K0nE ve6p77uQ0IErkA5p9ji4Q8cDGGh1Bjzg2u5Tg3THJovGh9vf8trD1XgQ/FBFTBzhCEtq Z3v/HwH+gsNQbhN6hWIH9mwncmWMRoGTbe2yr7wJTOFEcin/gS+FKa1hXObSa0ZuxjPy bjLllGW6IxKkBgLN0AkjD9ZA1PmNGdZ8Aq+NWB8M4BOxZCF7LRdf18KfhCg1RK3TNX80 HkmA== X-Forwarded-Encrypted: i=1; AJvYcCWxWcI3quZEeGXozLoaSMnuORR6rYvcvYdfT91UfY/fu0Z6afHBq5QdeN3FBTPQXzcAwHR7D5RII2D8+d0=@vger.kernel.org X-Gm-Message-State: AOJu0Yw+Eu9hNuLYWPH9CvtWUmgfDNTesXRbVMaDZOlqU3MK9CUsQoye tywgQX1hyuC0jiAx4YK35X/Ll8ddN1DC6pBNLNhsMowXdYp8fzU9syrauYRpHCqq9qXbmXAhcEV GxuigKV5menGtJKX0lyxvJ8VO8meWrhxXj3LcjRejx3soiEyg0xVZTTqeAjBrucClkq+MAaBmXL +uPrC5UdEQjhSYHBXdZ1nS2bGhDtWkNU5wUhcCQ5Rtoozi9twiLiUGuLYzC3qKnXn1RB5fr10rx JNnaTCGIB3AXsXz0w== X-Gm-Gg: ATEYQzynyFBNjPgSRO7MXccjUq7N5dU89ajzc5JHYUqE4VTwgsW0NLmpfU7hh2sH5x0 kPun880OfgQzDPV+hfCzzaaah4h80ebMGsafWifgk8WQjC6PKH7tgNom9c9Y4EUEfIECEQEKr0V vK7Q5F46BbdFZXZC5FZtQi/EFVzF4MSGcp81boyiFfc+8suGG+Db8/59LgtQG3je9doS9XLrcEo mS3GJlUZnFL12NEGzKNDhOin1LB5l7Y13d5NDkAVvJFgPRCHBqRDOh07fQXa09E+mzy6OjCIXIk uG0b/FR0fUhOXVBnBEbyhdHjV2NNb5Dlpvc0xjBDJU91m0TMR8U5gs6dvbPWJfHvSjmubZvzl4I KVYgwjvLFRQkot0wjQRJ0JBQv/hAzPaPHGLWB/SEovSWe4iVSyMxaDanEbaxen2lRP2aCnx+7zT A+g5WZdN8q503Bjub3yKKPsRlttHHZBv7HBRyi/rVnt+V4AXfu4USEnlI2eA== X-Received: by 2002:a05:6808:e78a:10b0:467:284:b3c6 with SMTP id 5614622812f47-467e5d7c07amr341031b6e.14.1773956056531; Thu, 19 Mar 2026 14:34:16 -0700 (PDT) Received: from smtp-us-east1-p01-i01-si01.dlp.protect.broadcom.com (address-144-49-247-117.dlp.protect.broadcom.com. [144.49.247.117]) by smtp-relay.gmail.com with ESMTPS id 586e51a60fabf-41c14d9c18fsm22262fac.11.2026.03.19.14.34.16 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 19 Mar 2026 14:34:16 -0700 (PDT) X-Relaying-Domain: broadcom.com X-CFilter-Loop: Reflected Received: by mail-qk1-f198.google.com with SMTP id af79cd13be357-8cfbbf78ca8so661185785a.0 for ; Thu, 19 Mar 2026 14:34:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; t=1773956055; x=1774560855; darn=vger.kernel.org; h=content-transfer-encoding:in-reply-to:from:content-language :references:cc:to:subject:user-agent:mime-version:date:message-id :from:to:cc:subject:date:message-id:reply-to; bh=Q6Nrx0bSsouA08qG3vFSADaw9hcTHYzowASvPsD/ztQ=; b=gUKLIXJtmfg8uvX5mQnBOeOo/Jj+Sws5yi8LdsZs7TTvyaHjBbqy51czR52OzKYG+I ZwlYovAZllkIxA//KVt0CiZ45Y/3l+/WVfjaP7grU6FHWCJ9YPeKucM1V6x2QFksX3c8 FiPFklXpyuZ6iMYZk353vl84uN4WpKVE7ToKk= X-Forwarded-Encrypted: i=1; AJvYcCX7eMKAbvVjpksP0PCiNqTVzsmd22ddlSlXFSqtyqNhhWV3gS293lm96F9Mj41XSHdzISWqoziav4Ep04k=@vger.kernel.org X-Received: by 2002:a05:620a:290d:b0:8cd:bfd9:b947 with SMTP id af79cd13be357-8cfc7e670abmr132471185a.5.1773956055447; Thu, 19 Mar 2026 14:34:15 -0700 (PDT) X-Received: by 2002:a05:620a:290d:b0:8cd:bfd9:b947 with SMTP id af79cd13be357-8cfc7e670abmr132466285a.5.1773956054831; Thu, 19 Mar 2026 14:34:14 -0700 (PDT) Received: from [10.14.5.69] ([192.19.161.248]) by smtp.gmail.com with ESMTPSA id af79cd13be357-8cfc8f93489sm21780785a.15.2026.03.19.14.34.12 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 19 Mar 2026 14:34:14 -0700 (PDT) Message-ID: <94f75509-ac47-42ab-a46d-4082b9c2acb0@broadcom.com> Date: Thu, 19 Mar 2026 14:34:11 -0700 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH net-next v3 5/6] net: bcmgenet: add XDP_REDIRECT and ndo_xdp_xmit support To: Nicolai Buchwitz , netdev@vger.kernel.org Cc: Doug Berger , Florian Fainelli , Broadcom internal kernel review list , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Alexei Starovoitov , Daniel Borkmann , Jesper Dangaard Brouer , John Fastabend , Stanislav Fomichev , linux-kernel@vger.kernel.org, bpf@vger.kernel.org References: <20260319115402.353509-1-nb@tipi-net.de> <20260319115402.353509-6-nb@tipi-net.de> Content-Language: en-US From: Justin Chen In-Reply-To: <20260319115402.353509-6-nb@tipi-net.de> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-DetectorID-Processed: b00c1d49-9d2e-4205-b15f-d015386d3d5e On 3/19/26 4:53 AM, Nicolai Buchwitz wrote: > Add XDP_REDIRECT support and implement ndo_xdp_xmit for receiving > redirected frames from other devices. > > XDP_REDIRECT calls xdp_do_redirect() in the RX path with > xdp_do_flush() once per NAPI poll cycle. ndo_xdp_xmit batches frames > into ring 16 under a single spinlock acquisition. > > Advertise NETDEV_XDP_ACT_REDIRECT and NETDEV_XDP_ACT_NDO_XMIT in > xdp_features. > > Signed-off-by: Nicolai Buchwitz > --- > .../net/ethernet/broadcom/genet/bcmgenet.c | 98 +++++++++++++++---- > 1 file changed, 80 insertions(+), 18 deletions(-) > > diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c > index 54df1694f1cd..a5ad25ccb148 100644 > --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c > +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c > @@ -2320,23 +2320,23 @@ static struct sk_buff *bcmgenet_xdp_build_skb(struct bcmgenet_rx_ring *ring, > return skb; > } > > +/* Submit a single XDP frame to the TX ring. Caller must hold ring->lock. > + * Returns true on success. Does not ring the doorbell - caller must > + * write TDMA_PROD_INDEX after batching. > + */ > static bool > bcmgenet_xdp_xmit_frame(struct bcmgenet_priv *priv, > + struct bcmgenet_tx_ring *ring, > struct xdp_frame *xdpf, bool dma_map) > { > - struct bcmgenet_tx_ring *ring = &priv->tx_rings[DESC_INDEX]; > struct device *kdev = &priv->pdev->dev; > struct enet_cb *tx_cb_ptr; > dma_addr_t mapping; > unsigned int dma_len; > u32 len_stat; > > - spin_lock(&ring->lock); > - > - if (ring->free_bds < 1) { > - spin_unlock(&ring->lock); > + if (ring->free_bds < 1) > return false; > - } > > tx_cb_ptr = bcmgenet_get_txcb(priv, ring); > > @@ -2350,7 +2350,6 @@ bcmgenet_xdp_xmit_frame(struct bcmgenet_priv *priv, > */ > if (unlikely(xdpf->headroom < sizeof(struct status_64))) { > bcmgenet_put_txcb(priv, ring); > - spin_unlock(&ring->lock); > return false; > } > > @@ -2364,7 +2363,6 @@ bcmgenet_xdp_xmit_frame(struct bcmgenet_priv *priv, > tx_cb_ptr->skb = NULL; > tx_cb_ptr->xdpf = NULL; > bcmgenet_put_txcb(priv, ring); > - spin_unlock(&ring->lock); > return false; > } > } else { > @@ -2396,12 +2394,15 @@ bcmgenet_xdp_xmit_frame(struct bcmgenet_priv *priv, > ring->prod_index++; > ring->prod_index &= DMA_P_INDEX_MASK; > > + return true; > +} > + > +static void Perfer to remove newline. > +bcmgenet_xdp_ring_doorbell(struct bcmgenet_priv *priv, > + struct bcmgenet_tx_ring *ring) > +{ > bcmgenet_tdma_ring_writel(priv, ring->index, ring->prod_index, > TDMA_PROD_INDEX); > - > - spin_unlock(&ring->lock); > - > - return true; > } > > static unsigned int > @@ -2417,7 +2418,11 @@ bcmgenet_run_xdp(struct bcmgenet_rx_ring *ring, struct bpf_prog *prog, > switch (act) { > case XDP_PASS: > return XDP_PASS; > - case XDP_TX: > + case XDP_TX: { > + struct bcmgenet_tx_ring *tx_ring; > + > + tx_ring = &priv->tx_rings[DESC_INDEX]; > + > /* Prepend a zeroed TSB (Transmit Status Block). The GENET > * MAC has TBUF_64B_EN set globally, so hardware expects every > * TX buffer to begin with a 64-byte struct status_64. Back > @@ -2429,14 +2434,26 @@ bcmgenet_run_xdp(struct bcmgenet_rx_ring *ring, struct bpf_prog *prog, > memset(xdp->data, 0, sizeof(struct status_64)); > > xdpf = xdp_convert_buff_to_frame(xdp); > - if (unlikely(!xdpf) || > - unlikely(!bcmgenet_xdp_xmit_frame(priv, xdpf, false))) { > - page_pool_put_full_page(ring->page_pool, rx_page, > - true); > + if (unlikely(!xdpf)) > + goto drop_page; > + > + spin_lock(&tx_ring->lock); > + if (unlikely(!bcmgenet_xdp_xmit_frame(priv, tx_ring, > + xdpf, false))) { > + spin_unlock(&tx_ring->lock); > + xdp_return_frame_rx_napi(xdpf); > return XDP_DROP; > } > + bcmgenet_xdp_ring_doorbell(priv, tx_ring); > + spin_unlock(&tx_ring->lock); > return XDP_TX; > + } Don't think we need this extra curly bracket here. > + case XDP_REDIRECT: > + if (unlikely(xdp_do_redirect(priv->dev, xdp, prog))) > + goto drop_page; > + return XDP_REDIRECT; > case XDP_DROP: > +drop_page: Not a big fan of jumping like this within switch statements. > page_pool_put_full_page(ring->page_pool, rx_page, true); > return XDP_DROP; > default: > @@ -2459,6 +2476,7 @@ static unsigned int bcmgenet_desc_rx(struct bcmgenet_rx_ring *ring, > struct bcmgenet_priv *priv = ring->priv; > struct net_device *dev = priv->dev; > struct bpf_prog *xdp_prog; > + bool xdp_flush = false; > struct enet_cb *cb; > struct sk_buff *skb; > u32 dma_length_status; > @@ -2597,6 +2615,8 @@ static unsigned int bcmgenet_desc_rx(struct bcmgenet_rx_ring *ring, > > xdp_act = bcmgenet_run_xdp(ring, xdp_prog, &xdp, > rx_page); > + if (xdp_act == XDP_REDIRECT) > + xdp_flush = true; > if (xdp_act != XDP_PASS) > goto next; > > @@ -2670,6 +2690,9 @@ static unsigned int bcmgenet_desc_rx(struct bcmgenet_rx_ring *ring, > bcmgenet_rdma_ring_writel(priv, ring->index, ring->c_index, RDMA_CONS_INDEX); > } > > + if (xdp_flush) > + xdp_do_flush(); > + > ring->dim.bytes = bytes_processed; > ring->dim.packets = rxpktprocessed; > > @@ -3995,10 +4018,16 @@ static int bcmgenet_xdp_setup(struct net_device *dev, > return -EOPNOTSUPP; > } > > + if (!prog) > + xdp_features_clear_redirect_target(dev); > + > old_prog = xchg(&priv->xdp_prog, prog); > if (old_prog) > bpf_prog_put(old_prog); > > + if (prog) > + xdp_features_set_redirect_target(dev, false); > + > return 0; > } > > @@ -4012,6 +4041,37 @@ static int bcmgenet_xdp(struct net_device *dev, struct netdev_bpf *xdp) > } > } > > +static int Same as before > +bcmgenet_xdp_xmit(struct net_device *dev, int num_frames, > + struct xdp_frame **frames, u32 flags) > +{ > + struct bcmgenet_priv *priv = netdev_priv(dev); > + struct bcmgenet_tx_ring *ring = &priv->tx_rings[DESC_INDEX]; > + int sent = 0; > + int i; > + > + if (unlikely(flags & ~XDP_XMIT_FLAGS_MASK)) > + return -EINVAL; > + > + if (unlikely(!netif_running(dev))) > + return -ENETDOWN; > + > + spin_lock(&ring->lock); > + > + for (i = 0; i < num_frames; i++) { > + if (!bcmgenet_xdp_xmit_frame(priv, ring, frames[i], true)) > + break; > + sent++; > + } > + > + if (sent) > + bcmgenet_xdp_ring_doorbell(priv, ring); > + > + spin_unlock(&ring->lock); > + > + return sent; > +} > + > static const struct net_device_ops bcmgenet_netdev_ops = { > .ndo_open = bcmgenet_open, > .ndo_stop = bcmgenet_close, > @@ -4024,6 +4084,7 @@ static const struct net_device_ops bcmgenet_netdev_ops = { > .ndo_get_stats64 = bcmgenet_get_stats64, > .ndo_change_carrier = bcmgenet_change_carrier, > .ndo_bpf = bcmgenet_xdp, > + .ndo_xdp_xmit = bcmgenet_xdp_xmit, > }; > > /* GENET hardware parameters/characteristics */ > @@ -4326,7 +4387,8 @@ static int bcmgenet_probe(struct platform_device *pdev) > NETIF_F_RXCSUM; > dev->hw_features |= dev->features; > dev->vlan_features |= dev->features; > - dev->xdp_features = NETDEV_XDP_ACT_BASIC; > + dev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT | > + NETDEV_XDP_ACT_NDO_XMIT; > > netdev_sw_irq_coalesce_default_on(dev); >