diff options
Diffstat (limited to 'include/linux/bpf.h')
| -rw-r--r-- | include/linux/bpf.h | 42 | 
1 files changed, 38 insertions, 4 deletions
| diff --git a/include/linux/bpf.h b/include/linux/bpf.h index 33014ae73103..e734f163bd0b 100644 --- a/include/linux/bpf.h +++ b/include/linux/bpf.h @@ -23,6 +23,7 @@ struct bpf_prog;  struct bpf_map;  struct sock;  struct seq_file; +struct btf;  struct btf_type;  /* map is generic key/value storage optionally accesible by eBPF programs */ @@ -52,6 +53,7 @@ struct bpf_map_ops {  	void (*map_seq_show_elem)(struct bpf_map *map, void *key,  				  struct seq_file *m);  	int (*map_check_btf)(const struct bpf_map *map, +			     const struct btf *btf,  			     const struct btf_type *key_type,  			     const struct btf_type *value_type);  }; @@ -126,6 +128,7 @@ static inline bool bpf_map_support_seq_show(const struct bpf_map *map)  }  int map_check_no_btf(const struct bpf_map *map, +		     const struct btf *btf,  		     const struct btf_type *key_type,  		     const struct btf_type *value_type); @@ -268,15 +271,18 @@ struct bpf_prog_offload_ops {  	int (*insn_hook)(struct bpf_verifier_env *env,  			 int insn_idx, int prev_insn_idx);  	int (*finalize)(struct bpf_verifier_env *env); +	int (*prepare)(struct bpf_prog *prog); +	int (*translate)(struct bpf_prog *prog); +	void (*destroy)(struct bpf_prog *prog);  };  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; -	const struct bpf_prog_offload_ops *dev_ops;  	void			*jited_image;  	u32			jited_len;  }; @@ -293,9 +299,11 @@ struct bpf_prog_aux {  	atomic_t refcnt;  	u32 used_map_cnt;  	u32 max_ctx_offset; +	u32 max_pkt_offset;  	u32 stack_depth;  	u32 id; -	u32 func_cnt; +	u32 func_cnt; /* used by non-func prog as the number of func progs */ +	u32 func_idx; /* 0 for non-func prog, the index in func array for func prog */  	bool offload_requested;  	struct bpf_prog **func;  	void *jit_data; /* JIT specific data. arch dependent */ @@ -312,6 +320,30 @@ struct bpf_prog_aux {  	void *security;  #endif  	struct bpf_prog_offload *offload; +	struct btf *btf; +	struct bpf_func_info *func_info; +	/* bpf_line_info loaded from userspace.  linfo->insn_off +	 * has the xlated insn offset. +	 * Both the main and sub prog share the same linfo. +	 * The subprog can access its first linfo by +	 * using the linfo_idx. +	 */ +	struct bpf_line_info *linfo; +	/* jited_linfo is the jited addr of the linfo.  It has a +	 * one to one mapping to linfo: +	 * jited_linfo[i] is the jited addr for the linfo[i]->insn_off. +	 * Both the main and sub prog share the same jited_linfo. +	 * The subprog can access its first jited_linfo by +	 * using the linfo_idx. +	 */ +	void **jited_linfo; +	u32 func_info_cnt; +	u32 nr_linfo; +	/* subprog can use linfo_idx to access its first linfo and +	 * jited_linfo. +	 * main prog always has linfo_idx == 0 +	 */ +	u32 linfo_idx;  	union {  		struct work_struct work;  		struct rcu_head	rcu; @@ -523,7 +555,8 @@ static inline void bpf_long_memcpy(void *dst, const void *src, u32 size)  }  /* verify correctness of eBPF program */ -int bpf_check(struct bpf_prog **fp, union bpf_attr *attr); +int bpf_check(struct bpf_prog **fp, union bpf_attr *attr, +	      union bpf_attr __user *uattr);  void bpf_patch_call_args(struct bpf_insn *insn, u32 stack_depth);  /* Map specifics */ @@ -691,7 +724,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); | 
