From nobody Fri Dec 19 12:14:46 2025 Received: from s1-ba86.socketlabs.email-od.com (s1-ba86.socketlabs.email-od.com [142.0.186.134]) (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 33D02270EA5 for ; Thu, 9 Oct 2025 20:29:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=142.0.186.134 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760041751; cv=none; b=iUFurERWgdAJYU+CjYEcNkFEQyFwUr/N77Wh06lj9/k+9eW6KJOH1HTM5tHKNZW5vwM0nUSQoCK7/VBZl45ACdMGrGlMuiESrQOiD37pQf6Jd+FPPJrmGVnAnac1VKYGTd+BCL+jQG0k+L0X+1T+iHAMQB1ZuDR47Qodij8L9Q4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760041751; c=relaxed/simple; bh=jxHNPvtonKIh6HD+twGlbhC/21NmPGMHzw7NpLnXoas=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=tPIZYjQqmCMjnRU4jRF9m6DurgD/wjgUU+8v0Ybj4xJ+sfaHlYLhmvLgRJIl0auPxwjy6+YJ770HF5zmZ8MpRwIaF81dZP5WOKf48QYNFRV8WBt73EZPn3Y6maF40TAseWlUpONsFLSs+bHvgjnqX5AqhERaVbJ1rfRCo9mRhvY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=nalramli.com; spf=pass smtp.mailfrom=email-od.com; dkim=pass (1024-bit key) header.d=email-od.com header.i=@email-od.com header.b=c9BViWpu; arc=none smtp.client-ip=142.0.186.134 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=nalramli.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=email-od.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=email-od.com header.i=@email-od.com header.b="c9BViWpu" DKIM-Signature: v=1; a=rsa-sha256; d=email-od.com;i=@email-od.com;s=dkim; c=relaxed/relaxed; q=dns/txt; t=1760041750; x=1762633750; h=content-transfer-encoding:mime-version:references:in-reply-to:message-id:date:subject:cc:to:from:x-thread-info:subject:to:from:cc:reply-to; bh=K09yGhuPuz5y5DBtOYrDuFkQOt0DZmwIm4f7CMtsXxA=; b=c9BViWpuF8EoF4fnZ/mA59/OaW2SGavgPAGzMFXgO0ctWhZVo4TgIFQTGPmoeSE9tVMZGPw8E3sOTFEKkTp4xwN9AdcbuwV9L+WWyuv/XSvLdgk0eZfdNjz2p2SGaXMiScPGa4MOR432sPRO+/uzguINZ7nQGTFKFErcGrK14TE= X-Thread-Info: NDUwNC4xMi42YjZmMTAwMDBiMDgxNzIubGludXgta2VybmVsPXZnZXIua2VybmVsLm9yZw== x-xsSpam: eyJTY29yZSI6MCwiRGV0YWlscyI6bnVsbH0= Received: from nalramli-fst-tp.. (d4-50-191-215.clv.wideopenwest.com [50.4.215.191]) by nalramli.com (Postfix) with ESMTPSA id 0F1382CE01B3; Thu, 9 Oct 2025 15:28:41 -0400 (EDT) From: "Nabil S. Alramli" To: anthony.l.nguyen@intel.com, przemyslaw.kitszel@intel.com Cc: andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, ast@kernel.org, daniel@iogearbox.net, hawk@kernel.org, john.fastabend@gmail.com, lishujin@kuaishou.com, xingwanli@kuaishou.com, intel-wired-lan@lists.osuosl.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, bpf@vger.kernel.org, team-kernel@fastly.com, khubert@fastly.com, nalramli@fastly.com, dev@nalramli.com Subject: [RFC ixgbe 1/2] ixgbe: Implement support for ndo_xdp_xmit in skb mode Date: Thu, 9 Oct 2025 15:28:30 -0400 Message-ID: <20251009192831.3333763-2-dev@nalramli.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251009192831.3333763-1-dev@nalramli.com> References: <20251009192831.3333763-1-dev@nalramli.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This commit adds support for `ndo_xdp_xmit` in skb mode in the ixgbe ethernet driver, by allowing the call to continue to transmit the packets using `dev_direct_xmit`. Previously, the driver did not support the operation in skb mode. The handler `ixgbe_xdp_xmit` had the following condition: ``` ring =3D adapter->xdp_prog ? ixgbe_determine_xdp_ring(adapter) : NULL; if (unlikely(!ring)) return -ENXIO; ``` That only works in native mode. In skb mode, `adapter->xdp_prog =3D=3D NULL= ` so the call returned an error, which prevented the ability to send packets using `bpf_prog_test_run_opts` with the `BPF_F_TEST_XDP_LIVE_FRAMES` flag. Signed-off-by: Nabil S. Alramli --- drivers/net/ethernet/intel/ixgbe/ixgbe.h | 8 ++++ drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 43 +++++++++++++++++-- 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe.h b/drivers/net/etherne= t/intel/ixgbe/ixgbe.h index e6a380d4929b..26c378853755 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe.h +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe.h @@ -846,6 +846,14 @@ struct ixgbe_ring *ixgbe_determine_xdp_ring(struct ixg= be_adapter *adapter) return adapter->xdp_ring[index]; } =20 +static inline +struct ixgbe_ring *ixgbe_determine_tx_ring(struct ixgbe_adapter *adapter) +{ + int index =3D ixgbe_determine_xdp_q_idx(smp_processor_id()); + + return adapter->tx_ring[index]; +} + static inline u8 ixgbe_max_rss_indices(struct ixgbe_adapter *adapter) { switch (adapter->hw.mac.type) { diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/et= hernet/intel/ixgbe/ixgbe_main.c index 467f81239e12..fed70cbdb1b2 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c @@ -10748,7 +10748,8 @@ static int ixgbe_xdp_xmit(struct net_device *dev, i= nt n, /* During program transitions its possible adapter->xdp_prog is assigned * but ring has not been configured yet. In this case simply abort xmit. */ - ring =3D adapter->xdp_prog ? ixgbe_determine_xdp_ring(adapter) : NULL; + ring =3D adapter->xdp_prog ? ixgbe_determine_xdp_ring(adapter) : + ixgbe_determine_tx_ring(adapter); if (unlikely(!ring)) return -ENXIO; =20 @@ -10762,9 +10763,43 @@ static int ixgbe_xdp_xmit(struct net_device *dev, = int n, struct xdp_frame *xdpf =3D frames[i]; int err; =20 - err =3D ixgbe_xmit_xdp_ring(ring, xdpf); - if (err !=3D IXGBE_XDP_TX) - break; + if (adapter->xdp_prog) { + err =3D ixgbe_xmit_xdp_ring(ring, xdpf); + if (err !=3D IXGBE_XDP_TX) + break; + } else { + struct xdp_buff xdp =3D {0}; + unsigned int metasize =3D 0; + unsigned int size =3D 0; + unsigned int truesize =3D 0; + struct sk_buff *skb =3D NULL; + + xdp_convert_frame_to_buff(xdpf, &xdp); + size =3D xdp.data_end - xdp.data; + metasize =3D xdp.data - xdp.data_meta; + truesize =3D SKB_DATA_ALIGN(xdp.data_end - xdp.data_hard_start) + + SKB_DATA_ALIGN(sizeof(struct skb_shared_info)); + + skb =3D napi_alloc_skb(&ring->q_vector->napi, truesize); + if (likely(skb)) { + skb_reserve(skb, xdp.data - xdp.data_hard_start); + skb_put_data(skb, xdp.data, size); + build_skb_around(skb, skb->data, truesize); + if (metasize) + skb_metadata_set(skb, metasize); + skb->dev =3D dev; + skb->queue_mapping =3D ring->queue_index; + + err =3D dev_direct_xmit(skb, ring->queue_index); + if (!dev_xmit_complete(err)) + break; + } else { + break; + } + + xdp_return_frame_rx_napi(xdpf); + } + nxmit++; } =20 --=20 2.43.0