mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02:00 
			
		
		
		
	bpf: pass a struct with offload callbacks to bpf_offload_dev_create()
For passing device functions for offloaded eBPF programs, there used to be no place where to store the pointer without making the non-offloaded programs pay a memory price. As a consequence, three functions were called with ndo_bpf() through specific commands. Now that we have struct bpf_offload_dev, and since none of those operations rely on RTNL, we can turn these three commands into hooks inside the struct bpf_prog_offload_ops, and pass them as part of bpf_offload_dev_create(). This commit effectively passes a pointer to the struct to bpf_offload_dev_create(). We temporarily have two struct bpf_prog_offload_ops instances, one under offdev->ops and one under offload->dev_ops. The next patches will make the transition towards the former, so that offload->dev_ops can be removed, and callbacks relying on ndo_bpf() added to offdev->ops as well. While at it, rename "nfp_bpf_analyzer_ops" as "nfp_bpf_dev_ops" (and similarly for netdevsim). Suggested-by: Jakub Kicinski <jakub.kicinski@netronome.com> 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
							
								
									1da6f57338
								
							
						
					
					
						commit
						1385d755cf
					
				
					 6 changed files with 13 additions and 9 deletions
				
			
		|  | @ -465,7 +465,7 @@ static int nfp_bpf_init(struct nfp_app *app) | |||
| 		app->ctrl_mtu = nfp_bpf_ctrl_cmsg_mtu(bpf); | ||||
| 	} | ||||
| 
 | ||||
| 	bpf->bpf_dev = bpf_offload_dev_create(); | ||||
| 	bpf->bpf_dev = bpf_offload_dev_create(&nfp_bpf_dev_ops); | ||||
| 	err = PTR_ERR_OR_ZERO(bpf->bpf_dev); | ||||
| 	if (err) | ||||
| 		goto err_free_neutral_maps; | ||||
|  |  | |||
|  | @ -513,7 +513,7 @@ int nfp_verify_insn(struct bpf_verifier_env *env, int insn_idx, | |||
| 		    int prev_insn_idx); | ||||
| int nfp_bpf_finalize(struct bpf_verifier_env *env); | ||||
| 
 | ||||
| extern const struct bpf_prog_offload_ops nfp_bpf_analyzer_ops; | ||||
| extern const struct bpf_prog_offload_ops nfp_bpf_dev_ops; | ||||
| 
 | ||||
| struct netdev_bpf; | ||||
| struct nfp_app; | ||||
|  |  | |||
|  | @ -209,7 +209,7 @@ nfp_bpf_verifier_prep(struct nfp_app *app, struct nfp_net *nn, | |||
| 		goto err_free; | ||||
| 
 | ||||
| 	nfp_prog->verifier_meta = nfp_prog_first_meta(nfp_prog); | ||||
| 	bpf->verifier.ops = &nfp_bpf_analyzer_ops; | ||||
| 	bpf->verifier.ops = &nfp_bpf_dev_ops; | ||||
| 
 | ||||
| 	return 0; | ||||
| 
 | ||||
|  | @ -602,7 +602,7 @@ int nfp_net_bpf_offload(struct nfp_net *nn, struct bpf_prog *prog, | |||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| const struct bpf_prog_offload_ops nfp_bpf_analyzer_ops = { | ||||
| const struct bpf_prog_offload_ops nfp_bpf_dev_ops = { | ||||
| 	.insn_hook	= nfp_verify_insn, | ||||
| 	.finalize	= nfp_bpf_finalize, | ||||
| }; | ||||
|  |  | |||
|  | @ -91,7 +91,7 @@ static int nsim_bpf_finalize(struct bpf_verifier_env *env) | |||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static const struct bpf_prog_offload_ops nsim_bpf_analyzer_ops = { | ||||
| static const struct bpf_prog_offload_ops nsim_bpf_dev_ops = { | ||||
| 	.insn_hook	= nsim_bpf_verify_insn, | ||||
| 	.finalize	= nsim_bpf_finalize, | ||||
| }; | ||||
|  | @ -547,7 +547,7 @@ int nsim_bpf(struct net_device *dev, struct netdev_bpf *bpf) | |||
| 		if (err) | ||||
| 			return err; | ||||
| 
 | ||||
| 		bpf->verifier.ops = &nsim_bpf_analyzer_ops; | ||||
| 		bpf->verifier.ops = &nsim_bpf_dev_ops; | ||||
| 		return 0; | ||||
| 	case BPF_OFFLOAD_TRANSLATE: | ||||
| 		state = bpf->offload.prog->aux->offload->dev_priv; | ||||
|  | @ -599,7 +599,7 @@ int nsim_bpf_init(struct netdevsim *ns) | |||
| 		if (IS_ERR_OR_NULL(ns->sdev->ddir_bpf_bound_progs)) | ||||
| 			return -ENOMEM; | ||||
| 
 | ||||
| 		ns->sdev->bpf_dev = bpf_offload_dev_create(); | ||||
| 		ns->sdev->bpf_dev = bpf_offload_dev_create(&nsim_bpf_dev_ops); | ||||
| 		err = PTR_ERR_OR_ZERO(ns->sdev->bpf_dev); | ||||
| 		if (err) | ||||
| 			return err; | ||||
|  |  | |||
|  | @ -692,7 +692,8 @@ int bpf_map_offload_get_next_key(struct bpf_map *map, | |||
| 
 | ||||
| bool bpf_offload_prog_map_match(struct bpf_prog *prog, struct bpf_map *map); | ||||
| 
 | ||||
| struct bpf_offload_dev *bpf_offload_dev_create(void); | ||||
| struct bpf_offload_dev * | ||||
| bpf_offload_dev_create(const struct bpf_prog_offload_ops *ops); | ||||
| void bpf_offload_dev_destroy(struct bpf_offload_dev *offdev); | ||||
| int bpf_offload_dev_netdev_register(struct bpf_offload_dev *offdev, | ||||
| 				    struct net_device *netdev); | ||||
|  |  | |||
|  | @ -33,6 +33,7 @@ | |||
| static DECLARE_RWSEM(bpf_devs_lock); | ||||
| 
 | ||||
| struct bpf_offload_dev { | ||||
| 	const struct bpf_prog_offload_ops *ops; | ||||
| 	struct list_head netdevs; | ||||
| }; | ||||
| 
 | ||||
|  | @ -655,7 +656,8 @@ void bpf_offload_dev_netdev_unregister(struct bpf_offload_dev *offdev, | |||
| } | ||||
| EXPORT_SYMBOL_GPL(bpf_offload_dev_netdev_unregister); | ||||
| 
 | ||||
| struct bpf_offload_dev *bpf_offload_dev_create(void) | ||||
| struct bpf_offload_dev * | ||||
| bpf_offload_dev_create(const struct bpf_prog_offload_ops *ops) | ||||
| { | ||||
| 	struct bpf_offload_dev *offdev; | ||||
| 	int err; | ||||
|  | @ -673,6 +675,7 @@ struct bpf_offload_dev *bpf_offload_dev_create(void) | |||
| 	if (!offdev) | ||||
| 		return ERR_PTR(-ENOMEM); | ||||
| 
 | ||||
| 	offdev->ops = ops; | ||||
| 	INIT_LIST_HEAD(&offdev->netdevs); | ||||
| 
 | ||||
| 	return offdev; | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Quentin Monnet
						Quentin Monnet