bpf: Enable BPF_TRAMP_F_IP_ARG for trampolines with call_get_func_ip
Enabling BPF_TRAMP_F_IP_ARG for trampolines that actually need it. The BPF_TRAMP_F_IP_ARG adds extra 3 instructions to trampoline code and is used only by programs with bpf_get_func_ip helper, which is added in following patch and sets call_get_func_ip bit. This patch ensures that BPF_TRAMP_F_IP_ARG flag is used only for trampolines that have programs with call_get_func_ip set. Signed-off-by: Jiri Olsa <jolsa@kernel.org> Signed-off-by: Alexei Starovoitov <ast@kernel.org> Link: https://lore.kernel.org/bpf/20210714094400.396467-3-jolsa@kernel.org
This commit is contained in:
parent
7e6f3cd89f
commit
1e37392ccc
|
@ -559,7 +559,8 @@ struct bpf_prog {
|
||||||
kprobe_override:1, /* Do we override a kprobe? */
|
kprobe_override:1, /* Do we override a kprobe? */
|
||||||
has_callchain_buf:1, /* callchain buffer allocated? */
|
has_callchain_buf:1, /* callchain buffer allocated? */
|
||||||
enforce_expected_attach_type:1, /* Enforce expected_attach_type checking at attach time */
|
enforce_expected_attach_type:1, /* Enforce expected_attach_type checking at attach time */
|
||||||
call_get_stack:1; /* Do we call bpf_get_stack() or bpf_get_stackid() */
|
call_get_stack:1, /* Do we call bpf_get_stack() or bpf_get_stackid() */
|
||||||
|
call_get_func_ip:1; /* Do we call get_func_ip() */
|
||||||
enum bpf_prog_type type; /* Type of BPF program */
|
enum bpf_prog_type type; /* Type of BPF program */
|
||||||
enum bpf_attach_type expected_attach_type; /* For some prog types */
|
enum bpf_attach_type expected_attach_type; /* For some prog types */
|
||||||
u32 len; /* Number of filter blocks */
|
u32 len; /* Number of filter blocks */
|
||||||
|
|
|
@ -172,7 +172,7 @@ static int register_fentry(struct bpf_trampoline *tr, void *new_addr)
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct bpf_tramp_progs *
|
static struct bpf_tramp_progs *
|
||||||
bpf_trampoline_get_progs(const struct bpf_trampoline *tr, int *total)
|
bpf_trampoline_get_progs(const struct bpf_trampoline *tr, int *total, bool *ip_arg)
|
||||||
{
|
{
|
||||||
const struct bpf_prog_aux *aux;
|
const struct bpf_prog_aux *aux;
|
||||||
struct bpf_tramp_progs *tprogs;
|
struct bpf_tramp_progs *tprogs;
|
||||||
|
@ -189,8 +189,10 @@ bpf_trampoline_get_progs(const struct bpf_trampoline *tr, int *total)
|
||||||
*total += tr->progs_cnt[kind];
|
*total += tr->progs_cnt[kind];
|
||||||
progs = tprogs[kind].progs;
|
progs = tprogs[kind].progs;
|
||||||
|
|
||||||
hlist_for_each_entry(aux, &tr->progs_hlist[kind], tramp_hlist)
|
hlist_for_each_entry(aux, &tr->progs_hlist[kind], tramp_hlist) {
|
||||||
|
*ip_arg |= aux->prog->call_get_func_ip;
|
||||||
*progs++ = aux->prog;
|
*progs++ = aux->prog;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return tprogs;
|
return tprogs;
|
||||||
}
|
}
|
||||||
|
@ -333,9 +335,10 @@ static int bpf_trampoline_update(struct bpf_trampoline *tr)
|
||||||
struct bpf_tramp_image *im;
|
struct bpf_tramp_image *im;
|
||||||
struct bpf_tramp_progs *tprogs;
|
struct bpf_tramp_progs *tprogs;
|
||||||
u32 flags = BPF_TRAMP_F_RESTORE_REGS;
|
u32 flags = BPF_TRAMP_F_RESTORE_REGS;
|
||||||
|
bool ip_arg = false;
|
||||||
int err, total;
|
int err, total;
|
||||||
|
|
||||||
tprogs = bpf_trampoline_get_progs(tr, &total);
|
tprogs = bpf_trampoline_get_progs(tr, &total, &ip_arg);
|
||||||
if (IS_ERR(tprogs))
|
if (IS_ERR(tprogs))
|
||||||
return PTR_ERR(tprogs);
|
return PTR_ERR(tprogs);
|
||||||
|
|
||||||
|
@ -357,6 +360,9 @@ static int bpf_trampoline_update(struct bpf_trampoline *tr)
|
||||||
tprogs[BPF_TRAMP_MODIFY_RETURN].nr_progs)
|
tprogs[BPF_TRAMP_MODIFY_RETURN].nr_progs)
|
||||||
flags = BPF_TRAMP_F_CALL_ORIG | BPF_TRAMP_F_SKIP_FRAME;
|
flags = BPF_TRAMP_F_CALL_ORIG | BPF_TRAMP_F_SKIP_FRAME;
|
||||||
|
|
||||||
|
if (ip_arg)
|
||||||
|
flags |= BPF_TRAMP_F_IP_ARG;
|
||||||
|
|
||||||
err = arch_prepare_bpf_trampoline(im, im->image, im->image + PAGE_SIZE,
|
err = arch_prepare_bpf_trampoline(im, im->image, im->image + PAGE_SIZE,
|
||||||
&tr->func.model, flags, tprogs,
|
&tr->func.model, flags, tprogs,
|
||||||
tr->func.addr);
|
tr->func.addr);
|
||||||
|
|
Loading…
Reference in New Issue