The latency or time-delay between XDP and AF_XDP depend highly
on whether the XDP and AF_XDP runs on same CPU or remote CPU.
Extend xdp_hints_rx_time, without worrying about the layout
as BTF will adjust, so we can determine case of same CPU or
remote CPU.
Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com>
The stats poll doesn't take into account multiple XSK sockets.
Simply disable until there is time to fix it.
Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com>
Now that program process all queues it is relevant to know
what queue_id received the packet.
Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com>
Cannot share/associate the FQ (Fill Queue) and CQ (Completion Q) with
umem container (xsk_umem_info). This is the reason current program
cannot handle packets for each queue ID.
As described in [1] we need more FQ and CQ ring pairs, a pair per for each
unique netdev and queue IP tuple.
Thus, add FQ and CQ for each queue id in struct xsk_socket_info.
[1] https://www.kernel.org/doc/html/latest/networking/af_xdp.html
Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com>
It is confusing to name the option what will wait for packets
on the file descriptor, for --poll, just because the function
call have this name. It confusing as AF_XDP users often want
to busy-poll for packets (for max performance reasons).
Name the new option --wakeup instead of --wait as the effect
of waiting for the FD is that the kernel needs to wakeup
the userspace process.
Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com>
The macros XSK_BTF_READ_xxx doesn't handle or report on errors
if the input or field were wrong, which is not uncommon for macros.
The bad behavior is that the macro continue to dereference the
pointer even-when xsk_btf__read_xxx() functions returns an error.
This often leads to crashing the application.
Change macro to only dereference when no errors were reported.
Side-note: The compiler warnings will detect if API user didn't
init the 'dest' value with a default value. As the effect of
the change is that the 'dest' value will not be touch, and thus
contain the value before the macro was used.
Example:
warning: ‘mark’ may be used uninitialized in this function
Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com>
Zero init xdp_hints_rx_time, which means xdp_hints_rx_time.btf_type_id
is zero if setup_btf_info() didn't find the struct name.
In print_meta_info_via_btf() we also exit if btf_id is zero, as
this isn't a valid BTF type id.
Thus, we don't need to explicitly handle "error" case of a btf_type_id
being zero, it will just naturally not match when userspace could not
find the struct name.
Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com>
The 'struct xdp_hints_rx_time' exist both in kernel-side (af_xdp_kern.c)
and userspace program af_xdp_user.c, but are very different.
The kernel-side is the actual XDP-hints memory layout used in metadata area.
The userspace side uses the same struct name, but contains BTF info
that allow us to access the struct members from kernel-side struct.
The BTF info is extracted on userspace startup, from the BPF-prog
ELF data BTF section.
Caching BTF lookups at startup is done, as target application
is a real-time application.
Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com>
The local BTF code in af_xdp_user.c was only used for
debugging the BTF structures while developing and testing
the lib_xsk_extend.c code.
If is confusing for other reading the code, so simply
remove thisi, as the lib_xsk_extend.c should hide
these details fpr API users.
Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com>