Inter-revision diff: patch 2

Comparing v3 (message) to v1 (message)

--- v3
+++ v1
@@ -1,13 +1,15 @@
-This patch also modifies the BPF verifier to only return error for
-invalid kfunc calls specially marked by userspace (with insn->imm == 0,
-insn->off == 0) after the verifier has eliminated dead instructions.
-This can be handled in the fixup stage, and skip processing during add
-and check stages.
+This change modifies the BPF verifier to only return error for invalid
+kfunc calls specially marked by userspace (with insn->imm == 0) after
+the verifier has eliminated dead instructions. This can be handled in
+the fixup stage, and skip processing during add and check stages.
 
 If such an invalid call is dropped, the fixup stage will not encounter
 insn->imm as 0, otherwise it bails out and returns an error.
 
-This will be exposed as weak ksym support in libbpf in subsequent patch.
+This can be used by userspace to use branches to call old and new kfunc
+helpers across kernel versions by setting the rodata map value before
+loading the BPF program, enhancing runtime portability. The next patch
+introduces libbpf support for this.
 
 Signed-off-by: Kumar Kartikeya Dwivedi <memxor@gmail.com>
 ---
@@ -15,26 +17,26 @@
  1 file changed, 18 insertions(+)
 
 diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
-index 3a35af7d1180..f241ba78b970 100644
+index de0670a8b1df..9904b9a96b04 100644
 --- a/kernel/bpf/verifier.c
 +++ b/kernel/bpf/verifier.c
-@@ -1817,6 +1817,15 @@ static int add_kfunc_call(struct bpf_verifier_env *env, u32 func_id, s16 offset)
+@@ -1730,6 +1730,15 @@ static int add_kfunc_call(struct bpf_verifier_env *env, u32 func_id, s16 offset)
  		prog_aux->kfunc_tab = tab;
  	}
  
-+	/* btf idr allocates IDs from 1, so func_id == 0 is always invalid, but
++	/* btf_idr allocates IDs from 1, so func_id == 0 is always invalid, but
 +	 * instead of returning an error, be conservative and wait until the
 +	 * code elimination pass before returning error, so that invalid calls
 +	 * that get pruned out can be in BPF programs loaded from userspace.
-+	 * It is also required that offset be untouched (0) for such calls.
++	 * It is also required that offset be 0.
 +	 */
 +	if (!func_id && !offset)
 +		return 0;
 +
- 	if (!btf_tab && offset) {
- 		btf_tab = kzalloc(sizeof(*btf_tab), GFP_KERNEL);
- 		if (!btf_tab)
-@@ -6627,6 +6636,10 @@ static int check_kfunc_call(struct bpf_verifier_env *env, struct bpf_insn *insn)
+ 	desc_btf = find_kfunc_desc_btf(env, func_id, offset);
+ 	if (IS_ERR(desc_btf)) {
+ 		verbose(env, "failed to find BTF for kernel function\n");
+@@ -6527,6 +6536,10 @@ static int check_kfunc_call(struct bpf_verifier_env *env, struct bpf_insn *insn)
  	struct btf *desc_btf;
  	int err;
  
@@ -42,10 +44,10 @@
 +	if (!insn->imm)
 +		return 0;
 +
- 	desc_btf = find_kfunc_desc_btf(env, insn->imm, insn->off, &btf_mod);
+ 	desc_btf = find_kfunc_desc_btf(env, insn->imm, insn->off);
  	if (IS_ERR(desc_btf))
  		return PTR_ERR(desc_btf);
-@@ -12761,6 +12774,11 @@ static int fixup_kfunc_call(struct bpf_verifier_env *env,
+@@ -12658,6 +12671,11 @@ static int fixup_kfunc_call(struct bpf_verifier_env *env,
  {
  	const struct bpf_kfunc_desc *desc;
  
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help