bpf: notify offload JITs about optimizations
Let offload JITs know when instructions are replaced and optimized out, so they can update their state appropriately. The optimizations are best effort, if JIT returns an error from any callback verifier will stop notifying it as state may now be out of sync, but the verifier continues making progress. Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com> Reviewed-by: Quentin Monnet <quentin.monnet@netronome.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:

committed by
Alexei Starovoitov

parent
9e4c24e7ee
commit
08ca90afba
@@ -173,6 +173,41 @@ int bpf_prog_offload_finalize(struct bpf_verifier_env *env)
|
||||
return ret;
|
||||
}
|
||||
|
||||
void
|
||||
bpf_prog_offload_replace_insn(struct bpf_verifier_env *env, u32 off,
|
||||
struct bpf_insn *insn)
|
||||
{
|
||||
const struct bpf_prog_offload_ops *ops;
|
||||
struct bpf_prog_offload *offload;
|
||||
int ret = -EOPNOTSUPP;
|
||||
|
||||
down_read(&bpf_devs_lock);
|
||||
offload = env->prog->aux->offload;
|
||||
if (offload) {
|
||||
ops = offload->offdev->ops;
|
||||
if (!offload->opt_failed && ops->replace_insn)
|
||||
ret = ops->replace_insn(env, off, insn);
|
||||
offload->opt_failed |= ret;
|
||||
}
|
||||
up_read(&bpf_devs_lock);
|
||||
}
|
||||
|
||||
void
|
||||
bpf_prog_offload_remove_insns(struct bpf_verifier_env *env, u32 off, u32 cnt)
|
||||
{
|
||||
struct bpf_prog_offload *offload;
|
||||
int ret = -EOPNOTSUPP;
|
||||
|
||||
down_read(&bpf_devs_lock);
|
||||
offload = env->prog->aux->offload;
|
||||
if (offload) {
|
||||
if (!offload->opt_failed && offload->offdev->ops->remove_insns)
|
||||
ret = offload->offdev->ops->remove_insns(env, off, cnt);
|
||||
offload->opt_failed |= ret;
|
||||
}
|
||||
up_read(&bpf_devs_lock);
|
||||
}
|
||||
|
||||
static void __bpf_prog_offload_destroy(struct bpf_prog *prog)
|
||||
{
|
||||
struct bpf_prog_offload *offload = prog->aux->offload;
|
||||
|
Reference in New Issue
Block a user