igc: Fix HW RX timestamp when passed by ZC XDP
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: 069b142f58
("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>
Tested-by: Mor Bar-Gabay <morx.bar.gabay@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
This commit is contained in:
parent
61fb097f9a
commit
7822dd4d6d
1 changed files with 12 additions and 9 deletions
|
@ -2701,8 +2701,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;
|
||||
|
@ -2721,27 +2722,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;
|
||||
|
||||
|
@ -2777,7 +2779,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;
|
||||
|
||||
|
@ -2807,6 +2808,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;
|
||||
|
@ -2815,7 +2818,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);
|
||||
|
|
Loading…
Add table
Reference in a new issue