提交 e0a70569 编写于 作者: M Martin KaFai Lau 提交者: Zheng Zengkai

bpf: Simplify freeing logic in linfo and jited_linfo

mainline inclusion
from mainline-5.13-rc1
commit e16301fb
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I5EUVD
CVE: NA

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=e16301fbe1837c9594f9c1957c28fd1bb18fbd15

-------------------------------------------------

This patch simplifies the linfo freeing logic by combining
"bpf_prog_free_jited_linfo()" and "bpf_prog_free_unused_jited_linfo()"
into the new "bpf_prog_jit_attempt_done()".
It is a prep work for the kernel function call support.  In a later
patch, freeing the kernel function call descriptors will also
be done in the "bpf_prog_jit_attempt_done()".

"bpf_prog_free_linfo()" is removed since it is only called by
"__bpf_prog_put_noref()".  The kvfree() are directly called
instead.

It also takes this chance to s/kcalloc/kvcalloc/ for the jited_linfo
allocation.
Signed-off-by: NMartin KaFai Lau <kafai@fb.com>
Signed-off-by: NAlexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/20210325015130.1544323-1-kafai@fb.com
(cherry picked from commit e16301fb)
Signed-off-by: NWang Yufen <wangyufen@huawei.com>

Conflicts:
	kernel/bpf/core.c
Signed-off-by: NWang Yufen <wangyufen@huawei.com>
上级 cc789266
...@@ -891,8 +891,7 @@ void bpf_prog_free_linfo(struct bpf_prog *prog); ...@@ -891,8 +891,7 @@ void bpf_prog_free_linfo(struct bpf_prog *prog);
void bpf_prog_fill_jited_linfo(struct bpf_prog *prog, void bpf_prog_fill_jited_linfo(struct bpf_prog *prog,
const u32 *insn_to_jit_off); const u32 *insn_to_jit_off);
int bpf_prog_alloc_jited_linfo(struct bpf_prog *prog); int bpf_prog_alloc_jited_linfo(struct bpf_prog *prog);
void bpf_prog_free_jited_linfo(struct bpf_prog *prog); void bpf_prog_jit_attempt_done(struct bpf_prog *prog);
void bpf_prog_free_unused_jited_linfo(struct bpf_prog *prog);
struct bpf_prog *bpf_prog_alloc(unsigned int size, gfp_t gfp_extra_flags); struct bpf_prog *bpf_prog_alloc(unsigned int size, gfp_t gfp_extra_flags);
struct bpf_prog *bpf_prog_alloc_no_stats(unsigned int size, gfp_t gfp_extra_flags); struct bpf_prog *bpf_prog_alloc_no_stats(unsigned int size, gfp_t gfp_extra_flags);
......
...@@ -145,7 +145,7 @@ int bpf_prog_alloc_jited_linfo(struct bpf_prog *prog) ...@@ -145,7 +145,7 @@ int bpf_prog_alloc_jited_linfo(struct bpf_prog *prog)
if (!prog->aux->nr_linfo || !prog->jit_requested) if (!prog->aux->nr_linfo || !prog->jit_requested)
return 0; return 0;
prog->aux->jited_linfo = kcalloc(prog->aux->nr_linfo, prog->aux->jited_linfo = kvcalloc(prog->aux->nr_linfo,
sizeof(*prog->aux->jited_linfo), sizeof(*prog->aux->jited_linfo),
GFP_KERNEL | __GFP_NOWARN); GFP_KERNEL | __GFP_NOWARN);
if (!prog->aux->jited_linfo) if (!prog->aux->jited_linfo)
...@@ -154,16 +154,13 @@ int bpf_prog_alloc_jited_linfo(struct bpf_prog *prog) ...@@ -154,16 +154,13 @@ int bpf_prog_alloc_jited_linfo(struct bpf_prog *prog)
return 0; return 0;
} }
void bpf_prog_free_jited_linfo(struct bpf_prog *prog) void bpf_prog_jit_attempt_done(struct bpf_prog *prog)
{ {
kfree(prog->aux->jited_linfo); if (prog->aux->jited_linfo &&
prog->aux->jited_linfo = NULL; (!prog->jited || !prog->aux->jited_linfo[0])) {
} kvfree(prog->aux->jited_linfo);
prog->aux->jited_linfo = NULL;
void bpf_prog_free_unused_jited_linfo(struct bpf_prog *prog) }
{
if (prog->aux->jited_linfo && !prog->aux->jited_linfo[0])
bpf_prog_free_jited_linfo(prog);
} }
/* The jit engine is responsible to provide an array /* The jit engine is responsible to provide an array
...@@ -219,12 +216,6 @@ void bpf_prog_fill_jited_linfo(struct bpf_prog *prog, ...@@ -219,12 +216,6 @@ void bpf_prog_fill_jited_linfo(struct bpf_prog *prog,
insn_to_jit_off[linfo[i].insn_off - insn_start - 1]; insn_to_jit_off[linfo[i].insn_off - insn_start - 1];
} }
void bpf_prog_free_linfo(struct bpf_prog *prog)
{
bpf_prog_free_jited_linfo(prog);
kvfree(prog->aux->linfo);
}
struct bpf_prog *bpf_prog_realloc(struct bpf_prog *fp_old, unsigned int size, struct bpf_prog *bpf_prog_realloc(struct bpf_prog *fp_old, unsigned int size,
gfp_t gfp_extra_flags) gfp_t gfp_extra_flags)
{ {
...@@ -1924,15 +1915,13 @@ struct bpf_prog *bpf_prog_select_runtime(struct bpf_prog *fp, int *err) ...@@ -1924,15 +1915,13 @@ struct bpf_prog *bpf_prog_select_runtime(struct bpf_prog *fp, int *err)
return fp; return fp;
fp = bpf_int_jit_compile(fp); fp = bpf_int_jit_compile(fp);
if (!fp->jited) { bpf_prog_jit_attempt_done(fp);
bpf_prog_free_jited_linfo(fp);
#ifdef CONFIG_BPF_JIT_ALWAYS_ON #ifdef CONFIG_BPF_JIT_ALWAYS_ON
if (!fp->jited) {
*err = -ENOTSUPP; *err = -ENOTSUPP;
return fp; return fp;
#endif
} else {
bpf_prog_free_unused_jited_linfo(fp);
} }
#endif
} else { } else {
*err = bpf_prog_offload_compile(fp); *err = bpf_prog_offload_compile(fp);
if (*err) if (*err)
......
...@@ -1758,7 +1758,8 @@ static void __bpf_prog_put_noref(struct bpf_prog *prog, bool deferred) ...@@ -1758,7 +1758,8 @@ static void __bpf_prog_put_noref(struct bpf_prog *prog, bool deferred)
{ {
bpf_prog_kallsyms_del_all(prog); bpf_prog_kallsyms_del_all(prog);
btf_put(prog->aux->btf); btf_put(prog->aux->btf);
bpf_prog_free_linfo(prog); kvfree(prog->aux->jited_linfo);
kvfree(prog->aux->linfo);
if (prog->aux->attach_btf) if (prog->aux->attach_btf)
btf_put(prog->aux->attach_btf); btf_put(prog->aux->attach_btf);
......
...@@ -11707,7 +11707,7 @@ static int jit_subprogs(struct bpf_verifier_env *env) ...@@ -11707,7 +11707,7 @@ static int jit_subprogs(struct bpf_verifier_env *env)
prog->bpf_func = func[0]->bpf_func; prog->bpf_func = func[0]->bpf_func;
prog->aux->func = func; prog->aux->func = func;
prog->aux->func_cnt = env->subprog_cnt; prog->aux->func_cnt = env->subprog_cnt;
bpf_prog_free_unused_jited_linfo(prog); bpf_prog_jit_attempt_done(prog);
return 0; return 0;
out_free: out_free:
/* We failed JIT'ing, so at this point we need to unregister poke /* We failed JIT'ing, so at this point we need to unregister poke
...@@ -11738,7 +11738,7 @@ static int jit_subprogs(struct bpf_verifier_env *env) ...@@ -11738,7 +11738,7 @@ static int jit_subprogs(struct bpf_verifier_env *env)
insn->off = 0; insn->off = 0;
insn->imm = env->insn_aux_data[i].call_imm; insn->imm = env->insn_aux_data[i].call_imm;
} }
bpf_prog_free_jited_linfo(prog); bpf_prog_jit_attempt_done(prog);
return err; return err;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册