mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	bpf: Add attach_btf_id attribute to program load
Add attach_btf_id attribute to prog_load command. It's similar to existing expected_attach_type attribute which is used in several cgroup based program types. Unfortunately expected_attach_type is ignored for tracing programs and cannot be reused for new purpose. Hence introduce attach_btf_id to verify bpf programs against given in-kernel BTF type id at load time. It is strictly checked to be valid for raw_tp programs only. In a later patches it will become: btf_id == 0 semantics of existing raw_tp progs. btd_id > 0 raw_tp with BTF and additional type safety. Signed-off-by: Alexei Starovoitov <ast@kernel.org> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Acked-by: Andrii Nakryiko <andriin@fb.com> Acked-by: Martin KaFai Lau <kafai@fb.com> Link: https://lore.kernel.org/bpf/20191016032505.2089704-5-ast@kernel.org
This commit is contained in:
		
							parent
							
								
									8580ac9404
								
							
						
					
					
						commit
						ccfe29eb29
					
				
					 4 changed files with 17 additions and 4 deletions
				
			
		| 
						 | 
					@ -375,6 +375,7 @@ struct bpf_prog_aux {
 | 
				
			||||||
	u32 id;
 | 
						u32 id;
 | 
				
			||||||
	u32 func_cnt; /* used by non-func prog as the number of func progs */
 | 
						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 */
 | 
						u32 func_idx; /* 0 for non-func prog, the index in func array for func prog */
 | 
				
			||||||
 | 
						u32 attach_btf_id; /* in-kernel BTF type id to attach to */
 | 
				
			||||||
	bool verifier_zext; /* Zero extensions has been inserted by verifier. */
 | 
						bool verifier_zext; /* Zero extensions has been inserted by verifier. */
 | 
				
			||||||
	bool offload_requested;
 | 
						bool offload_requested;
 | 
				
			||||||
	struct bpf_prog **func;
 | 
						struct bpf_prog **func;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -420,6 +420,7 @@ union bpf_attr {
 | 
				
			||||||
		__u32		line_info_rec_size;	/* userspace bpf_line_info size */
 | 
							__u32		line_info_rec_size;	/* userspace bpf_line_info size */
 | 
				
			||||||
		__aligned_u64	line_info;	/* line info */
 | 
							__aligned_u64	line_info;	/* line info */
 | 
				
			||||||
		__u32		line_info_cnt;	/* number of bpf_line_info records */
 | 
							__u32		line_info_cnt;	/* number of bpf_line_info records */
 | 
				
			||||||
 | 
							__u32		attach_btf_id;	/* in-kernel BTF type id to attach to */
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct { /* anonymous struct used by BPF_OBJ_* commands */
 | 
						struct { /* anonymous struct used by BPF_OBJ_* commands */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -23,6 +23,7 @@
 | 
				
			||||||
#include <linux/timekeeping.h>
 | 
					#include <linux/timekeeping.h>
 | 
				
			||||||
#include <linux/ctype.h>
 | 
					#include <linux/ctype.h>
 | 
				
			||||||
#include <linux/nospec.h>
 | 
					#include <linux/nospec.h>
 | 
				
			||||||
 | 
					#include <uapi/linux/btf.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define IS_FD_ARRAY(map) ((map)->map_type == BPF_MAP_TYPE_PROG_ARRAY || \
 | 
					#define IS_FD_ARRAY(map) ((map)->map_type == BPF_MAP_TYPE_PROG_ARRAY || \
 | 
				
			||||||
			   (map)->map_type == BPF_MAP_TYPE_PERF_EVENT_ARRAY || \
 | 
								   (map)->map_type == BPF_MAP_TYPE_PERF_EVENT_ARRAY || \
 | 
				
			||||||
| 
						 | 
					@ -1565,8 +1566,9 @@ static void bpf_prog_load_fixup_attach_type(union bpf_attr *attr)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int
 | 
					static int
 | 
				
			||||||
bpf_prog_load_check_attach_type(enum bpf_prog_type prog_type,
 | 
					bpf_prog_load_check_attach(enum bpf_prog_type prog_type,
 | 
				
			||||||
				enum bpf_attach_type expected_attach_type)
 | 
								   enum bpf_attach_type expected_attach_type,
 | 
				
			||||||
 | 
								   u32 btf_id)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	switch (prog_type) {
 | 
						switch (prog_type) {
 | 
				
			||||||
	case BPF_PROG_TYPE_CGROUP_SOCK:
 | 
						case BPF_PROG_TYPE_CGROUP_SOCK:
 | 
				
			||||||
| 
						 | 
					@ -1608,13 +1610,19 @@ bpf_prog_load_check_attach_type(enum bpf_prog_type prog_type,
 | 
				
			||||||
		default:
 | 
							default:
 | 
				
			||||||
			return -EINVAL;
 | 
								return -EINVAL;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
						case BPF_PROG_TYPE_RAW_TRACEPOINT:
 | 
				
			||||||
 | 
							if (btf_id > BTF_MAX_TYPE)
 | 
				
			||||||
 | 
								return -EINVAL;
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
 | 
							if (btf_id)
 | 
				
			||||||
 | 
								return -EINVAL;
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* last field in 'union bpf_attr' used by this command */
 | 
					/* last field in 'union bpf_attr' used by this command */
 | 
				
			||||||
#define	BPF_PROG_LOAD_LAST_FIELD line_info_cnt
 | 
					#define	BPF_PROG_LOAD_LAST_FIELD attach_btf_id
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int bpf_prog_load(union bpf_attr *attr, union bpf_attr __user *uattr)
 | 
					static int bpf_prog_load(union bpf_attr *attr, union bpf_attr __user *uattr)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -1656,7 +1664,8 @@ static int bpf_prog_load(union bpf_attr *attr, union bpf_attr __user *uattr)
 | 
				
			||||||
		return -EPERM;
 | 
							return -EPERM;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bpf_prog_load_fixup_attach_type(attr);
 | 
						bpf_prog_load_fixup_attach_type(attr);
 | 
				
			||||||
	if (bpf_prog_load_check_attach_type(type, attr->expected_attach_type))
 | 
						if (bpf_prog_load_check_attach(type, attr->expected_attach_type,
 | 
				
			||||||
 | 
									       attr->attach_btf_id))
 | 
				
			||||||
		return -EINVAL;
 | 
							return -EINVAL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* plain bpf_prog allocation */
 | 
						/* plain bpf_prog allocation */
 | 
				
			||||||
| 
						 | 
					@ -1665,6 +1674,7 @@ static int bpf_prog_load(union bpf_attr *attr, union bpf_attr __user *uattr)
 | 
				
			||||||
		return -ENOMEM;
 | 
							return -ENOMEM;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	prog->expected_attach_type = attr->expected_attach_type;
 | 
						prog->expected_attach_type = attr->expected_attach_type;
 | 
				
			||||||
 | 
						prog->aux->attach_btf_id = attr->attach_btf_id;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	prog->aux->offload_requested = !!attr->prog_ifindex;
 | 
						prog->aux->offload_requested = !!attr->prog_ifindex;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -420,6 +420,7 @@ union bpf_attr {
 | 
				
			||||||
		__u32		line_info_rec_size;	/* userspace bpf_line_info size */
 | 
							__u32		line_info_rec_size;	/* userspace bpf_line_info size */
 | 
				
			||||||
		__aligned_u64	line_info;	/* line info */
 | 
							__aligned_u64	line_info;	/* line info */
 | 
				
			||||||
		__u32		line_info_cnt;	/* number of bpf_line_info records */
 | 
							__u32		line_info_cnt;	/* number of bpf_line_info records */
 | 
				
			||||||
 | 
							__u32		attach_btf_id;	/* in-kernel BTF type id to attach to */
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct { /* anonymous struct used by BPF_OBJ_* commands */
 | 
						struct { /* anonymous struct used by BPF_OBJ_* commands */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue