From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from smtp3.osuosl.org (smtp3.osuosl.org [140.211.166.136]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id A2F42D277D8 for ; Sat, 10 Jan 2026 08:37:05 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp3.osuosl.org (Postfix) with ESMTP id 503AA60E0B; Sat, 10 Jan 2026 08:37:05 +0000 (UTC) X-Virus-Scanned: amavis at osuosl.org Received: from smtp3.osuosl.org ([127.0.0.1]) by localhost (smtp3.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP id JC63FuejXBCd; Sat, 10 Jan 2026 08:37:04 +0000 (UTC) X-Comment: SPF check N/A for local connections - client-ip=140.211.166.142; helo=lists1.osuosl.org; envelope-from=intel-wired-lan-bounces@osuosl.org; receiver= DKIM-Filter: OpenDKIM Filter v2.11.0 smtp3.osuosl.org 31BEC607DB DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=osuosl.org; s=default; t=1768034224; bh=jbZQf1jFnQxSLS/K+cvCSmuQUlu7C2T7NOLDV2KwUEs=; h=Date:To:Cc:References:From:In-Reply-To:Subject:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=dbmspzpuhR9cbWoGhNb6aaQwz8x/r5fHI2tsXBxbWxRcu0nMHNQRbzB2QE+QeZocX HOHZXpA6jYNPG1GgSGxuINSAhYZSe/XQn1TokGuSA/IYU9mR4iIcKaPb9xYXfTeNtP fcMTgkpzCnlxXNCI1Y2rre/klYkDmMj1CcRMedT3boWhwNF+hYKHZqc4vCKbAN2pY5 KyjmPCEcFD03mzniKS5GsR0dvCaTaf1bCrLpFmFpOSPViIzIoIERxxTQSmAud8Hgsg S2knzrno7V3blx7LkjDFLj1XYpUJ0CkFTOwsqtx0C0mXl0ZY4AOJ/TxqLYPoXeZShL TiDceTeQU3CbQ== Received: from lists1.osuosl.org (lists1.osuosl.org [140.211.166.142]) by smtp3.osuosl.org (Postfix) with ESMTP id 31BEC607DB; Sat, 10 Jan 2026 08:37:04 +0000 (UTC) Received: from smtp4.osuosl.org (smtp4.osuosl.org [IPv6:2605:bc80:3010::137]) by lists1.osuosl.org (Postfix) with ESMTP id 2868F18D for ; Sat, 10 Jan 2026 08:37:02 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp4.osuosl.org (Postfix) with ESMTP id B9072409D7 for ; Sat, 10 Jan 2026 08:36:57 +0000 (UTC) X-Virus-Scanned: amavis at osuosl.org Received: from smtp4.osuosl.org ([127.0.0.1]) by localhost (smtp4.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP id Ft5a_XNmPWuL for ; Sat, 10 Jan 2026 08:36:56 +0000 (UTC) Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=141.14.17.11; helo=mx3.molgen.mpg.de; envelope-from=pmenzel@molgen.mpg.de; receiver= DMARC-Filter: OpenDMARC Filter v1.4.2 smtp4.osuosl.org 091B9409D4 DKIM-Filter: OpenDKIM Filter v2.11.0 smtp4.osuosl.org 091B9409D4 Received: from mx3.molgen.mpg.de (mx3.molgen.mpg.de [141.14.17.11]) by smtp4.osuosl.org (Postfix) with ESMTPS id 091B9409D4 for ; Sat, 10 Jan 2026 08:36:54 +0000 (UTC) Received: from [192.168.2.217] (p5dc55726.dip0.t-ipconnect.de [93.197.87.38]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: pmenzel) by mx.molgen.mpg.de (Postfix) with ESMTPSA id 905F42394AFD3; Sat, 10 Jan 2026 09:35:59 +0100 (CET) Message-ID: <43dafae2-e1f1-44ce-91c1-7fc236966f58@molgen.mpg.de> Date: Sat, 10 Jan 2026 09:35:58 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird To: Mina Almasry Cc: netdev@vger.kernel.org, bpf@vger.kernel.org, linux-kernel@vger.kernel.org, YiFei Zhu , Alexei Starovoitov , Daniel Borkmann , "David S. Miller" , Jakub Kicinski , Jesper Dangaard Brouer , John Fastabend , Stanislav Fomichev , Tony Nguyen , Przemek Kitszel , Andrew Lunn , Eric Dumazet , Paolo Abeni , Alexander Lobakin , Richard Cochran , intel-wired-lan@lists.osuosl.org, Aleksandr Loktionov References: <20251223194649.3050648-1-almasrymina@google.com> Content-Language: en-US From: Paul Menzel In-Reply-To: <20251223194649.3050648-1-almasrymina@google.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Mailman-Original-Authentication-Results: smtp4.osuosl.org; dmarc=none (p=none dis=none) header.from=molgen.mpg.de Subject: Re: [Intel-wired-lan] [PATCH iwl-next v4] idpf: export RX hardware timestamping information to XDP X-BeenThere: intel-wired-lan@osuosl.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Intel Wired Ethernet Linux Kernel Driver Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-wired-lan-bounces@osuosl.org Sender: "Intel-wired-lan" Dear Mina, Thank you for your patch. Some minor comments, should you resend. Am 23.12.25 um 20:46 schrieb Mina Almasry via Intel-wired-lan: > From: YiFei Zhu > > The logic is similar to idpf_rx_hwtstamp, but the data is exported > as a BPF kfunc instead of appended to an skb to support grabbing > timestamps in xsk packets. > > A idpf_queue_has(PTP, rxq) condition is added to check the queue > supports PTP similar to idpf_rx_process_skb_fields. > > Tested using an xsk connection and checking xdp timestamps are > retreivable in received packets. retr*ie*vable It’d be great if you could share the commands. > Cc: intel-wired-lan@lists.osuosl.org > Signed-off-by: YiFei Zhu > Signed-off-by: Mina Almasry > Reviewed-by: Aleksandr Loktionov > > --- > > v4: https://lore.kernel.org/netdev/20251219202957.2309698-1-almasrymina@google.com/ > - Fix indentation (lobakin) > - I kept the (u64) casts for all bit shifted bits in idpf_xdp_get_qw3 > and friends as I see all idpf_xdp_get_qw* functions do the cast in all > bit-shifted variables. > > v3: https://lore.kernel.org/netdev/20251218022948.3288897-1-almasrymina@google.com/ > - Do the idpf_queue_has(PTP) check before we read qw1 (lobakin) > - Fix _qw1 not copying over ts_low on on !__LIBETH_WORD_ACCESS systems > (AI) > > v2: https://lore.kernel.org/netdev/20251122140839.3922015-1-almasrymina@google.com/ > - Fixed alphabetical ordering > - Use the xdp desc type instead of virtchnl one (required some added > helpers) > > --- > drivers/net/ethernet/intel/idpf/xdp.c | 31 +++++++++++++++++++++++++++ > drivers/net/ethernet/intel/idpf/xdp.h | 20 +++++++++++++++++ > 2 files changed, 51 insertions(+) > > diff --git a/drivers/net/ethernet/intel/idpf/xdp.c b/drivers/net/ethernet/intel/idpf/xdp.c > index 958d16f87424..0916d201bf98 100644 > --- a/drivers/net/ethernet/intel/idpf/xdp.c > +++ b/drivers/net/ethernet/intel/idpf/xdp.c > @@ -2,6 +2,7 @@ > /* Copyright (C) 2025 Intel Corporation */ > > #include "idpf.h" > +#include "idpf_ptp.h" > #include "idpf_virtchnl.h" > #include "xdp.h" > #include "xsk.h" > @@ -391,8 +392,38 @@ static int idpf_xdpmo_rx_hash(const struct xdp_md *ctx, u32 *hash, > pt); > } > > +static int idpf_xdpmo_rx_timestamp(const struct xdp_md *ctx, u64 *timestamp) > +{ > + const struct libeth_xdp_buff *xdp = (typeof(xdp))ctx; > + struct idpf_xdp_rx_desc desc __uninitialized; > + const struct idpf_rx_queue *rxq; > + u64 cached_time, ts_ns; > + u32 ts_high; > + > + rxq = libeth_xdp_buff_to_rq(xdp, typeof(*rxq), xdp_rxq); > + > + if (!idpf_queue_has(PTP, rxq)) > + return -ENODATA; > + > + idpf_xdp_get_qw1(&desc, xdp->desc); > + > + if (!(idpf_xdp_rx_ts_low(&desc) & VIRTCHNL2_RX_FLEX_TSTAMP_VALID)) > + return -ENODATA; > + > + cached_time = READ_ONCE(rxq->cached_phc_time); > + > + idpf_xdp_get_qw3(&desc, xdp->desc); > + > + ts_high = idpf_xdp_rx_ts_high(&desc); > + ts_ns = idpf_ptp_tstamp_extend_32b_to_64b(cached_time, ts_high); > + > + *timestamp = ts_ns; > + return 0; > +} > + > static const struct xdp_metadata_ops idpf_xdpmo = { > .xmo_rx_hash = idpf_xdpmo_rx_hash, > + .xmo_rx_timestamp = idpf_xdpmo_rx_timestamp, Append the unit? > }; > > void idpf_xdp_set_features(const struct idpf_vport *vport) > diff --git a/drivers/net/ethernet/intel/idpf/xdp.h b/drivers/net/ethernet/intel/idpf/xdp.h > index 479f5ef3c604..1748a0d73547 100644 > --- a/drivers/net/ethernet/intel/idpf/xdp.h > +++ b/drivers/net/ethernet/intel/idpf/xdp.h > @@ -112,11 +112,13 @@ struct idpf_xdp_rx_desc { > aligned_u64 qw1; > #define IDPF_XDP_RX_BUF GENMASK_ULL(47, 32) > #define IDPF_XDP_RX_EOP BIT_ULL(1) > +#define IDPF_XDP_RX_TS_LOW GENMASK_ULL(31, 24) > > aligned_u64 qw2; > #define IDPF_XDP_RX_HASH GENMASK_ULL(31, 0) > > aligned_u64 qw3; > +#define IDPF_XDP_RX_TS_HIGH GENMASK_ULL(63, 32) > } __aligned(4 * sizeof(u64)); > static_assert(sizeof(struct idpf_xdp_rx_desc) == > sizeof(struct virtchnl2_rx_flex_desc_adv_nic_3)); > @@ -128,6 +130,8 @@ static_assert(sizeof(struct idpf_xdp_rx_desc) == > #define idpf_xdp_rx_buf(desc) FIELD_GET(IDPF_XDP_RX_BUF, (desc)->qw1) > #define idpf_xdp_rx_eop(desc) !!((desc)->qw1 & IDPF_XDP_RX_EOP) > #define idpf_xdp_rx_hash(desc) FIELD_GET(IDPF_XDP_RX_HASH, (desc)->qw2) > +#define idpf_xdp_rx_ts_low(desc) FIELD_GET(IDPF_XDP_RX_TS_LOW, (desc)->qw1) > +#define idpf_xdp_rx_ts_high(desc) FIELD_GET(IDPF_XDP_RX_TS_HIGH, (desc)->qw3) > > static inline void > idpf_xdp_get_qw0(struct idpf_xdp_rx_desc *desc, > @@ -149,6 +153,9 @@ idpf_xdp_get_qw1(struct idpf_xdp_rx_desc *desc, > desc->qw1 = ((const typeof(desc))rxd)->qw1; > #else > desc->qw1 = ((u64)le16_to_cpu(rxd->buf_id) << 32) | > + ((u64)rxd->ts_low << 24) | > + ((u64)rxd->fflags1 << 16) | > + ((u64)rxd->status_err1 << 8) | > rxd->status_err0_qw1; > #endif > } > @@ -166,6 +173,19 @@ idpf_xdp_get_qw2(struct idpf_xdp_rx_desc *desc, > #endif > } > > +static inline void > +idpf_xdp_get_qw3(struct idpf_xdp_rx_desc *desc, > + const struct virtchnl2_rx_flex_desc_adv_nic_3 *rxd) > +{ > +#ifdef __LIBETH_WORD_ACCESS > + desc->qw3 = ((const typeof(desc))rxd)->qw3; > +#else > + desc->qw3 = ((u64)le32_to_cpu(rxd->ts_high) << 32) | > + ((u64)le16_to_cpu(rxd->fmd6) << 16) | > + le16_to_cpu(rxd->l2tag1); > +#endif It’s done elsewhere in the file, but I wonder why use the preprocessor and not plain C code, and let the linker(?) remove the unneeded branch? > +} > + > void idpf_xdp_set_features(const struct idpf_vport *vport); > > int idpf_xdp(struct net_device *dev, struct netdev_bpf *xdp); Kind regards, Paul