* [PATCH] igc: Fix HW RX timestamp when passed by ZC XDP
@ 2025-01-28 12:26 Zdenek Bouska
2025-01-30 23:42 ` Vinicius Costa Gomes
` (4 more replies)
0 siblings, 5 replies; 6+ messages in thread
From: Zdenek Bouska @ 2025-01-28 12:26 UTC (permalink / raw)
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, netdev, linux-kernel, bpf, Zdenek Bouska
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 = 1736509937.852786132
Fixes: 069b142f5819 ("igc: Add support for PTP .getcyclesx64()")
Signed-off-by: Zdenek Bouska <zdenek.bouska@siemens.com>
---
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/ethernet/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_vector, const int budget)
}
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 = &ctx->xdp;
unsigned int totalsize = xdp->data_end - xdp->data_meta;
unsigned int metasize = 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);
}
+ if (ctx->rx_ts) {
+ skb_shinfo(skb)->tx_flags |= SKBTX_HW_TSTAMP_NETDEV;
+ skb_hwtstamps(skb)->netdev_data = ctx->rx_ts;
+ }
+
return skb;
}
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 = q_vector->rx.ring;
struct sk_buff *skb;
- skb = igc_construct_skb_zc(ring, xdp);
+ skb = igc_construct_skb_zc(ring, ctx);
if (!skb) {
ring->rx_stats.alloc_failed++;
set_bit(IGC_RING_FLAG_RX_ALLOC_FAILED, &ring->flags);
return;
}
- if (timestamp)
- skb_hwtstamps(skb)->hwtstamp = timestamp;
-
if (igc_cleanup_headers(ring, desc, skb))
return;
@@ -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 = 0;
unsigned int size;
int res;
@@ -2813,6 +2814,8 @@ static int igc_clean_rx_irq_zc(struct igc_q_vector *q_vector, const int budget)
*/
bi->xdp->data_meta += IGC_TS_HDR_LEN;
size -= IGC_TS_HDR_LEN;
+ } else {
+ ctx->rx_ts = NULL;
}
bi->xdp->data_end = 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 = __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-95dea010ff14
Best regards,
--
Zdenek Bouska
Siemens, s.r.o.
Foundational Technologies
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH] igc: Fix HW RX timestamp when passed by ZC XDP
2025-01-28 12:26 [PATCH] igc: Fix HW RX timestamp when passed by ZC XDP Zdenek Bouska
@ 2025-01-30 23:42 ` Vinicius Costa Gomes
2025-01-31 10:05 ` Simon Horman
` (3 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Vinicius Costa Gomes @ 2025-01-30 23:42 UTC (permalink / raw)
To: Zdenek Bouska, Tony Nguyen, Przemek Kitszel, Andrew Lunn,
David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Alexei Starovoitov, Daniel Borkmann, Jesper Dangaard Brouer,
John Fastabend, Florian Bezdeka, Jan Kiszka, Song Yoong Siang
Cc: intel-wired-lan, netdev, linux-kernel, bpf, Zdenek Bouska
Zdenek Bouska <zdenek.bouska@siemens.com> writes:
> 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 = 1736509937.852786132
>
> Fixes: 069b142f5819 ("igc: Add support for PTP .getcyclesx64()")
> Signed-off-by: Zdenek Bouska <zdenek.bouska@siemens.com>
Acked-by: Vinicius Costa Gomes <vinicius.gomes@intel.com>
Cheers,
--
Vinicius
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] igc: Fix HW RX timestamp when passed by ZC XDP
2025-01-28 12:26 [PATCH] igc: Fix HW RX timestamp when passed by ZC XDP Zdenek Bouska
2025-01-30 23:42 ` Vinicius Costa Gomes
@ 2025-01-31 10:05 ` Simon Horman
2025-01-31 13:13 ` Florian Bezdeka
` (2 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Simon Horman @ 2025-01-31 10:05 UTC (permalink / raw)
To: Zdenek Bouska
Cc: 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, intel-wired-lan, netdev, linux-kernel, bpf
On Tue, Jan 28, 2025 at 01:26:48PM +0100, Zdenek Bouska wrote:
> 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 = 1736509937.852786132
>
> Fixes: 069b142f5819 ("igc: Add support for PTP .getcyclesx64()")
> Signed-off-by: Zdenek Bouska <zdenek.bouska@siemens.com>
Reviewed-by: Simon Horman <horms@kernel.org>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] igc: Fix HW RX timestamp when passed by ZC XDP
2025-01-28 12:26 [PATCH] igc: Fix HW RX timestamp when passed by ZC XDP Zdenek Bouska
2025-01-30 23:42 ` Vinicius Costa Gomes
2025-01-31 10:05 ` Simon Horman
@ 2025-01-31 13:13 ` Florian Bezdeka
2025-01-31 13:36 ` Song, Yoong Siang
2025-02-06 12:47 ` [Intel-wired-lan] " Mor Bar-Gabay
4 siblings, 0 replies; 6+ messages in thread
From: Florian Bezdeka @ 2025-01-31 13:13 UTC (permalink / raw)
To: Zdenek Bouska, 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, Song Yoong Siang
Cc: intel-wired-lan, netdev, linux-kernel, bpf, Jan Kiszka
On Tue, 2025-01-28 at 13:26 +0100, Zdenek Bouska wrote:
> 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 = 1736509937.852786132
>
> Fixes: 069b142f5819 ("igc: Add support for PTP .getcyclesx64()")
> Signed-off-by: Zdenek Bouska <zdenek.bouska@siemens.com>
> ---
Reviewed-by: Florian Bezdeka <florian.bezdeka@siemens.com>
^ permalink raw reply [flat|nested] 6+ messages in thread
* RE: [PATCH] igc: Fix HW RX timestamp when passed by ZC XDP
2025-01-28 12:26 [PATCH] igc: Fix HW RX timestamp when passed by ZC XDP Zdenek Bouska
` (2 preceding siblings ...)
2025-01-31 13:13 ` Florian Bezdeka
@ 2025-01-31 13:36 ` Song, Yoong Siang
2025-02-06 12:47 ` [Intel-wired-lan] " Mor Bar-Gabay
4 siblings, 0 replies; 6+ messages in thread
From: Song, Yoong Siang @ 2025-01-31 13:36 UTC (permalink / raw)
To: Bouska, Zdenek, Nguyen, Anthony L, Kitszel, Przemyslaw,
Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Alexei Starovoitov, Daniel Borkmann,
Jesper Dangaard Brouer, John Fastabend, Gomes, Vinicius,
Bezdeka, Florian, Kiszka, Jan
Cc: intel-wired-lan@lists.osuosl.org, netdev@vger.kernel.org,
linux-kernel@vger.kernel.org, bpf@vger.kernel.org, Bouska, Zdenek
On Tuesday, January 28, 2025 8:27 PM, Zdenek Bouska <zdenek.bouska@siemens.com> wrote:
>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 = 1736509937.852786132
>
>Fixes: 069b142f5819 ("igc: Add support for PTP .getcyclesx64()")
>Signed-off-by: Zdenek Bouska <zdenek.bouska@siemens.com>
This patch LGTM and tested working on my side with xdp_hw_metadata
self-test app on XDP_PASS scenario.
Thanks for the patch.
Reviewed-by: Song Yoong Siang <yoong.siang.song@intel.com>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Intel-wired-lan] [PATCH] igc: Fix HW RX timestamp when passed by ZC XDP
2025-01-28 12:26 [PATCH] igc: Fix HW RX timestamp when passed by ZC XDP Zdenek Bouska
` (3 preceding siblings ...)
2025-01-31 13:36 ` Song, Yoong Siang
@ 2025-02-06 12:47 ` Mor Bar-Gabay
4 siblings, 0 replies; 6+ messages in thread
From: Mor Bar-Gabay @ 2025-02-06 12:47 UTC (permalink / raw)
To: Zdenek Bouska, 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, netdev, linux-kernel, bpf
On 28/01/2025 14:26, Zdenek Bouska wrote:
> 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 = 1736509937.852786132
>
> Fixes: 069b142f5819 ("igc: Add support for PTP .getcyclesx64()")
> Signed-off-by: Zdenek Bouska <zdenek.bouska@siemens.com>
> Acked-by: Vinicius Costa Gomes <vinicius.gomes@intel.com>
> Reviewed-by: Simon Horman <horms@kernel.org>
> Reviewed-by: Florian Bezdeka <florian.bezdeka@siemens.com>
> Reviewed-by: Song Yoong Siang <yoong.siang.song@intel.com>
> ---
> drivers/net/ethernet/intel/igc/igc_main.c | 21 ++++++++++++---------
> 1 file changed, 12 insertions(+), 9 deletions(-)
>
Tested-by: Mor Bar-Gabay <morx.bar.gabay@intel.com>
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2025-02-06 12:47 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-01-28 12:26 [PATCH] igc: Fix HW RX timestamp when passed by ZC XDP Zdenek Bouska
2025-01-30 23:42 ` Vinicius Costa Gomes
2025-01-31 10:05 ` Simon Horman
2025-01-31 13:13 ` Florian Bezdeka
2025-01-31 13:36 ` Song, Yoong Siang
2025-02-06 12:47 ` [Intel-wired-lan] " Mor Bar-Gabay
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).