Re: Best way to share maps between multiple files/objects?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Nov 11, 2022 at 2:34 AM Dave Marchevsky <davemarchevsky@xxxxxxxx> wrote:
>
> On 11/10/22 7:32 PM, Grant Seltzer Richman wrote:
> > Hi folks,
> >
> > I want to organize my BPF programs so that I can load them
> > individually. I want this so that if loading one fails (because of
> > lack of kernel support for BPF features), I can load a fall-back
> > replacement program. To do so, I've organized the BPF programs into
> > their own source code files and compiled them individually. Each BPF
> > program references what is supposed to be the same ringbuffer. Using
> > libbpf I open them and attempt to load each in order.
> >
> > My question is, how am I supposed to share maps such as ringbuffers
> > between them? If I have identical map definitions in each, they have
> > their own file descriptors. Is the best way to call
> > `bpf_map__reuse_fd()` on each handle of the maps in each BPF object?
>
> Sounds like each of the source files have the exact same map definitions,
> including name? And each is compiled into a separate BPF object?
>
> If so, adding __uint(pinning, LIBBPF_PIN_BY_NAME); to
> each definition will probably be the easiest way to get the map reuse
> behavior you want. The first bpf object in the set that successfully loads
> will pin its maps by name in /sys/fs/bpf and future objects which load same
> maps will reuse them instead of creating new maps.

This worked beautifully, thank you for the suggestion!

>
> selftests/bpf/progs/test_pinning.c demonstrates this behavior.
>
> I'm curious, though: is this a single BPF program with various fallbacks,
> with goal of running only one? Or a set of N programs working together using
> same maps, each of which might have fallbacks, with goal of running some
> version of all N programs?

The latter. We have N programs all sharing M maps. Each program might
have fallbacks but some version should be loaded.

>
> > I'd also take advice on how to better achieve my overall goal of being
> > able to load programs individually!
>
> You can group each program together with its fallbacks in the same
> source file / BPF object by disabling autoload for all variants of the
> program via SEC("?foobar") syntax. Then in userspace you could turn
> autoload on for the first version you'd like to try after opening
> the BPF object, try loading the object, try with 2nd variant if that
> fails, etc.

Thank you for this suggestion as well, but it doesn't seem to work as
I get: `load can't be attempted twice`. Is this a potential bug?
`obj->loaded` is set to true regardless of success in
`bpf_object_load()`

>
> selftests/bpf/progs/dynptr_fail.c + verify_fail function in
> selftests/bpf/prog_tests/dynptr.c is an example of this pattern.
>
> > Thanks so much for your help,
> > Grant Seltzer



[Index of Archives]     [Linux Samsung SoC]     [Linux Rockchip SoC]     [Linux Actions SoC]     [Linux for Synopsys ARC Processors]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]


  Powered by Linux