From: Martin KaFai Lau <martin.lau@linux.dev>
To: bpf@vger.kernel.org
Cc: Alexei Starovoitov <ast@kernel.org>,
Andrii Nakryiko <andrii@kernel.org>,
Daniel Borkmann <daniel@iogearbox.net>,
Eduard Zingerman <eddyz87@gmail.com>,
Yonghong Song <yonghong.song@linux.dev>,
Amery Hung <ameryhung@gmail.com>,
kernel-team@meta.com
Subject: [PATCH v3 bpf-next 0/9] bpf: Add gen_epilogue to bpf_verifier_ops
Date: Tue, 27 Aug 2024 11:16:36 -0700 [thread overview]
Message-ID: <20240827181647.847890-1-martin.lau@linux.dev> (raw)
From: Martin KaFai Lau <martin.lau@kernel.org>
This set allows the subsystem to patch codes before BPF_EXIT.
The verifier ops, .gen_epilogue, is added for this purpose.
One of the use case will be in the bpf qdisc, the bpf qdisc
subsystem can ensure the skb->dev is in the correct value.
The bpf qdisc subsystem can either inline fixing it in the
epilogue or call another kernel function to handle it (e.g. drop)
in the epilogue. Another use case could be in bpf_tcp_ca.c to
enforce snd_cwnd has valid value (e.g. positive value).
v3:
* Moved epilogue_buf[16] to env.
Patch 1 is added to move the existing insn_buf[16] to env.
* Fixed a case that the bpf prog has a BPF_JMP that goes back
to the first instruction of the main prog.
The jump back to 1st insn case also applies to the prologue.
Patch 2 is added to handle it.
* If the bpf main prog has multiple BPF_EXIT, use a BPF_JA
to goto the earlier patched epilogue.
Note that there are (BPF_JMP32 | BPF_JA) vs (BPF_JMP | BPF_JA)
details in the patch 3 commit message.
* There are subtle changes in patch 3, so I reset the Reviewed-by.
* Added patch 8 and patch 9 to cover the changes in patch 2 and patch 3.
* Dropped the kfunc call from pro/epilogue and its selftests.
v2:
* Remove the RFC tag. Keep the ordering at where .gen_epilogue is
called in the verifier relative to the check_max_stack_depth().
This will be consistent with the other extra stack_depth
usage like optimize_bpf_loop().
* Use __xlated check provided by the test_loader to
check the patched instructions after gen_pro/epilogue (Eduard).
* Added Patch 3 by Eduard (Thanks!).
Eduard Zingerman (1):
selftests/bpf: attach struct_ops maps before test prog runs
Martin KaFai Lau (8):
bpf: Move insn_buf[16] to bpf_verifier_env
bpf: Adjust BPF_JMP that jumps to the 1st insn of the prologue
bpf: Add gen_epilogue to bpf_verifier_ops
bpf: Export bpf_base_func_proto
selftests/bpf: Test gen_prologue and gen_epilogue
selftests/bpf: Add tailcall epilogue test
selftests/bpf: A pro/epilogue test when the main prog jumps back to
the 1st insn
selftests/bpf: Test epilogue patching when the main prog has multiple
BPF_EXIT
include/linux/bpf.h | 2 +
include/linux/bpf_verifier.h | 4 +
kernel/bpf/helpers.c | 1 +
kernel/bpf/verifier.c | 72 +++++--
.../selftests/bpf/bpf_testmod/bpf_testmod.c | 190 ++++++++++++++++++
.../selftests/bpf/bpf_testmod/bpf_testmod.h | 11 +
.../bpf/bpf_testmod/bpf_testmod_kfunc.h | 6 +
.../selftests/bpf/prog_tests/pro_epilogue.c | 54 +++++
.../selftests/bpf/progs/epilogue_exit.c | 78 +++++++
.../selftests/bpf/progs/epilogue_tailcall.c | 58 ++++++
.../bpf/progs/pro_epilogue_goto_start.c | 149 ++++++++++++++
.../selftests/bpf/progs/pro_epilogue_kfunc.c | 156 ++++++++++++++
.../bpf/progs/pro_epilogue_subprog.c | 125 ++++++++++++
tools/testing/selftests/bpf/test_loader.c | 27 +++
14 files changed, 921 insertions(+), 12 deletions(-)
create mode 100644 tools/testing/selftests/bpf/prog_tests/pro_epilogue.c
create mode 100644 tools/testing/selftests/bpf/progs/epilogue_exit.c
create mode 100644 tools/testing/selftests/bpf/progs/epilogue_tailcall.c
create mode 100644 tools/testing/selftests/bpf/progs/pro_epilogue_goto_start.c
create mode 100644 tools/testing/selftests/bpf/progs/pro_epilogue_kfunc.c
create mode 100644 tools/testing/selftests/bpf/progs/pro_epilogue_subprog.c
--
2.43.5
next reply other threads:[~2024-08-27 18:16 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-08-27 18:16 Martin KaFai Lau [this message]
2024-08-27 18:16 ` [PATCH v3 bpf-next 1/9] bpf: Move insn_buf[16] to bpf_verifier_env Martin KaFai Lau
2024-08-27 18:16 ` [PATCH v3 bpf-next 2/9] bpf: Adjust BPF_JMP that jumps to the 1st insn of the prologue Martin KaFai Lau
2024-08-27 18:16 ` [PATCH v3 bpf-next 3/9] bpf: Add gen_epilogue to bpf_verifier_ops Martin KaFai Lau
2024-08-27 19:19 ` Martin KaFai Lau
2024-08-27 18:16 ` [PATCH v3 bpf-next 4/9] bpf: Export bpf_base_func_proto Martin KaFai Lau
2024-08-27 18:16 ` [PATCH v3 bpf-next 5/9] selftests/bpf: attach struct_ops maps before test prog runs Martin KaFai Lau
2024-08-27 18:16 ` [PATCH v3 bpf-next 6/9] selftests/bpf: Test gen_prologue and gen_epilogue Martin KaFai Lau
2024-08-27 18:16 ` [PATCH v3 bpf-next 8/9] selftests/bpf: A pro/epilogue test when the main prog jumps back to the 1st insn Martin KaFai Lau
2024-08-27 18:16 ` [PATCH v3 bpf-next 9/9] selftests/bpf: Test epilogue patching when the main prog has multiple BPF_EXIT Martin KaFai Lau
2024-08-27 18:29 ` [PATCH v3 bpf-next 7/9] selftests/bpf: Add tailcall epilogue test Martin KaFai Lau
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240827181647.847890-1-martin.lau@linux.dev \
--to=martin.lau@linux.dev \
--cc=ameryhung@gmail.com \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=eddyz87@gmail.com \
--cc=kernel-team@meta.com \
--cc=yonghong.song@linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox