On 06/10/2022 11.14, Magnus Karlsson wrote:
On Wed, Oct 5, 2022 at 9:27 PM Martin KaFai Lau <martin.lau@xxxxxxxxx> wrote:
On 10/4/22 7:15 PM, Stanislav Fomichev wrote:
On Tue, Oct 4, 2022 at 6:24 PM Jakub Kicinski <kuba@xxxxxxxxxx> wrote:
On Tue, 4 Oct 2022 18:02:56 -0700 Stanislav Fomichev wrote:
+1, sounds like a good alternative (got your reply while typing)
I'm not too versed in the rx_desc/rx_queue area, but seems like worst
case that bpf_xdp_get_hwtstamp can probably receive a xdp_md ctx and
parse it out from the pre-populated metadata?
I'd think so, worst case the driver can put xdp_md into a struct
and container_of() to get to its own stack with whatever fields
it needs.
Ack, seems like something worth exploring then.
The only issue I see with that is that we'd probably have to extend
the loading api to pass target xdp device so we can pre-generate
per-device bytecode for those kfuncs?
There is an existing attr->prog_ifindex for dev offload purpose. May be we can
re-purpose/re-use some of the offload API. How this kfunc can be presented also
needs some thoughts, could be a new ndo_xxx.... not sure.
And this potentially will block attaching the same program
> to different drivers/devices?
Or, Martin, did you maybe have something better in mind?
If the kfunc/helper is inline, then it will have to be per device. Unless the
bpf prog chooses not to inline which could be an option but I am also not sure
how often the user wants to 'attach' a loaded xdp prog to a different device.
To some extend, the CO-RE hints-loading-code will have to be per device also, no?
Why I asked the kfunc/helper approach is because, from the set, it seems the
hints has already been available at the driver. The specific knowledge that the
xdp prog missing is how to get the hints from the rx_desc/rx_queue. The
straight forward way to me is to make them (rx_desc/rx_queue) available to xdp
prog and have kfunc/helper to extract the hints from them only if the xdp prog
needs it. The xdp prog can selectively get what hints it needs and then
optionally store them into the meta area in any layout.
This sounds like a really good idea to me, well worth exploring. To
only have to pay, performance wise, for the metadata you actually use
is very important. I did some experiments [1] on the previous patch
set of Jesper's and there is substantial overhead added for each
metadata enabled (and fetched from the NIC). This is especially
important for AF_XDP in zero-copy mode where most packets are directed
to user-space (if not, you should be using the regular driver that is
optimized for passing packets to the stack or redirecting to other
devices). In this case, the user knows exactly what metadata it wants
and where in the metadata area it should be located in order to offer
the best performance for the application in question. But as you say,
your suggestion could potentially offer a good performance upside to
the regular XDP path too.
Okay, lets revisit this again. And let me explain why I believe this
isn't going to fly.
I was also my initial though, lets just give XDP BPF-prog direct access
to the NIC rx_descriptor, or another BPF-prog populate XDP-hints prior
to calling XDP-prog. Going down this path (previously) I learned three
things:
(1) Understanding/decoding rx_descriptor requires access to the
programmers datasheet, because it is very compacted and the mean of the
bits depend on other bits and plus current configuration status of the HW.
(2) HW have bugs and for certain chip revisions driver will skip some
offload hints. Thus, chip revisions need to be exported to BPF-progs
and handled appropriately.
(3) Sometimes the info is actually not available in the rx_descriptor.
Often for HW timestamps, the timestamp need to be read from a HW
register. How do we expose this to the BPF-prog?
[1] https://lore.kernel.org/bpf/CAJ8uoz1XVqVCpkKo18qbkh6jq_Lejk24OwEWCB9cWhokYLEBDQ@xxxxxxxxxxxxxx/
Notice that this patchset doesn't block this idea, as it is orthogonal.
After we have established a way to express xdp_hints layouts via BTF,
then we can still add a pre-XDP BPF-prog that populates the XDP-hints,
and squeeze out more performance by skipping some of the offloads that
your-specific-XDP-prog are not interested in.
--Jesper