bpf: call verify_insn from its callback in struct bpf_offload_dev
We intend to remove the dev_ops in struct bpf_prog_offload, and to only keep the ops in struct bpf_offload_dev instead, which is accessible from more locations for passing function pointers. But dev_ops is used for calling the verify_insn hook. Switch to the newly added ops in struct bpf_prog_offload instead. To avoid table lookups for each eBPF instruction to verify, we remember the offdev attached to a netdev and modify bpf_offload_find_netdev() to avoid performing more than once a lookup for a given offload object. Signed-off-by: Quentin Monnet <quentin.monnet@netronome.com> Reviewed-by: Jakub Kicinski <jakub.kicinski@netronome.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
parent
1385d755cf
commit
341b3e7b7b
|
@ -273,6 +273,7 @@ struct bpf_prog_offload_ops {
|
|||
struct bpf_prog_offload {
|
||||
struct bpf_prog *prog;
|
||||
struct net_device *netdev;
|
||||
struct bpf_offload_dev *offdev;
|
||||
void *dev_priv;
|
||||
struct list_head offloads;
|
||||
bool dev_state;
|
||||
|
|
|
@ -107,6 +107,7 @@ int bpf_prog_offload_init(struct bpf_prog *prog, union bpf_attr *attr)
|
|||
err = -EINVAL;
|
||||
goto err_unlock;
|
||||
}
|
||||
offload->offdev = ondev->offdev;
|
||||
prog->aux->offload = offload;
|
||||
list_add_tail(&offload->offloads, &ondev->progs);
|
||||
dev_put(offload->netdev);
|
||||
|
@ -167,7 +168,8 @@ int bpf_prog_offload_verify_insn(struct bpf_verifier_env *env,
|
|||
down_read(&bpf_devs_lock);
|
||||
offload = env->prog->aux->offload;
|
||||
if (offload)
|
||||
ret = offload->dev_ops->insn_hook(env, insn_idx, prev_insn_idx);
|
||||
ret = offload->offdev->ops->insn_hook(env, insn_idx,
|
||||
prev_insn_idx);
|
||||
up_read(&bpf_devs_lock);
|
||||
|
||||
return ret;
|
||||
|
|
Loading…
Reference in New Issue