Commit 00db12c3 authored by Quentin Monnet's avatar Quentin Monnet Committed by Alexei Starovoitov

bpf: call verifier_prep from its callback in struct bpf_offload_dev

In a way similar to the change previously brought to the verify_insn
hook and to the finalize callback, switch to the newly added ops in
struct bpf_prog_offload for calling the functions used to prepare driver
verifiers.

Since the dev_ops pointer in struct bpf_prog_offload is no longer used
by any callback, we can now remove it from struct bpf_prog_offload.
Signed-off-by: default avatarQuentin Monnet <quentin.monnet@netronome.com>
Reviewed-by: default avatarJakub Kicinski <jakub.kicinski@netronome.com>
Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parent 6dc18fa6
...@@ -188,10 +188,11 @@ static void nfp_prog_free(struct nfp_prog *nfp_prog) ...@@ -188,10 +188,11 @@ static void nfp_prog_free(struct nfp_prog *nfp_prog)
} }
static int static int
nfp_bpf_verifier_prep(struct nfp_app *app, struct nfp_net *nn, nfp_bpf_verifier_prep(struct net_device *netdev, struct bpf_verifier_env *env)
struct netdev_bpf *bpf)
{ {
struct bpf_prog *prog = bpf->verifier.prog; struct nfp_net *nn = netdev_priv(netdev);
struct bpf_prog *prog = env->prog;
struct nfp_app *app = nn->app;
struct nfp_prog *nfp_prog; struct nfp_prog *nfp_prog;
int ret; int ret;
...@@ -209,7 +210,6 @@ nfp_bpf_verifier_prep(struct nfp_app *app, struct nfp_net *nn, ...@@ -209,7 +210,6 @@ nfp_bpf_verifier_prep(struct nfp_app *app, struct nfp_net *nn,
goto err_free; goto err_free;
nfp_prog->verifier_meta = nfp_prog_first_meta(nfp_prog); nfp_prog->verifier_meta = nfp_prog_first_meta(nfp_prog);
bpf->verifier.ops = &nfp_bpf_dev_ops;
return 0; return 0;
...@@ -422,8 +422,6 @@ nfp_bpf_map_free(struct nfp_app_bpf *bpf, struct bpf_offloaded_map *offmap) ...@@ -422,8 +422,6 @@ nfp_bpf_map_free(struct nfp_app_bpf *bpf, struct bpf_offloaded_map *offmap)
int nfp_ndo_bpf(struct nfp_app *app, struct nfp_net *nn, struct netdev_bpf *bpf) int nfp_ndo_bpf(struct nfp_app *app, struct nfp_net *nn, struct netdev_bpf *bpf)
{ {
switch (bpf->command) { switch (bpf->command) {
case BPF_OFFLOAD_VERIFIER_PREP:
return nfp_bpf_verifier_prep(app, nn, bpf);
case BPF_OFFLOAD_TRANSLATE: case BPF_OFFLOAD_TRANSLATE:
return nfp_bpf_translate(nn, bpf->offload.prog); return nfp_bpf_translate(nn, bpf->offload.prog);
case BPF_OFFLOAD_DESTROY: case BPF_OFFLOAD_DESTROY:
...@@ -605,4 +603,5 @@ int nfp_net_bpf_offload(struct nfp_net *nn, struct bpf_prog *prog, ...@@ -605,4 +603,5 @@ int nfp_net_bpf_offload(struct nfp_net *nn, struct bpf_prog *prog,
const struct bpf_prog_offload_ops nfp_bpf_dev_ops = { const struct bpf_prog_offload_ops nfp_bpf_dev_ops = {
.insn_hook = nfp_verify_insn, .insn_hook = nfp_verify_insn,
.finalize = nfp_bpf_finalize, .finalize = nfp_bpf_finalize,
.prepare = nfp_bpf_verifier_prep,
}; };
...@@ -91,11 +91,6 @@ static int nsim_bpf_finalize(struct bpf_verifier_env *env) ...@@ -91,11 +91,6 @@ static int nsim_bpf_finalize(struct bpf_verifier_env *env)
return 0; return 0;
} }
static const struct bpf_prog_offload_ops nsim_bpf_dev_ops = {
.insn_hook = nsim_bpf_verify_insn,
.finalize = nsim_bpf_finalize,
};
static bool nsim_xdp_offload_active(struct netdevsim *ns) static bool nsim_xdp_offload_active(struct netdevsim *ns)
{ {
return ns->xdp_hw.prog; return ns->xdp_hw.prog;
...@@ -263,6 +258,17 @@ static int nsim_bpf_create_prog(struct netdevsim *ns, struct bpf_prog *prog) ...@@ -263,6 +258,17 @@ static int nsim_bpf_create_prog(struct netdevsim *ns, struct bpf_prog *prog)
return 0; return 0;
} }
static int
nsim_bpf_verifier_prep(struct net_device *dev, struct bpf_verifier_env *env)
{
struct netdevsim *ns = netdev_priv(dev);
if (!ns->bpf_bind_accept)
return -EOPNOTSUPP;
return nsim_bpf_create_prog(ns, env->prog);
}
static void nsim_bpf_destroy_prog(struct bpf_prog *prog) static void nsim_bpf_destroy_prog(struct bpf_prog *prog)
{ {
struct nsim_bpf_bound_prog *state; struct nsim_bpf_bound_prog *state;
...@@ -275,6 +281,12 @@ static void nsim_bpf_destroy_prog(struct bpf_prog *prog) ...@@ -275,6 +281,12 @@ static void nsim_bpf_destroy_prog(struct bpf_prog *prog)
kfree(state); kfree(state);
} }
static const struct bpf_prog_offload_ops nsim_bpf_dev_ops = {
.insn_hook = nsim_bpf_verify_insn,
.finalize = nsim_bpf_finalize,
.prepare = nsim_bpf_verifier_prep,
};
static int nsim_setup_prog_checks(struct netdevsim *ns, struct netdev_bpf *bpf) static int nsim_setup_prog_checks(struct netdevsim *ns, struct netdev_bpf *bpf)
{ {
if (bpf->prog && bpf->prog->aux->offload) { if (bpf->prog && bpf->prog->aux->offload) {
...@@ -539,16 +551,6 @@ int nsim_bpf(struct net_device *dev, struct netdev_bpf *bpf) ...@@ -539,16 +551,6 @@ int nsim_bpf(struct net_device *dev, struct netdev_bpf *bpf)
ASSERT_RTNL(); ASSERT_RTNL();
switch (bpf->command) { switch (bpf->command) {
case BPF_OFFLOAD_VERIFIER_PREP:
if (!ns->bpf_bind_accept)
return -EOPNOTSUPP;
err = nsim_bpf_create_prog(ns, bpf->verifier.prog);
if (err)
return err;
bpf->verifier.ops = &nsim_bpf_dev_ops;
return 0;
case BPF_OFFLOAD_TRANSLATE: case BPF_OFFLOAD_TRANSLATE:
state = bpf->offload.prog->aux->offload->dev_priv; state = bpf->offload.prog->aux->offload->dev_priv;
......
...@@ -268,6 +268,7 @@ struct bpf_prog_offload_ops { ...@@ -268,6 +268,7 @@ struct bpf_prog_offload_ops {
int (*insn_hook)(struct bpf_verifier_env *env, int (*insn_hook)(struct bpf_verifier_env *env,
int insn_idx, int prev_insn_idx); int insn_idx, int prev_insn_idx);
int (*finalize)(struct bpf_verifier_env *env); int (*finalize)(struct bpf_verifier_env *env);
int (*prepare)(struct net_device *netdev, struct bpf_verifier_env *env);
}; };
struct bpf_prog_offload { struct bpf_prog_offload {
...@@ -277,7 +278,6 @@ struct bpf_prog_offload { ...@@ -277,7 +278,6 @@ struct bpf_prog_offload {
void *dev_priv; void *dev_priv;
struct list_head offloads; struct list_head offloads;
bool dev_state; bool dev_state;
const struct bpf_prog_offload_ops *dev_ops;
void *jited_image; void *jited_image;
u32 jited_len; u32 jited_len;
}; };
......
...@@ -863,7 +863,6 @@ enum bpf_netdev_command { ...@@ -863,7 +863,6 @@ enum bpf_netdev_command {
XDP_QUERY_PROG, XDP_QUERY_PROG,
XDP_QUERY_PROG_HW, XDP_QUERY_PROG_HW,
/* BPF program for offload callbacks, invoked at program load time. */ /* BPF program for offload callbacks, invoked at program load time. */
BPF_OFFLOAD_VERIFIER_PREP,
BPF_OFFLOAD_TRANSLATE, BPF_OFFLOAD_TRANSLATE,
BPF_OFFLOAD_DESTROY, BPF_OFFLOAD_DESTROY,
BPF_OFFLOAD_MAP_ALLOC, BPF_OFFLOAD_MAP_ALLOC,
...@@ -891,11 +890,6 @@ struct netdev_bpf { ...@@ -891,11 +890,6 @@ struct netdev_bpf {
/* flags with which program was installed */ /* flags with which program was installed */
u32 prog_flags; u32 prog_flags;
}; };
/* BPF_OFFLOAD_VERIFIER_PREP */
struct {
struct bpf_prog *prog;
const struct bpf_prog_offload_ops *ops; /* callee set */
} verifier;
/* BPF_OFFLOAD_TRANSLATE, BPF_OFFLOAD_DESTROY */ /* BPF_OFFLOAD_TRANSLATE, BPF_OFFLOAD_DESTROY */
struct { struct {
struct bpf_prog *prog; struct bpf_prog *prog;
......
...@@ -142,21 +142,17 @@ static int __bpf_offload_ndo(struct bpf_prog *prog, enum bpf_netdev_command cmd, ...@@ -142,21 +142,17 @@ static int __bpf_offload_ndo(struct bpf_prog *prog, enum bpf_netdev_command cmd,
int bpf_prog_offload_verifier_prep(struct bpf_verifier_env *env) int bpf_prog_offload_verifier_prep(struct bpf_verifier_env *env)
{ {
struct netdev_bpf data = {}; struct bpf_prog_offload *offload;
int err; int ret = -ENODEV;
data.verifier.prog = env->prog;
rtnl_lock(); down_read(&bpf_devs_lock);
err = __bpf_offload_ndo(env->prog, BPF_OFFLOAD_VERIFIER_PREP, &data); offload = env->prog->aux->offload;
if (err) if (offload)
goto exit_unlock; ret = offload->offdev->ops->prepare(offload->netdev, env);
offload->dev_state = !ret;
up_read(&bpf_devs_lock);
env->prog->aux->offload->dev_ops = data.verifier.ops; return ret;
env->prog->aux->offload->dev_state = true;
exit_unlock:
rtnl_unlock();
return err;
} }
int bpf_prog_offload_verify_insn(struct bpf_verifier_env *env, int bpf_prog_offload_verify_insn(struct bpf_verifier_env *env,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment