123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638 |
- =================================
- HOWTO interact with BPF subsystem
- =================================
- This document provides information for the BPF subsystem about various
- workflows related to reporting bugs, submitting patches, and queueing
- patches for stable kernels.
- For general information about submitting patches, please refer to
- `Documentation/process/`_. This document only describes additional specifics
- related to BPF.
- .. contents::
- :local:
- :depth: 2
- Reporting bugs
- ==============
- Q: How do I report bugs for BPF kernel code?
- --------------------------------------------
- A: Since all BPF kernel development as well as bpftool and iproute2 BPF
- loader development happens through the netdev kernel mailing list,
- please report any found issues around BPF to the following mailing
- list:
- netdev@vger.kernel.org
- This may also include issues related to XDP, BPF tracing, etc.
- Given netdev has a high volume of traffic, please also add the BPF
- maintainers to Cc (from kernel MAINTAINERS_ file):
- * Alexei Starovoitov <ast@kernel.org>
- * Daniel Borkmann <daniel@iogearbox.net>
- In case a buggy commit has already been identified, make sure to keep
- the actual commit authors in Cc as well for the report. They can
- typically be identified through the kernel's git tree.
- **Please do NOT report BPF issues to bugzilla.kernel.org since it
- is a guarantee that the reported issue will be overlooked.**
- Submitting patches
- ==================
- Q: To which mailing list do I need to submit my BPF patches?
- ------------------------------------------------------------
- A: Please submit your BPF patches to the netdev kernel mailing list:
- netdev@vger.kernel.org
- Historically, BPF came out of networking and has always been maintained
- by the kernel networking community. Although these days BPF touches
- many other subsystems as well, the patches are still routed mainly
- through the networking community.
- In case your patch has changes in various different subsystems (e.g.
- tracing, security, etc), make sure to Cc the related kernel mailing
- lists and maintainers from there as well, so they are able to review
- the changes and provide their Acked-by's to the patches.
- Q: Where can I find patches currently under discussion for BPF subsystem?
- -------------------------------------------------------------------------
- A: All patches that are Cc'ed to netdev are queued for review under netdev
- patchwork project:
- http://patchwork.ozlabs.org/project/netdev/list/
- Those patches which target BPF, are assigned to a 'bpf' delegate for
- further processing from BPF maintainers. The current queue with
- patches under review can be found at:
- https://patchwork.ozlabs.org/project/netdev/list/?delegate=77147
- Once the patches have been reviewed by the BPF community as a whole
- and approved by the BPF maintainers, their status in patchwork will be
- changed to 'Accepted' and the submitter will be notified by mail. This
- means that the patches look good from a BPF perspective and have been
- applied to one of the two BPF kernel trees.
- In case feedback from the community requires a respin of the patches,
- their status in patchwork will be set to 'Changes Requested', and purged
- from the current review queue. Likewise for cases where patches would
- get rejected or are not applicable to the BPF trees (but assigned to
- the 'bpf' delegate).
- Q: How do the changes make their way into Linux?
- ------------------------------------------------
- A: There are two BPF kernel trees (git repositories). Once patches have
- been accepted by the BPF maintainers, they will be applied to one
- of the two BPF trees:
- * https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf.git/
- * https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git/
- The bpf tree itself is for fixes only, whereas bpf-next for features,
- cleanups or other kind of improvements ("next-like" content). This is
- analogous to net and net-next trees for networking. Both bpf and
- bpf-next will only have a master branch in order to simplify against
- which branch patches should get rebased to.
- Accumulated BPF patches in the bpf tree will regularly get pulled
- into the net kernel tree. Likewise, accumulated BPF patches accepted
- into the bpf-next tree will make their way into net-next tree. net and
- net-next are both run by David S. Miller. From there, they will go
- into the kernel mainline tree run by Linus Torvalds. To read up on the
- process of net and net-next being merged into the mainline tree, see
- the :ref:`netdev-FAQ`
- Occasionally, to prevent merge conflicts, we might send pull requests
- to other trees (e.g. tracing) with a small subset of the patches, but
- net and net-next are always the main trees targeted for integration.
- The pull requests will contain a high-level summary of the accumulated
- patches and can be searched on netdev kernel mailing list through the
- following subject lines (``yyyy-mm-dd`` is the date of the pull
- request)::
- pull-request: bpf yyyy-mm-dd
- pull-request: bpf-next yyyy-mm-dd
- Q: How do I indicate which tree (bpf vs. bpf-next) my patch should be applied to?
- ---------------------------------------------------------------------------------
- A: The process is the very same as described in the :ref:`netdev-FAQ`,
- so please read up on it. The subject line must indicate whether the
- patch is a fix or rather "next-like" content in order to let the
- maintainers know whether it is targeted at bpf or bpf-next.
- For fixes eventually landing in bpf -> net tree, the subject must
- look like::
- git format-patch --subject-prefix='PATCH bpf' start..finish
- For features/improvements/etc that should eventually land in
- bpf-next -> net-next, the subject must look like::
- git format-patch --subject-prefix='PATCH bpf-next' start..finish
- If unsure whether the patch or patch series should go into bpf
- or net directly, or bpf-next or net-next directly, it is not a
- problem either if the subject line says net or net-next as target.
- It is eventually up to the maintainers to do the delegation of
- the patches.
- If it is clear that patches should go into bpf or bpf-next tree,
- please make sure to rebase the patches against those trees in
- order to reduce potential conflicts.
- In case the patch or patch series has to be reworked and sent out
- again in a second or later revision, it is also required to add a
- version number (``v2``, ``v3``, ...) into the subject prefix::
- git format-patch --subject-prefix='PATCH net-next v2' start..finish
- When changes have been requested to the patch series, always send the
- whole patch series again with the feedback incorporated (never send
- individual diffs on top of the old series).
- Q: What does it mean when a patch gets applied to bpf or bpf-next tree?
- -----------------------------------------------------------------------
- A: It means that the patch looks good for mainline inclusion from
- a BPF point of view.
- Be aware that this is not a final verdict that the patch will
- automatically get accepted into net or net-next trees eventually:
- On the netdev kernel mailing list reviews can come in at any point
- in time. If discussions around a patch conclude that they cannot
- get included as-is, we will either apply a follow-up fix or drop
- them from the trees entirely. Therefore, we also reserve to rebase
- the trees when deemed necessary. After all, the purpose of the tree
- is to:
- i) accumulate and stage BPF patches for integration into trees
- like net and net-next, and
- ii) run extensive BPF test suite and
- workloads on the patches before they make their way any further.
- Once the BPF pull request was accepted by David S. Miller, then
- the patches end up in net or net-next tree, respectively, and
- make their way from there further into mainline. Again, see the
- :ref:`netdev-FAQ` for additional information e.g. on how often they are
- merged to mainline.
- Q: How long do I need to wait for feedback on my BPF patches?
- -------------------------------------------------------------
- A: We try to keep the latency low. The usual time to feedback will
- be around 2 or 3 business days. It may vary depending on the
- complexity of changes and current patch load.
- Q: How often do you send pull requests to major kernel trees like net or net-next?
- ----------------------------------------------------------------------------------
- A: Pull requests will be sent out rather often in order to not
- accumulate too many patches in bpf or bpf-next.
- As a rule of thumb, expect pull requests for each tree regularly
- at the end of the week. In some cases pull requests could additionally
- come also in the middle of the week depending on the current patch
- load or urgency.
- Q: Are patches applied to bpf-next when the merge window is open?
- -----------------------------------------------------------------
- A: For the time when the merge window is open, bpf-next will not be
- processed. This is roughly analogous to net-next patch processing,
- so feel free to read up on the :ref:`netdev-FAQ` about further details.
- During those two weeks of merge window, we might ask you to resend
- your patch series once bpf-next is open again. Once Linus released
- a ``v*-rc1`` after the merge window, we continue processing of bpf-next.
- For non-subscribers to kernel mailing lists, there is also a status
- page run by David S. Miller on net-next that provides guidance:
- http://vger.kernel.org/~davem/net-next.html
- Q: Verifier changes and test cases
- ----------------------------------
- Q: I made a BPF verifier change, do I need to add test cases for
- BPF kernel selftests_?
- A: If the patch has changes to the behavior of the verifier, then yes,
- it is absolutely necessary to add test cases to the BPF kernel
- selftests_ suite. If they are not present and we think they are
- needed, then we might ask for them before accepting any changes.
- In particular, test_verifier.c is tracking a high number of BPF test
- cases, including a lot of corner cases that LLVM BPF back end may
- generate out of the restricted C code. Thus, adding test cases is
- absolutely crucial to make sure future changes do not accidentally
- affect prior use-cases. Thus, treat those test cases as: verifier
- behavior that is not tracked in test_verifier.c could potentially
- be subject to change.
- Q: samples/bpf preference vs selftests?
- ---------------------------------------
- Q: When should I add code to `samples/bpf/`_ and when to BPF kernel
- selftests_ ?
- A: In general, we prefer additions to BPF kernel selftests_ rather than
- `samples/bpf/`_. The rationale is very simple: kernel selftests are
- regularly run by various bots to test for kernel regressions.
- The more test cases we add to BPF selftests, the better the coverage
- and the less likely it is that those could accidentally break. It is
- not that BPF kernel selftests cannot demo how a specific feature can
- be used.
- That said, `samples/bpf/`_ may be a good place for people to get started,
- so it might be advisable that simple demos of features could go into
- `samples/bpf/`_, but advanced functional and corner-case testing rather
- into kernel selftests.
- If your sample looks like a test case, then go for BPF kernel selftests
- instead!
- Q: When should I add code to the bpftool?
- -----------------------------------------
- A: The main purpose of bpftool (under tools/bpf/bpftool/) is to provide
- a central user space tool for debugging and introspection of BPF programs
- and maps that are active in the kernel. If UAPI changes related to BPF
- enable for dumping additional information of programs or maps, then
- bpftool should be extended as well to support dumping them.
- Q: When should I add code to iproute2's BPF loader?
- ---------------------------------------------------
- A: For UAPI changes related to the XDP or tc layer (e.g. ``cls_bpf``),
- the convention is that those control-path related changes are added to
- iproute2's BPF loader as well from user space side. This is not only
- useful to have UAPI changes properly designed to be usable, but also
- to make those changes available to a wider user base of major
- downstream distributions.
- Q: Do you accept patches as well for iproute2's BPF loader?
- -----------------------------------------------------------
- A: Patches for the iproute2's BPF loader have to be sent to:
- netdev@vger.kernel.org
- While those patches are not processed by the BPF kernel maintainers,
- please keep them in Cc as well, so they can be reviewed.
- The official git repository for iproute2 is run by Stephen Hemminger
- and can be found at:
- https://git.kernel.org/pub/scm/linux/kernel/git/shemminger/iproute2.git/
- The patches need to have a subject prefix of '``[PATCH iproute2
- master]``' or '``[PATCH iproute2 net-next]``'. '``master``' or
- '``net-next``' describes the target branch where the patch should be
- applied to. Meaning, if kernel changes went into the net-next kernel
- tree, then the related iproute2 changes need to go into the iproute2
- net-next branch, otherwise they can be targeted at master branch. The
- iproute2 net-next branch will get merged into the master branch after
- the current iproute2 version from master has been released.
- Like BPF, the patches end up in patchwork under the netdev project and
- are delegated to 'shemminger' for further processing:
- http://patchwork.ozlabs.org/project/netdev/list/?delegate=389
- Q: What is the minimum requirement before I submit my BPF patches?
- ------------------------------------------------------------------
- A: When submitting patches, always take the time and properly test your
- patches *prior* to submission. Never rush them! If maintainers find
- that your patches have not been properly tested, it is a good way to
- get them grumpy. Testing patch submissions is a hard requirement!
- Note, fixes that go to bpf tree *must* have a ``Fixes:`` tag included.
- The same applies to fixes that target bpf-next, where the affected
- commit is in net-next (or in some cases bpf-next). The ``Fixes:`` tag is
- crucial in order to identify follow-up commits and tremendously helps
- for people having to do backporting, so it is a must have!
- We also don't accept patches with an empty commit message. Take your
- time and properly write up a high quality commit message, it is
- essential!
- Think about it this way: other developers looking at your code a month
- from now need to understand *why* a certain change has been done that
- way, and whether there have been flaws in the analysis or assumptions
- that the original author did. Thus providing a proper rationale and
- describing the use-case for the changes is a must.
- Patch submissions with >1 patch must have a cover letter which includes
- a high level description of the series. This high level summary will
- then be placed into the merge commit by the BPF maintainers such that
- it is also accessible from the git log for future reference.
- Q: Features changing BPF JIT and/or LLVM
- ----------------------------------------
- Q: What do I need to consider when adding a new instruction or feature
- that would require BPF JIT and/or LLVM integration as well?
- A: We try hard to keep all BPF JITs up to date such that the same user
- experience can be guaranteed when running BPF programs on different
- architectures without having the program punt to the less efficient
- interpreter in case the in-kernel BPF JIT is enabled.
- If you are unable to implement or test the required JIT changes for
- certain architectures, please work together with the related BPF JIT
- developers in order to get the feature implemented in a timely manner.
- Please refer to the git log (``arch/*/net/``) to locate the necessary
- people for helping out.
- Also always make sure to add BPF test cases (e.g. test_bpf.c and
- test_verifier.c) for new instructions, so that they can receive
- broad test coverage and help run-time testing the various BPF JITs.
- In case of new BPF instructions, once the changes have been accepted
- into the Linux kernel, please implement support into LLVM's BPF back
- end. See LLVM_ section below for further information.
- Stable submission
- =================
- Q: I need a specific BPF commit in stable kernels. What should I do?
- --------------------------------------------------------------------
- A: In case you need a specific fix in stable kernels, first check whether
- the commit has already been applied in the related ``linux-*.y`` branches:
- https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git/
- If not the case, then drop an email to the BPF maintainers with the
- netdev kernel mailing list in Cc and ask for the fix to be queued up:
- netdev@vger.kernel.org
- The process in general is the same as on netdev itself, see also the
- :ref:`netdev-FAQ`.
- Q: Do you also backport to kernels not currently maintained as stable?
- ----------------------------------------------------------------------
- A: No. If you need a specific BPF commit in kernels that are currently not
- maintained by the stable maintainers, then you are on your own.
- The current stable and longterm stable kernels are all listed here:
- https://www.kernel.org/
- Q: The BPF patch I am about to submit needs to go to stable as well
- -------------------------------------------------------------------
- What should I do?
- A: The same rules apply as with netdev patch submissions in general, see
- the :ref:`netdev-FAQ`.
- Never add "``Cc: stable@vger.kernel.org``" to the patch description, but
- ask the BPF maintainers to queue the patches instead. This can be done
- with a note, for example, under the ``---`` part of the patch which does
- not go into the git log. Alternatively, this can be done as a simple
- request by mail instead.
- Q: Queue stable patches
- -----------------------
- Q: Where do I find currently queued BPF patches that will be submitted
- to stable?
- A: Once patches that fix critical bugs got applied into the bpf tree, they
- are queued up for stable submission under:
- http://patchwork.ozlabs.org/bundle/bpf/stable/?state=*
- They will be on hold there at minimum until the related commit made its
- way into the mainline kernel tree.
- After having been under broader exposure, the queued patches will be
- submitted by the BPF maintainers to the stable maintainers.
- Testing patches
- ===============
- Q: How to run BPF selftests
- ---------------------------
- A: After you have booted into the newly compiled kernel, navigate to
- the BPF selftests_ suite in order to test BPF functionality (current
- working directory points to the root of the cloned git tree)::
- $ cd tools/testing/selftests/bpf/
- $ make
- To run the verifier tests::
- $ sudo ./test_verifier
- The verifier tests print out all the current checks being
- performed. The summary at the end of running all tests will dump
- information of test successes and failures::
- Summary: 418 PASSED, 0 FAILED
- In order to run through all BPF selftests, the following command is
- needed::
- $ sudo make run_tests
- See the kernels selftest `Documentation/dev-tools/kselftest.rst`_
- document for further documentation.
- Q: Which BPF kernel selftests version should I run my kernel against?
- ---------------------------------------------------------------------
- A: If you run a kernel ``xyz``, then always run the BPF kernel selftests
- from that kernel ``xyz`` as well. Do not expect that the BPF selftest
- from the latest mainline tree will pass all the time.
- In particular, test_bpf.c and test_verifier.c have a large number of
- test cases and are constantly updated with new BPF test sequences, or
- existing ones are adapted to verifier changes e.g. due to verifier
- becoming smarter and being able to better track certain things.
- LLVM
- ====
- Q: Where do I find LLVM with BPF support?
- -----------------------------------------
- A: The BPF back end for LLVM is upstream in LLVM since version 3.7.1.
- All major distributions these days ship LLVM with BPF back end enabled,
- so for the majority of use-cases it is not required to compile LLVM by
- hand anymore, just install the distribution provided package.
- LLVM's static compiler lists the supported targets through
- ``llc --version``, make sure BPF targets are listed. Example::
- $ llc --version
- LLVM (http://llvm.org/):
- LLVM version 6.0.0svn
- Optimized build.
- Default target: x86_64-unknown-linux-gnu
- Host CPU: skylake
- Registered Targets:
- bpf - BPF (host endian)
- bpfeb - BPF (big endian)
- bpfel - BPF (little endian)
- x86 - 32-bit X86: Pentium-Pro and above
- x86-64 - 64-bit X86: EM64T and AMD64
- For developers in order to utilize the latest features added to LLVM's
- BPF back end, it is advisable to run the latest LLVM releases. Support
- for new BPF kernel features such as additions to the BPF instruction
- set are often developed together.
- All LLVM releases can be found at: http://releases.llvm.org/
- Q: Got it, so how do I build LLVM manually anyway?
- --------------------------------------------------
- A: You need cmake and gcc-c++ as build requisites for LLVM. Once you have
- that set up, proceed with building the latest LLVM and clang version
- from the git repositories::
- $ git clone http://llvm.org/git/llvm.git
- $ cd llvm/tools
- $ git clone --depth 1 http://llvm.org/git/clang.git
- $ cd ..; mkdir build; cd build
- $ cmake .. -DLLVM_TARGETS_TO_BUILD="BPF;X86" \
- -DBUILD_SHARED_LIBS=OFF \
- -DCMAKE_BUILD_TYPE=Release \
- -DLLVM_BUILD_RUNTIME=OFF
- $ make -j $(getconf _NPROCESSORS_ONLN)
- The built binaries can then be found in the build/bin/ directory, where
- you can point the PATH variable to.
- Q: Reporting LLVM BPF issues
- ----------------------------
- Q: Should I notify BPF kernel maintainers about issues in LLVM's BPF code
- generation back end or about LLVM generated code that the verifier
- refuses to accept?
- A: Yes, please do!
- LLVM's BPF back end is a key piece of the whole BPF
- infrastructure and it ties deeply into verification of programs from the
- kernel side. Therefore, any issues on either side need to be investigated
- and fixed whenever necessary.
- Therefore, please make sure to bring them up at netdev kernel mailing
- list and Cc BPF maintainers for LLVM and kernel bits:
- * Yonghong Song <yhs@fb.com>
- * Alexei Starovoitov <ast@kernel.org>
- * Daniel Borkmann <daniel@iogearbox.net>
- LLVM also has an issue tracker where BPF related bugs can be found:
- https://bugs.llvm.org/buglist.cgi?quicksearch=bpf
- However, it is better to reach out through mailing lists with having
- maintainers in Cc.
- Q: New BPF instruction for kernel and LLVM
- ------------------------------------------
- Q: I have added a new BPF instruction to the kernel, how can I integrate
- it into LLVM?
- A: LLVM has a ``-mcpu`` selector for the BPF back end in order to allow
- the selection of BPF instruction set extensions. By default the
- ``generic`` processor target is used, which is the base instruction set
- (v1) of BPF.
- LLVM has an option to select ``-mcpu=probe`` where it will probe the host
- kernel for supported BPF instruction set extensions and selects the
- optimal set automatically.
- For cross-compilation, a specific version can be select manually as well ::
- $ llc -march bpf -mcpu=help
- Available CPUs for this target:
- generic - Select the generic processor.
- probe - Select the probe processor.
- v1 - Select the v1 processor.
- v2 - Select the v2 processor.
- [...]
- Newly added BPF instructions to the Linux kernel need to follow the same
- scheme, bump the instruction set version and implement probing for the
- extensions such that ``-mcpu=probe`` users can benefit from the
- optimization transparently when upgrading their kernels.
- If you are unable to implement support for the newly added BPF instruction
- please reach out to BPF developers for help.
- By the way, the BPF kernel selftests run with ``-mcpu=probe`` for better
- test coverage.
- Q: clang flag for target bpf?
- -----------------------------
- Q: In some cases clang flag ``-target bpf`` is used but in other cases the
- default clang target, which matches the underlying architecture, is used.
- What is the difference and when I should use which?
- A: Although LLVM IR generation and optimization try to stay architecture
- independent, ``-target <arch>`` still has some impact on generated code:
- - BPF program may recursively include header file(s) with file scope
- inline assembly codes. The default target can handle this well,
- while ``bpf`` target may fail if bpf backend assembler does not
- understand these assembly codes, which is true in most cases.
- - When compiled without ``-g``, additional elf sections, e.g.,
- .eh_frame and .rela.eh_frame, may be present in the object file
- with default target, but not with ``bpf`` target.
- - The default target may turn a C switch statement into a switch table
- lookup and jump operation. Since the switch table is placed
- in the global readonly section, the bpf program will fail to load.
- The bpf target does not support switch table optimization.
- The clang option ``-fno-jump-tables`` can be used to disable
- switch table generation.
- - For clang ``-target bpf``, it is guaranteed that pointer or long /
- unsigned long types will always have a width of 64 bit, no matter
- whether underlying clang binary or default target (or kernel) is
- 32 bit. However, when native clang target is used, then it will
- compile these types based on the underlying architecture's conventions,
- meaning in case of 32 bit architecture, pointer or long / unsigned
- long types e.g. in BPF context structure will have width of 32 bit
- while the BPF LLVM back end still operates in 64 bit. The native
- target is mostly needed in tracing for the case of walking ``pt_regs``
- or other kernel structures where CPU's register width matters.
- Otherwise, ``clang -target bpf`` is generally recommended.
- You should use default target when:
- - Your program includes a header file, e.g., ptrace.h, which eventually
- pulls in some header files containing file scope host assembly codes.
- - You can add ``-fno-jump-tables`` to work around the switch table issue.
- Otherwise, you can use ``bpf`` target. Additionally, you *must* use bpf target
- when:
- - Your program uses data structures with pointer or long / unsigned long
- types that interface with BPF helpers or context data structures. Access
- into these structures is verified by the BPF verifier and may result
- in verification failures if the native architecture is not aligned with
- the BPF architecture, e.g. 64-bit. An example of this is
- BPF_PROG_TYPE_SK_MSG require ``-target bpf``
- .. Links
- .. _Documentation/process/: https://www.kernel.org/doc/html/latest/process/
- .. _MAINTAINERS: ../../MAINTAINERS
- .. _netdev-FAQ: ../networking/netdev-FAQ.rst
- .. _samples/bpf/: ../../samples/bpf/
- .. _selftests: ../../tools/testing/selftests/bpf/
- .. _Documentation/dev-tools/kselftest.rst:
- https://www.kernel.org/doc/html/latest/dev-tools/kselftest.html
- Happy BPF hacking!
|