Re: [RFC PATCH bpf-next 0/2] libbpf: Improve BPF load performance by selectively loading kmod BTFs

Alan Maguire <[email protected]>
Newsgroups org.kernel.vger.bpf
Message-ID <[email protected]>
On 10/08/2026 07:20, Fuyu Zhao wrote:
> 
> 
> On 8/8/2026 6:18 AM, Andrii Nakryiko wrote:
>> On Wed, Aug 5, 2026 at 9:21 PM Fuyu Zhao <[email protected]> wrote:
>>>
>>> Currently, during BPF object loading, load_module_btfs() unconditionally
>>> iterates over all loaded kernel modules and loads their BTFs. This
>>> introduces unnecessary overhead when a BPF program only needs a specific,
>>> small subset of modules. In environments with hundreds of modules,
>>> loading all module measurably increases the loading time.
>>>
>>> This series introduces a ".kmod_btfs" ELF section, allowing BPF programs
>>> to declare the modules that need BTF loading. libbpf parses this
>>> section, collects the module names, and skips loading BTFs for any
>>> module not in the list, thereby reducing overhead. It also stops the
>>> iteration early once all declared modules are found.
>>>
>>> Usage example:
>>>
>>>   DEFINE_KMOD_BTFS(_needed_kmods) = { "bpf_testmod" };
>>>
>>> Performance impact (<skel>__open_and_load() time):
>>>
>>>   Modules loaded | Without .kmod_btfs | With .kmod_btfs | Speedup
>>>   ---------------|--------------------|-----------------|--------
>>>   1              | 35.0 ms            | 35.0 ms         | Baseline
>>>   10             | 36.5 ms            | 35.1 ms         | +3.8%
>>>   100            | 46.2 ms            | 35.9 ms         | +22.3%
>>>   300            | 65.2 ms            | 38.0 ms         | +41.7%
>>
>> First, is 30ms start up overhead really such a big deal when it comes
>> to one-time thing that sets up a bunch of BPF programs? Can you
>> elaborate on the use case you have that actually is harmed by this
>> libbpf behavior?
>>
> 
> Hi Andrii,
> 
> Thanks for the feedback, and sorry for the delayed response.
> 
> To clarify the use case, we use `sched_ext` on Android mobile platforms
> and dynamically switch schedulers for performance-sensitive scenarios,
> such as gaming workloads. The BPF programs are loaded on demand when a
> scheduler switch is required, rather than being initialized once during
> system startup. Since the scheduler switch happens on the critical path
> of user interaction, the setup latency directly affects the perceived
> responsiveness of the system.
> 
> On Android devices, the impact of `load_module_btfs()` is even more
> pronounced in our use case. In our testing, loading BTFs for all modules
> takes more than 300 ms (with 93 module BTFs), which accounts for around
> 69% of the total BPF loading time. Such a delay during the scheduler
> transition can cause visible frame drops in latency-sensitive workloads.
> 
> We also tried preloading the BPF programs. However, this does not fit
> well with our use case. Mobile devices have tighter memory constraints,
> and we avoid keeping unused BPF programs resident when they are not
> needed. Since different workloads may require different schedulers,
> preloading all possible BPF programs would introduce unnecessary memory
> overhead.
> 
> By allowing a BPF program to explicitly declare the required kernel
> modules through `.kmod_btfs`, libbpf can avoid loading unrelated module
> BTFs and significantly reduce the loading latency without increasing the
> memory footprint of inactive features.
>

the approach of having an extra section .kmod_btfs feels a bit unwieldy;
we already support kernel/module qualification in autoload section names
via

SEC("fentry/mymod:foo")
SEC("fexit/vmlinux:bar")

Couldn't you use that instead to inform selective lookup in find_kernel_btf_id()?

 
> Hope this clarifies the motivation behind this change. Thanks again for
> the feedback.
> 
> Best regards,
> Fuyu
> 
>>>
>>> Fuyu Zhao (2):
>>>   libbpf: support selective kernel module BTF loading via .kmod_btfs
>>>     section
>>>   selftests/bpf: add tests for selective kmod BTF loading
>>>
>>>  tools/lib/bpf/bpf_helpers.h                   |  14 +++
>>>  tools/lib/bpf/libbpf.c                        | 112 ++++++++++++++++++
>>>  .../selftests/bpf/prog_tests/kmod_btfs.c      |  47 ++++++++
>>>  tools/testing/selftests/bpf/progs/kmod_btfs.c |  14 +++
>>>  .../selftests/bpf/progs/kmod_btfs_mix.c       |  15 +++
>>>  .../selftests/bpf/progs/kmod_btfs_nonexist.c  |  17 +++
>>>  6 files changed, 219 insertions(+)
>>>  create mode 100644 tools/testing/selftests/bpf/prog_tests/kmod_btfs.c
>>>  create mode 100644 tools/testing/selftests/bpf/progs/kmod_btfs.c
>>>  create mode 100644 tools/testing/selftests/bpf/progs/kmod_btfs_mix.c
>>>  create mode 100644 tools/testing/selftests/bpf/progs/kmod_btfs_nonexist.c
>>>
>>> --
>>> 2.34.1
>>>
>>>
> 
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.