On Wed, Dec 14, 2022 at 10:09 AM Martin KaFai Lau <martin.lau@xxxxxxxxx> wrote: > > On 12/14/22 2:47 AM, Toke Høiland-Jørgensen wrote: > > Jesper Dangaard Brouer <jbrouer@xxxxxxxxxx> writes: > > > >> On 13/12/2022 21.42, Stanislav Fomichev wrote: > >>> On Tue, Dec 13, 2022 at 7:55 AM Jesper Dangaard Brouer > >>> <jbrouer@xxxxxxxxxx> wrote: > >>>> > >>>> > >>>> On 13/12/2022 03.35, Stanislav Fomichev wrote: > >>>>> The goal is to enable end-to-end testing of the metadata for AF_XDP. > >>>>> > >>>>> Cc: John Fastabend <john.fastabend@xxxxxxxxx> > >>>>> Cc: David Ahern <dsahern@xxxxxxxxx> > >>>>> Cc: Martin KaFai Lau <martin.lau@xxxxxxxxx> > >>>>> Cc: Jakub Kicinski <kuba@xxxxxxxxxx> > >>>>> Cc: Willem de Bruijn <willemb@xxxxxxxxxx> > >>>>> Cc: Jesper Dangaard Brouer <brouer@xxxxxxxxxx> > >>>>> Cc: Anatoly Burakov <anatoly.burakov@xxxxxxxxx> > >>>>> Cc: Alexander Lobakin <alexandr.lobakin@xxxxxxxxx> > >>>>> Cc: Magnus Karlsson <magnus.karlsson@xxxxxxxxx> > >>>>> Cc: Maryam Tahhan <mtahhan@xxxxxxxxxx> > >>>>> Cc: xdp-hints@xxxxxxxxxxxxxxx > >>>>> Cc: netdev@xxxxxxxxxxxxxxx > >>>>> Signed-off-by: Stanislav Fomichev <sdf@xxxxxxxxxx> > >>>>> --- > >>>>> drivers/net/veth.c | 24 ++++++++++++++++++++++++ > >>>>> 1 file changed, 24 insertions(+) > >>>>> > >>>>> diff --git a/drivers/net/veth.c b/drivers/net/veth.c > >>>>> index 04ffd8cb2945..d5491e7a2798 100644 > >>>>> --- a/drivers/net/veth.c > >>>>> +++ b/drivers/net/veth.c > >>>>> @@ -118,6 +118,7 @@ static struct { > >>>>> > >>>>> struct veth_xdp_buff { > >>>>> struct xdp_buff xdp; > >>>>> + struct sk_buff *skb; > >>>>> }; > >>>>> > >>>>> static int veth_get_link_ksettings(struct net_device *dev, > >>>>> @@ -602,6 +603,7 @@ static struct xdp_frame *veth_xdp_rcv_one(struct veth_rq *rq, > >>>>> > >>>>> xdp_convert_frame_to_buff(frame, xdp); > >>>>> xdp->rxq = &rq->xdp_rxq; > >>>>> + vxbuf.skb = NULL; > >>>>> > >>>>> act = bpf_prog_run_xdp(xdp_prog, xdp); > >>>>> > >>>>> @@ -823,6 +825,7 @@ static struct sk_buff *veth_xdp_rcv_skb(struct veth_rq *rq, > >>>>> __skb_push(skb, skb->data - skb_mac_header(skb)); > >>>>> if (veth_convert_skb_to_xdp_buff(rq, xdp, &skb)) > >>>>> goto drop; > >>>>> + vxbuf.skb = skb; > >>>>> > >>>>> orig_data = xdp->data; > >>>>> orig_data_end = xdp->data_end; > >>>>> @@ -1601,6 +1604,21 @@ static int veth_xdp(struct net_device *dev, struct netdev_bpf *xdp) > >>>>> } > >>>>> } > >>>>> > >>>>> +static int veth_xdp_rx_timestamp(const struct xdp_md *ctx, u64 *timestamp) > >>>>> +{ > >>>>> + *timestamp = ktime_get_mono_fast_ns(); > >>>> > >>>> This should be reading the hardware timestamp in the SKB. > >>>> > >>>> Details: This hardware timestamp in the SKB is located in > >>>> skb_shared_info area, which is also available for xdp_frame (currently > >>>> used for multi-buffer purposes). Thus, when adding xdp-hints "store" > >>>> functionality, it would be natural to store the HW TS in the same place. > >>>> Making the veth skb/xdp_frame code paths able to share code. > >>> > >>> Does something like the following look acceptable as well? > >>> > >>> *timestamp = skb_hwtstamps(_ctx->skb)->hwtstamp; > > If it is to test the kfunc and ensure veth_xdp_rx_timestamp is called, this > alone should be enough. skb_hwtstamps(_ctx->skb)->hwtstamp should be 0 if > hwtstamp is unavailable? The test can initialize the 'u64 *timestamp' arg to > non-zero first. If it is not good enough, an fentry tracing can be done to > veth_xdp_rx_timestamp to ensure it is called also. There is also fmod_ret that > could change the return value but the timestamp is not the return value though. > > If the above is not enough, another direction of thought could be doing it > through bpf_prog_test_run_xdp() but it will need a way to initialize the > veth_xdp_buff. > > That said, overall, I don't think it is a good idea to bend the > veth_xdp_rx_timestamp kfunc too much only for testing purpose unless there is no > other way out. Oh, good point about just making sure veth_xdp_rx_timestamp returns timestamp=0. That should be enough, thanks!