On Tue, Nov 15, 2022 at 2:46 PM Toke Høiland-Jørgensen <toke@xxxxxxxxxx> wrote: > > Stanislav Fomichev <sdf@xxxxxxxxxx> writes: > > > On Tue, Nov 15, 2022 at 8:17 AM Toke Høiland-Jørgensen <toke@xxxxxxxxxx> wrote: > >> > >> Stanislav Fomichev <sdf@xxxxxxxxxx> writes: > >> > >> > The goal is to enable end-to-end testing of the metadata > >> > for AF_XDP. Current rx_timestamp kfunc returns current > >> > time which should be enough to exercise this new functionality. > >> > > >> > 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 | 14 ++++++++++++++ > >> > 1 file changed, 14 insertions(+) > >> > > >> > diff --git a/drivers/net/veth.c b/drivers/net/veth.c > >> > index 2a4592780141..c626580a2294 100644 > >> > --- a/drivers/net/veth.c > >> > +++ b/drivers/net/veth.c > >> > @@ -25,6 +25,7 @@ > >> > #include <linux/filter.h> > >> > #include <linux/ptr_ring.h> > >> > #include <linux/bpf_trace.h> > >> > +#include <linux/bpf_patch.h> > >> > #include <linux/net_tstamp.h> > >> > > >> > #define DRV_NAME "veth" > >> > @@ -1659,6 +1660,18 @@ static int veth_xdp(struct net_device *dev, struct netdev_bpf *xdp) > >> > } > >> > } > >> > > >> > +static void veth_unroll_kfunc(const struct bpf_prog *prog, u32 func_id, > >> > + struct bpf_patch *patch) > >> > +{ > >> > + if (func_id == xdp_metadata_kfunc_id(XDP_METADATA_KFUNC_RX_TIMESTAMP_SUPPORTED)) { > >> > + /* return true; */ > >> > + bpf_patch_append(patch, BPF_MOV64_IMM(BPF_REG_0, 1)); > >> > + } else if (func_id == xdp_metadata_kfunc_id(XDP_METADATA_KFUNC_RX_TIMESTAMP)) { > >> > + /* return ktime_get_mono_fast_ns(); */ > >> > + bpf_patch_append(patch, BPF_EMIT_CALL(ktime_get_mono_fast_ns)); > >> > + } > >> > +} > >> > >> So these look reasonable enough, but would be good to see some examples > >> of kfunc implementations that don't just BPF_CALL to a kernel function > >> (with those helper wrappers we were discussing before). > > > > Let's maybe add them if/when needed as we add more metadata support? > > xdp_metadata_export_to_skb has an example, and rfc 1/2 have more > > examples, so it shouldn't be a problem to resurrect them back at some > > point? > > Well, the reason I asked for them is that I think having to maintain the > BPF code generation in the drivers is probably the biggest drawback of > the kfunc approach, so it would be good to be relatively sure that we > can manage that complexity (via helpers) before we commit to this :) Right, and I've added a bunch of examples in v2 rfc so we can judge whether that complexity is manageable or not :-) Do you want me to add those wrappers you've back without any real users? Because I had to remove my veth tstamp accessors due to John/Jesper objections; I can maybe bring some of this back gated by some static_branch to avoid the fastpath cost?