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_offload {
|
||||||
struct bpf_prog *prog;
|
struct bpf_prog *prog;
|
||||||
struct net_device *netdev;
|
struct net_device *netdev;
|
||||||
|
struct bpf_offload_dev *offdev;
|
||||||
void *dev_priv;
|
void *dev_priv;
|
||||||
struct list_head offloads;
|
struct list_head offloads;
|
||||||
bool dev_state;
|
bool dev_state;
|
||||||
|
|
|
@ -107,6 +107,7 @@ int bpf_prog_offload_init(struct bpf_prog *prog, union bpf_attr *attr)
|
||||||
err = -EINVAL;
|
err = -EINVAL;
|
||||||
goto err_unlock;
|
goto err_unlock;
|
||||||
}
|
}
|
||||||
|
offload->offdev = ondev->offdev;
|
||||||
prog->aux->offload = offload;
|
prog->aux->offload = offload;
|
||||||
list_add_tail(&offload->offloads, &ondev->progs);
|
list_add_tail(&offload->offloads, &ondev->progs);
|
||||||
dev_put(offload->netdev);
|
dev_put(offload->netdev);
|
||||||
|
@ -167,7 +168,8 @@ int bpf_prog_offload_verify_insn(struct bpf_verifier_env *env,
|
||||||
down_read(&bpf_devs_lock);
|
down_read(&bpf_devs_lock);
|
||||||
offload = env->prog->aux->offload;
|
offload = env->prog->aux->offload;
|
||||||
if (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);
|
up_read(&bpf_devs_lock);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
Loading…
Reference in New Issue