diff options
Diffstat (limited to 'kernel/bpf/arraymap.c')
| -rw-r--r-- | kernel/bpf/arraymap.c | 28 | 
1 files changed, 13 insertions, 15 deletions
| diff --git a/kernel/bpf/arraymap.c b/kernel/bpf/arraymap.c index 544e58f5f642..0c17aab3ce5f 100644 --- a/kernel/bpf/arraymap.c +++ b/kernel/bpf/arraymap.c @@ -54,7 +54,7 @@ static int bpf_array_alloc_percpu(struct bpf_array *array)  }  /* Called from syscall */ -static int array_map_alloc_check(union bpf_attr *attr) +int array_map_alloc_check(union bpf_attr *attr)  {  	bool percpu = attr->map_type == BPF_MAP_TYPE_PERCPU_ARRAY;  	int numa_node = bpf_map_attr_numa_node(attr); @@ -358,27 +358,20 @@ static void array_map_seq_show_elem(struct bpf_map *map, void *key,  	rcu_read_unlock();  } -static int array_map_check_btf(const struct bpf_map *map, const struct btf *btf, -			       u32 btf_key_id, u32 btf_value_id) +static int array_map_check_btf(const struct bpf_map *map, +			       const struct btf_type *key_type, +			       const struct btf_type *value_type)  { -	const struct btf_type *key_type, *value_type; -	u32 key_size, value_size;  	u32 int_data; -	key_type = btf_type_id_size(btf, &btf_key_id, &key_size); -	if (!key_type || BTF_INFO_KIND(key_type->info) != BTF_KIND_INT) +	if (BTF_INFO_KIND(key_type->info) != BTF_KIND_INT)  		return -EINVAL;  	int_data = *(u32 *)(key_type + 1); -	/* bpf array can only take a u32 key.  This check makes -	 * sure that the btf matches the attr used during map_create. +	/* bpf array can only take a u32 key. This check makes sure +	 * that the btf matches the attr used during map_create.  	 */ -	if (BTF_INT_BITS(int_data) != 32 || key_size != 4 || -	    BTF_INT_OFFSET(int_data)) -		return -EINVAL; - -	value_type = btf_type_id_size(btf, &btf_value_id, &value_size); -	if (!value_type || value_size > map->value_size) +	if (BTF_INT_BITS(int_data) != 32 || BTF_INT_OFFSET(int_data))  		return -EINVAL;  	return 0; @@ -405,6 +398,7 @@ const struct bpf_map_ops percpu_array_map_ops = {  	.map_lookup_elem = percpu_array_map_lookup_elem,  	.map_update_elem = array_map_update_elem,  	.map_delete_elem = array_map_delete_elem, +	.map_check_btf = array_map_check_btf,  };  static int fd_array_map_alloc_check(union bpf_attr *attr) @@ -546,6 +540,7 @@ const struct bpf_map_ops prog_array_map_ops = {  	.map_fd_put_ptr = prog_fd_array_put_ptr,  	.map_fd_sys_lookup_elem = prog_fd_array_sys_lookup_elem,  	.map_release_uref = bpf_fd_array_map_clear, +	.map_check_btf = map_check_no_btf,  };  static struct bpf_event_entry *bpf_event_entry_gen(struct file *perf_file, @@ -634,6 +629,7 @@ const struct bpf_map_ops perf_event_array_map_ops = {  	.map_fd_get_ptr = perf_event_fd_array_get_ptr,  	.map_fd_put_ptr = perf_event_fd_array_put_ptr,  	.map_release = perf_event_fd_array_release, +	.map_check_btf = map_check_no_btf,  };  #ifdef CONFIG_CGROUPS @@ -665,6 +661,7 @@ const struct bpf_map_ops cgroup_array_map_ops = {  	.map_delete_elem = fd_array_map_delete_elem,  	.map_fd_get_ptr = cgroup_fd_array_get_ptr,  	.map_fd_put_ptr = cgroup_fd_array_put_ptr, +	.map_check_btf = map_check_no_btf,  };  #endif @@ -749,4 +746,5 @@ const struct bpf_map_ops array_of_maps_map_ops = {  	.map_fd_put_ptr = bpf_map_fd_put_ptr,  	.map_fd_sys_lookup_elem = bpf_map_fd_sys_lookup_elem,  	.map_gen_lookup = array_of_map_gen_lookup, +	.map_check_btf = map_check_no_btf,  }; |