On Tue, 2024-04-02 at 10:12 -0700, Stephen Hemminger wrote:
> There were multiple issues in the RSS queue support in the TAP
> driver. This required extensive rework of the BPF support.
> 
> Change the BPF loading to use bpftool to
> create a skeleton header file, and load with libbpf.
> The BPF is always compiled from source so less chance that
> source and instructions diverge. Also resolves issue where
> libbpf and source get out of sync. The program
> is only loaded once, so if multiple rules are created
> only one BPF program is loaded in kernel.
> 
> The new BPF program only needs a single action.
> No need for action and re-classification step.
> 
> It alsow fixes the missing bits from the original.
>     - supports setting RSS key per flow
>     - level of hash can be L3 or L3/L4.
> 
> Signed-off-by: Stephen Hemminger <step...@networkplumber.org>
> ---
>  drivers/net/tap/bpf/meson.build |  14 +-
>  drivers/net/tap/meson.build     |  29 +--
>  drivers/net/tap/rte_eth_tap.c   |   2 +
>  drivers/net/tap/rte_eth_tap.h   |   9 +-
>  drivers/net/tap/tap_flow.c      | 410 +++++++-------------------------
>  drivers/net/tap/tap_flow.h      |  16 +-
>  drivers/net/tap/tap_rss.h       |  10 +-
>  drivers/net/tap/tap_tcmsgs.h    |   4 +-
>  8 files changed, 127 insertions(+), 367 deletions(-)
> 
> diff --git a/drivers/net/tap/bpf/meson.build b/drivers/net/tap/bpf/meson.build
> index f2c03a19fd..3f3c4e6602 100644
> --- a/drivers/net/tap/bpf/meson.build
> +++ b/drivers/net/tap/bpf/meson.build
> @@ -3,15 +3,24 @@
>  
>  enable_tap_rss = false
>  
> +# Loading BPF requires libbpf
>  libbpf = dependency('libbpf', required: false, method: 'pkg-config')
>  if not libbpf.found()
>      message('net/tap: no RSS support missing libbpf')
>      subdir_done()
>  endif
>  
> +# Making skeleton needs bpftool
>  # Debian install this in /usr/sbin which is not in $PATH
> -bpftool = find_program('bpftool', '/usr/sbin/bpftool', required: false, 
> version: '>= 5.6.0')
> -if not bpftool.found()
> +bpftool_supports_skel = false
> +bpftool = find_program('bpftool', '/usr/sbin/bpftool', required: false)
> +if bpftool.found()
> +    # Some Ubuntu has non-functional bpftool
> +    bpftool_supports_skel = run_command(bpftool, 'gen', 'help',
> +                                        check:false).returncode() == 0
> +endif

Using bpftool to generate the header at build time is a bit icky,
because it will look at sysfs on the build system, which is from the
running kernel. But a build system's kernel might be some ancient LTS,
and even be a completely different kconfig/build/distro from the actual
runtime one.

We have ran in the same problem in systemd recently, and the solution
is to have distros publish the vmlinux.h together with the kernel
image/headers, that way we can rely on the fact that by build-depending
on the right kernel package we get exactly the generated vmlinux.h that
we want. This has already happened in Centos, Debian, Fedora and Arch,
and I am trying to get Ubuntu onboard too.

The annoying thing is that every distro packages differently, so the
path needs to be configurable with a meson option.

Feel free to pilfer the systemd meson glue:

https://github.com/systemd/systemd/pull/26826/commits/d917079e7e320aa281fc4ad6f8073b0814b9cb13

It's of course file to go to the runtime kernel if no vmlinux.h is
specified, as a fallback, which is going to be useful for developers
machines.

-- 
Kind regards,
Luca Boccassi

Reply via email to