diff options
Diffstat (limited to 'include/linux/bpf.h')
| -rw-r--r-- | include/linux/bpf.h | 202 | 
1 files changed, 162 insertions, 40 deletions
diff --git a/include/linux/bpf.h b/include/linux/bpf.h index e30100597d0a..4f20f62f9d63 100644 --- a/include/linux/bpf.h +++ b/include/linux/bpf.h @@ -37,6 +37,7 @@ struct perf_event;  struct bpf_prog;  struct bpf_prog_aux;  struct bpf_map; +struct bpf_arena;  struct sock;  struct seq_file;  struct btf; @@ -52,6 +53,10 @@ struct module;  struct bpf_func_state;  struct ftrace_ops;  struct cgroup; +struct bpf_token; +struct user_namespace; +struct super_block; +struct inode;  extern struct idr btf_idr;  extern spinlock_t btf_idr_lock; @@ -135,6 +140,9 @@ struct bpf_map_ops {  	int (*map_mmap)(struct bpf_map *map, struct vm_area_struct *vma);  	__poll_t (*map_poll)(struct bpf_map *map, struct file *filp,  			     struct poll_table_struct *pts); +	unsigned long (*map_get_unmapped_area)(struct file *filep, unsigned long addr, +					       unsigned long len, unsigned long pgoff, +					       unsigned long flags);  	/* Functions called by bpf_local_storage maps */  	int (*map_local_storage_charge)(struct bpf_local_storage_map *smap, @@ -247,10 +255,7 @@ struct bpf_list_node_kern {  } __attribute__((aligned(8)));  struct bpf_map { -	/* The first two cachelines with read-mostly members of which some -	 * are also accessed in fast-path (e.g. ops, max_entries). -	 */ -	const struct bpf_map_ops *ops ____cacheline_aligned; +	const struct bpf_map_ops *ops;  	struct bpf_map *inner_map_meta;  #ifdef CONFIG_SECURITY  	void *security; @@ -272,17 +277,14 @@ struct bpf_map {  	struct obj_cgroup *objcg;  #endif  	char name[BPF_OBJ_NAME_LEN]; -	/* The 3rd and 4th cacheline with misc members to avoid false sharing -	 * particularly with refcounting. -	 */ -	atomic64_t refcnt ____cacheline_aligned; +	struct mutex freeze_mutex; +	atomic64_t refcnt;  	atomic64_t usercnt;  	/* rcu is used before freeing and work is only used during freeing */  	union {  		struct work_struct work;  		struct rcu_head rcu;  	}; -	struct mutex freeze_mutex;  	atomic64_t writecnt;  	/* 'Ownership' of program-containing map is claimed by the first program  	 * that is going to use this map or by the first program which FD is @@ -527,8 +529,8 @@ void bpf_list_head_free(const struct btf_field *field, void *list_head,  			struct bpf_spin_lock *spin_lock);  void bpf_rb_root_free(const struct btf_field *field, void *rb_root,  		      struct bpf_spin_lock *spin_lock); - - +u64 bpf_arena_get_kern_vm_start(struct bpf_arena *arena); +u64 bpf_arena_get_user_vm_start(struct bpf_arena *arena);  int bpf_obj_name_cpy(char *dst, const char *src, unsigned int size);  struct bpf_offload_dev; @@ -710,6 +712,7 @@ enum bpf_arg_type {  	 * on eBPF program stack  	 */  	ARG_PTR_TO_MEM,		/* pointer to valid memory (stack, packet, map value) */ +	ARG_PTR_TO_ARENA,  	ARG_CONST_SIZE,		/* number of bytes accessed from memory */  	ARG_CONST_SIZE_OR_ZERO,	/* number of bytes accessed from memory or 0 */ @@ -881,6 +884,7 @@ enum bpf_reg_type {  	 * an explicit null check is required for this struct.  	 */  	PTR_TO_MEM,		 /* reg points to valid memory region */ +	PTR_TO_ARENA,  	PTR_TO_BUF,		 /* reg points to a read/write buffer */  	PTR_TO_FUNC,		 /* reg points to a bpf program function */  	CONST_PTR_TO_DYNPTR,	 /* reg points to a const struct bpf_dynptr */ @@ -1185,7 +1189,6 @@ struct bpf_trampoline {  	int progs_cnt[BPF_TRAMP_MAX];  	/* Executable image of trampoline */  	struct bpf_tramp_image *cur_image; -	struct module *mod;  };  struct bpf_attach_target_info { @@ -1412,6 +1415,7 @@ struct bpf_jit_poke_descriptor {  struct bpf_ctx_arg_aux {  	u32 offset;  	enum bpf_reg_type reg_type; +	struct btf *btf;  	u32 btf_id;  }; @@ -1451,11 +1455,11 @@ struct bpf_prog_aux {  	bool attach_btf_trace; /* true if attaching to BTF-enabled raw tp */  	bool attach_tracing_prog; /* true if tracing another tracing program */  	bool func_proto_unreliable; -	bool sleepable;  	bool tail_call_reachable;  	bool xdp_has_frags;  	bool exception_cb;  	bool exception_boundary; +	struct bpf_arena *arena;  	/* BTF_KIND_FUNC_PROTO for valid attach_btf_id */  	const struct btf_type *attach_func_proto;  	/* function name for valid attach_btf_id */ @@ -1485,6 +1489,7 @@ struct bpf_prog_aux {  #ifdef CONFIG_SECURITY  	void *security;  #endif +	struct bpf_token *token;  	struct bpf_prog_offload *offload;  	struct btf *btf;  	struct bpf_func_info *func_info; @@ -1535,7 +1540,8 @@ struct bpf_prog {  				enforce_expected_attach_type:1, /* Enforce expected_attach_type checking at attach time */  				call_get_stack:1, /* Do we call bpf_get_stack() or bpf_get_stackid() */  				call_get_func_ip:1, /* Do we call get_func_ip() */ -				tstamp_type_access:1; /* Accessed __sk_buff->tstamp_type */ +				tstamp_type_access:1, /* Accessed __sk_buff->tstamp_type */ +				sleepable:1;	/* BPF program is sleepable */  	enum bpf_prog_type	type;		/* Type of BPF program */  	enum bpf_attach_type	expected_attach_type; /* For some prog types */  	u32			len;		/* Number of filter blocks */ @@ -1609,6 +1615,31 @@ struct bpf_link_primer {  	u32 id;  }; +struct bpf_mount_opts { +	kuid_t uid; +	kgid_t gid; +	umode_t mode; + +	/* BPF token-related delegation options */ +	u64 delegate_cmds; +	u64 delegate_maps; +	u64 delegate_progs; +	u64 delegate_attachs; +}; + +struct bpf_token { +	struct work_struct work; +	atomic64_t refcnt; +	struct user_namespace *userns; +	u64 allowed_cmds; +	u64 allowed_maps; +	u64 allowed_progs; +	u64 allowed_attachs; +#ifdef CONFIG_SECURITY +	void *security; +#endif +}; +  struct bpf_struct_ops_value;  struct btf_member; @@ -1673,19 +1704,64 @@ struct bpf_struct_ops {  	void (*unreg)(void *kdata);  	int (*update)(void *kdata, void *old_kdata);  	int (*validate)(void *kdata); -	const struct btf_type *type; -	const struct btf_type *value_type; +	void *cfi_stubs; +	struct module *owner;  	const char *name;  	struct btf_func_model func_models[BPF_STRUCT_OPS_MAX_NR_MEMBERS]; +}; + +/* Every member of a struct_ops type has an instance even a member is not + * an operator (function pointer). The "info" field will be assigned to + * prog->aux->ctx_arg_info of BPF struct_ops programs to provide the + * argument information required by the verifier to verify the program. + * + * btf_ctx_access() will lookup prog->aux->ctx_arg_info to find the + * corresponding entry for an given argument. + */ +struct bpf_struct_ops_arg_info { +	struct bpf_ctx_arg_aux *info; +	u32 cnt; +}; + +struct bpf_struct_ops_desc { +	struct bpf_struct_ops *st_ops; + +	const struct btf_type *type; +	const struct btf_type *value_type;  	u32 type_id;  	u32 value_id; -	void *cfi_stubs; + +	/* Collection of argument information for each member */ +	struct bpf_struct_ops_arg_info *arg_info; +}; + +enum bpf_struct_ops_state { +	BPF_STRUCT_OPS_STATE_INIT, +	BPF_STRUCT_OPS_STATE_INUSE, +	BPF_STRUCT_OPS_STATE_TOBEFREE, +	BPF_STRUCT_OPS_STATE_READY, +}; + +struct bpf_struct_ops_common_value { +	refcount_t refcnt; +	enum bpf_struct_ops_state state;  };  #if defined(CONFIG_BPF_JIT) && defined(CONFIG_BPF_SYSCALL) +/* This macro helps developer to register a struct_ops type and generate + * type information correctly. Developers should use this macro to register + * a struct_ops type instead of calling __register_bpf_struct_ops() directly. + */ +#define register_bpf_struct_ops(st_ops, type)				\ +	({								\ +		struct bpf_struct_ops_##type {				\ +			struct bpf_struct_ops_common_value common;	\ +			struct type data ____cacheline_aligned_in_smp;	\ +		};							\ +		BTF_TYPE_EMIT(struct bpf_struct_ops_##type);		\ +		__register_bpf_struct_ops(st_ops);			\ +	})  #define BPF_MODULE_OWNER ((void *)((0xeB9FUL << 2) + POISON_POINTER_DELTA)) -const struct bpf_struct_ops *bpf_struct_ops_find(u32 type_id); -void bpf_struct_ops_init(struct btf *btf, struct bpf_verifier_log *log);  bool bpf_struct_ops_get(const void *kdata);  void bpf_struct_ops_put(const void *kdata);  int bpf_struct_ops_map_sys_lookup_elem(struct bpf_map *map, void *key, @@ -1694,7 +1770,9 @@ int bpf_struct_ops_prepare_trampoline(struct bpf_tramp_links *tlinks,  				      struct bpf_tramp_link *link,  				      const struct btf_func_model *model,  				      void *stub_func, -				      void *image, void *image_end); +				      void **image, u32 *image_off, +				      bool allow_alloc); +void bpf_struct_ops_image_free(void *image);  static inline bool bpf_try_module_get(const void *data, struct module *owner)  {  	if (owner == BPF_MODULE_OWNER) @@ -1727,15 +1805,13 @@ struct bpf_dummy_ops {  int bpf_struct_ops_test_run(struct bpf_prog *prog, const union bpf_attr *kattr,  			    union bpf_attr __user *uattr);  #endif +int bpf_struct_ops_desc_init(struct bpf_struct_ops_desc *st_ops_desc, +			     struct btf *btf, +			     struct bpf_verifier_log *log); +void bpf_map_struct_ops_info_fill(struct bpf_map_info *info, struct bpf_map *map); +void bpf_struct_ops_desc_release(struct bpf_struct_ops_desc *st_ops_desc);  #else -static inline const struct bpf_struct_ops *bpf_struct_ops_find(u32 type_id) -{ -	return NULL; -} -static inline void bpf_struct_ops_init(struct btf *btf, -				       struct bpf_verifier_log *log) -{ -} +#define register_bpf_struct_ops(st_ops, type) ({ (void *)(st_ops); 0; })  static inline bool bpf_try_module_get(const void *data, struct module *owner)  {  	return try_module_get(owner); @@ -1754,6 +1830,13 @@ static inline int bpf_struct_ops_link_create(union bpf_attr *attr)  {  	return -EOPNOTSUPP;  } +static inline void bpf_map_struct_ops_info_fill(struct bpf_map_info *info, struct bpf_map *map) +{ +} + +static inline void bpf_struct_ops_desc_release(struct bpf_struct_ops_desc *st_ops_desc) +{ +}  #endif @@ -2029,14 +2112,14 @@ bpf_prog_run_array_uprobe(const struct bpf_prog_array __rcu *array_rcu,  	old_run_ctx = bpf_set_run_ctx(&run_ctx.run_ctx);  	item = &array->items[0];  	while ((prog = READ_ONCE(item->prog))) { -		if (!prog->aux->sleepable) +		if (!prog->sleepable)  			rcu_read_lock();  		run_ctx.bpf_cookie = item->bpf_cookie;  		ret &= run_prog(prog, ctx);  		item++; -		if (!prog->aux->sleepable) +		if (!prog->sleepable)  			rcu_read_unlock();  	}  	bpf_reset_run_ctx(old_run_ctx); @@ -2068,6 +2151,7 @@ static inline void bpf_enable_instrumentation(void)  	migrate_enable();  } +extern const struct super_operations bpf_super_ops;  extern const struct file_operations bpf_map_fops;  extern const struct file_operations bpf_prog_fops;  extern const struct file_operations bpf_iter_fops; @@ -2135,6 +2219,8 @@ int  generic_map_delete_batch(struct bpf_map *map,  struct bpf_map *bpf_map_get_curr_or_next(u32 *id);  struct bpf_prog *bpf_prog_get_curr_or_next(u32 *id); +int bpf_map_alloc_pages(const struct bpf_map *map, gfp_t gfp, int nid, +			unsigned long nr_pages, struct page **page_array);  #ifdef CONFIG_MEMCG_KMEM  void *bpf_map_kmalloc_node(const struct bpf_map *map, size_t size, gfp_t flags,  			   int node); @@ -2202,24 +2288,26 @@ static inline void bpf_map_dec_elem_count(struct bpf_map *map)  extern int sysctl_unprivileged_bpf_disabled; -static inline bool bpf_allow_ptr_leaks(void) +bool bpf_token_capable(const struct bpf_token *token, int cap); + +static inline bool bpf_allow_ptr_leaks(const struct bpf_token *token)  { -	return perfmon_capable(); +	return bpf_token_capable(token, CAP_PERFMON);  } -static inline bool bpf_allow_uninit_stack(void) +static inline bool bpf_allow_uninit_stack(const struct bpf_token *token)  { -	return perfmon_capable(); +	return bpf_token_capable(token, CAP_PERFMON);  } -static inline bool bpf_bypass_spec_v1(void) +static inline bool bpf_bypass_spec_v1(const struct bpf_token *token)  { -	return cpu_mitigations_off() || perfmon_capable(); +	return cpu_mitigations_off() || bpf_token_capable(token, CAP_PERFMON);  } -static inline bool bpf_bypass_spec_v4(void) +static inline bool bpf_bypass_spec_v4(const struct bpf_token *token)  { -	return cpu_mitigations_off() || perfmon_capable(); +	return cpu_mitigations_off() || bpf_token_capable(token, CAP_PERFMON);  }  int bpf_map_new_fd(struct bpf_map *map, int flags); @@ -2236,8 +2324,21 @@ int bpf_link_new_fd(struct bpf_link *link);  struct bpf_link *bpf_link_get_from_fd(u32 ufd);  struct bpf_link *bpf_link_get_curr_or_next(u32 *id); +void bpf_token_inc(struct bpf_token *token); +void bpf_token_put(struct bpf_token *token); +int bpf_token_create(union bpf_attr *attr); +struct bpf_token *bpf_token_get_from_fd(u32 ufd); + +bool bpf_token_allow_cmd(const struct bpf_token *token, enum bpf_cmd cmd); +bool bpf_token_allow_map_type(const struct bpf_token *token, enum bpf_map_type type); +bool bpf_token_allow_prog_type(const struct bpf_token *token, +			       enum bpf_prog_type prog_type, +			       enum bpf_attach_type attach_type); +  int bpf_obj_pin_user(u32 ufd, int path_fd, const char __user *pathname);  int bpf_obj_get_user(int path_fd, const char __user *pathname, int flags); +struct inode *bpf_get_inode(struct super_block *sb, const struct inode *dir, +			    umode_t mode);  #define BPF_ITER_FUNC_PREFIX "bpf_iter_"  #define DEFINE_BPF_ITER_FUNC(target, args...)			\ @@ -2472,11 +2573,14 @@ int btf_check_type_match(struct bpf_verifier_log *log, const struct bpf_prog *pr  			 struct btf *btf, const struct btf_type *t);  const char *btf_find_decl_tag_value(const struct btf *btf, const struct btf_type *pt,  				    int comp_idx, const char *tag_key); +int btf_find_next_decl_tag(const struct btf *btf, const struct btf_type *pt, +			   int comp_idx, const char *tag_key, int last_id);  struct bpf_prog *bpf_prog_by_id(u32 id);  struct bpf_link *bpf_link_by_id(u32 id); -const struct bpf_func_proto *bpf_base_func_proto(enum bpf_func_id func_id); +const struct bpf_func_proto *bpf_base_func_proto(enum bpf_func_id func_id, +						 const struct bpf_prog *prog);  void bpf_task_storage_free(struct task_struct *task);  void bpf_cgrp_storage_free(struct cgroup *cgroup);  bool bpf_prog_has_kfunc_call(const struct bpf_prog *prog); @@ -2595,6 +2699,24 @@ static inline int bpf_obj_get_user(const char __user *pathname, int flags)  	return -EOPNOTSUPP;  } +static inline bool bpf_token_capable(const struct bpf_token *token, int cap) +{ +	return capable(cap) || (cap != CAP_SYS_ADMIN && capable(CAP_SYS_ADMIN)); +} + +static inline void bpf_token_inc(struct bpf_token *token) +{ +} + +static inline void bpf_token_put(struct bpf_token *token) +{ +} + +static inline struct bpf_token *bpf_token_get_from_fd(u32 ufd) +{ +	return ERR_PTR(-EOPNOTSUPP); +} +  static inline void __dev_flush(void)  {  } @@ -2718,7 +2840,7 @@ static inline int btf_struct_access(struct bpf_verifier_log *log,  }  static inline const struct bpf_func_proto * -bpf_base_func_proto(enum bpf_func_id func_id) +bpf_base_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)  {  	return NULL;  }  | 
