From nobody Mon Feb 9 21:58:36 2026 Received: from mta-65-225.siemens.flowmailer.net (mta-65-225.siemens.flowmailer.net [185.136.65.225]) (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 4D19A1A23B1 for ; Tue, 28 Jan 2025 12:37:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.136.65.225 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738067851; cv=none; b=r1Lf2fehWNvgOXN8Woi7rBL8yw4SxJqryAlehkOEruPQys2Kabu+UwY/iD/We4SHuIMNlP841j8iCWmXDFtanPoyMkyDeos9MZQU2hFAW/5STAXOomHvo5ryEQmeL9zcllbGmZDfRBATxS8gu2VOH8K55CRS6/QetG4CqxrDXlk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738067851; c=relaxed/simple; bh=1gWtyaI+egDjezQYz9OVoseWuHwXlTKaft5yT0HP2UY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:To:Cc; b=C07SKg10Cs2CEUO1A6YWPDE4jpQNOJ9lq6Hw3KYPgT3SLmY/QT8aEJ7VyFymJICdTuLXCjgtMOJC5zZPwz0n7Poc8V3jiBT5KMSjyd81eDXNuQQTA4bg9z6I3guovsC6LXPaLYDBlkinRM3gIghxfTW7wVZRUdYYa3aOwMT72Zg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=siemens.com; spf=pass smtp.mailfrom=rts-flowmailer.siemens.com; dkim=pass (2048-bit key) header.d=siemens.com header.i=zdenek.bouska@siemens.com header.b=hQqdfVBP; arc=none smtp.client-ip=185.136.65.225 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=siemens.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rts-flowmailer.siemens.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=siemens.com header.i=zdenek.bouska@siemens.com header.b="hQqdfVBP" Received: by mta-65-225.siemens.flowmailer.net with ESMTPSA id 2025012812271552ba79b795aa11d0f1 for ; Tue, 28 Jan 2025 13:27:15 +0100 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; s=fm2; d=siemens.com; i=zdenek.bouska@siemens.com; h=Date:From:Subject:To:Message-ID:MIME-Version:Content-Type:Content-Transfer-Encoding:Cc; bh=p4ixpKONXaTxPgBnMeyq9hz7nD1mrYbVaBMo2Q6Zl2w=; b=hQqdfVBP3AM7WaZHqHi1myUev0D3MsOvJpsfORbVHsl8HkRZx6Rzx1cU+7jTaPu/kHngdL oEi6uxyZSpu3Av4Rq3WjG+O5rDPrtU4OzJLw73iw47usrcTl6SjrRQKRtt6yPRBIDRNHyNwZ fFxzKjH3oyYZBh/3R1h01hGluE4XVGYQlZ9CQdeYjIMNHjbInQSVEpxdOprKSAdNkUMhM1i7 tzrLfGplmbAfDHzMi2iCkBl1nhQAGllXJ0rbdoCd9XnZLR73MckcFyM/DyzlpEhA/FMBoiSY WTDjA87pns/piTcjqm7HU+LifhzLcSUCcNGlnWTNHfWeJHh98DpuDbMQ==; From: Zdenek Bouska Date: Tue, 28 Jan 2025 13:26:48 +0100 Subject: [PATCH] igc: Fix HW RX timestamp when passed by ZC XDP 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: <20250128-igc-fix-hw-rx-timestamp-when-passed-by-zc-xdp-v1-1-b765d3e972de@siemens.com> X-B4-Tracking: v=1; b=H4sIAAfNmGcC/x2NwQ7CIBAFf6XZsy+BxibqrxgPCEvZQ5GwjUWb/ rvE4xxmZiflKqx0G3aq/BaVV+5gTwP55PLMkNCZRjNOxo4XyOwRpSFtqA2rLKyrWwq2xBnFqXL A84OvRwsF1ymwM9bEaM/Um6Vyl/+/++M4fhyn/7t/AAAA To: Tony Nguyen , Przemek Kitszel , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Alexei Starovoitov , Daniel Borkmann , Jesper Dangaard Brouer , John Fastabend , Vinicius Costa Gomes , Florian Bezdeka , Jan Kiszka , Song Yoong Siang Cc: intel-wired-lan@lists.osuosl.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, bpf@vger.kernel.org, Zdenek Bouska X-Flowmailer-Platform: Siemens Feedback-ID: 519:519-1328595:519-21489:flowmailer Fixes HW RX timestamp in the following scenario: - AF_PACKET socket with enabled HW RX timestamps is created - AF_XDP socket with enabled zero copy is created - frame is forwarded to the BPF program, where the timestamp should still be readable (extracted by igc_xdp_rx_timestamp(), kfunc behind bpf_xdp_metadata_rx_timestamp()) - the frame got XDP_PASS from BPF program, redirecting to the stack - AF_PACKET socket receives the frame with HW RX timestamp Moves the skb timestamp setting from igc_dispatch_skb_zc() to igc_construct_skb_zc() so that igc_construct_skb_zc() is similar to igc_construct_skb(). This issue can also be reproduced by running: # tools/testing/selftests/bpf/xdp_hw_metadata enp1s0 When a frame with the wrong port 9092 (instead of 9091) is used: # echo -n xdp | nc -u -q1 192.168.10.9 9092 then the RX timestamp is missing and xdp_hw_metadata prints: skb hwtstamp is not found! With this fix or when copy mode is used: # tools/testing/selftests/bpf/xdp_hw_metadata -c enp1s0 then RX timestamp is found and xdp_hw_metadata prints: found skb hwtstamp =3D 1736509937.852786132 Fixes: 069b142f5819 ("igc: Add support for PTP .getcyclesx64()") Signed-off-by: Zdenek Bouska Acked-by: Vinicius Costa Gomes Reviewed-by: Florian Bezdeka Reviewed-by: Simon Horman Reviewed-by: Song Yoong Siang Tested-by: Mor Bar-Gabay --- drivers/net/ethernet/intel/igc/igc_main.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/drivers/net/ethernet/intel/igc/igc_main.c b/drivers/net/ethern= et/intel/igc/igc_main.c index 27872bdea9bd..d6c3147725b7 100644 --- a/drivers/net/ethernet/intel/igc/igc_main.c +++ b/drivers/net/ethernet/intel/igc/igc_main.c @@ -2707,8 +2707,9 @@ static int igc_clean_rx_irq(struct igc_q_vector *q_ve= ctor, const int budget) } =20 static struct sk_buff *igc_construct_skb_zc(struct igc_ring *ring, - struct xdp_buff *xdp) + struct igc_xdp_buff *ctx) { + struct xdp_buff *xdp =3D &ctx->xdp; unsigned int totalsize =3D xdp->data_end - xdp->data_meta; unsigned int metasize =3D xdp->data - xdp->data_meta; struct sk_buff *skb; @@ -2727,27 +2728,28 @@ static struct sk_buff *igc_construct_skb_zc(struct = igc_ring *ring, __skb_pull(skb, metasize); } =20 + if (ctx->rx_ts) { + skb_shinfo(skb)->tx_flags |=3D SKBTX_HW_TSTAMP_NETDEV; + skb_hwtstamps(skb)->netdev_data =3D ctx->rx_ts; + } + return skb; } =20 static void igc_dispatch_skb_zc(struct igc_q_vector *q_vector, union igc_adv_rx_desc *desc, - struct xdp_buff *xdp, - ktime_t timestamp) + struct igc_xdp_buff *ctx) { struct igc_ring *ring =3D q_vector->rx.ring; struct sk_buff *skb; =20 - skb =3D igc_construct_skb_zc(ring, xdp); + skb =3D igc_construct_skb_zc(ring, ctx); if (!skb) { ring->rx_stats.alloc_failed++; set_bit(IGC_RING_FLAG_RX_ALLOC_FAILED, &ring->flags); return; } =20 - if (timestamp) - skb_hwtstamps(skb)->hwtstamp =3D timestamp; - if (igc_cleanup_headers(ring, desc, skb)) return; =20 @@ -2783,7 +2785,6 @@ static int igc_clean_rx_irq_zc(struct igc_q_vector *q= _vector, const int budget) union igc_adv_rx_desc *desc; struct igc_rx_buffer *bi; struct igc_xdp_buff *ctx; - ktime_t timestamp =3D 0; unsigned int size; int res; =20 @@ -2813,6 +2814,8 @@ static int igc_clean_rx_irq_zc(struct igc_q_vector *q= _vector, const int budget) */ bi->xdp->data_meta +=3D IGC_TS_HDR_LEN; size -=3D IGC_TS_HDR_LEN; + } else { + ctx->rx_ts =3D NULL; } =20 bi->xdp->data_end =3D bi->xdp->data + size; @@ -2821,7 +2824,7 @@ static int igc_clean_rx_irq_zc(struct igc_q_vector *q= _vector, const int budget) res =3D __igc_xdp_run_prog(adapter, prog, bi->xdp); switch (res) { case IGC_XDP_PASS: - igc_dispatch_skb_zc(q_vector, desc, bi->xdp, timestamp); + igc_dispatch_skb_zc(q_vector, desc, ctx); fallthrough; case IGC_XDP_CONSUMED: xsk_buff_free(bi->xdp); --- base-commit: ffd294d346d185b70e28b1a28abe367bbfe53c04 change-id: 20250128-igc-fix-hw-rx-timestamp-when-passed-by-zc-xdp-95dea010f= f14 Best regards, --=20 Zdenek Bouska Siemens, s.r.o. Foundational Technologies