diff options
Diffstat (limited to 'kernel/bpf/arraymap.c')
| -rw-r--r-- | kernel/bpf/arraymap.c | 30 | 
1 files changed, 7 insertions, 23 deletions
diff --git a/kernel/bpf/arraymap.c b/kernel/bpf/arraymap.c index c6c81eceb68f..1f8453343bf2 100644 --- a/kernel/bpf/arraymap.c +++ b/kernel/bpf/arraymap.c @@ -34,8 +34,8 @@ static int bpf_array_alloc_percpu(struct bpf_array *array)  	int i;  	for (i = 0; i < array->map.max_entries; i++) { -		ptr = __alloc_percpu_gfp(array->elem_size, 8, -					 GFP_USER | __GFP_NOWARN); +		ptr = bpf_map_alloc_percpu(&array->map, array->elem_size, 8, +					   GFP_USER | __GFP_NOWARN);  		if (!ptr) {  			bpf_array_free_percpu(array);  			return -ENOMEM; @@ -81,11 +81,10 @@ int array_map_alloc_check(union bpf_attr *attr)  static struct bpf_map *array_map_alloc(union bpf_attr *attr)  {  	bool percpu = attr->map_type == BPF_MAP_TYPE_PERCPU_ARRAY; -	int ret, numa_node = bpf_map_attr_numa_node(attr); +	int numa_node = bpf_map_attr_numa_node(attr);  	u32 elem_size, index_mask, max_entries;  	bool bypass_spec_v1 = bpf_bypass_spec_v1(); -	u64 cost, array_size, mask64; -	struct bpf_map_memory mem; +	u64 array_size, mask64;  	struct bpf_array *array;  	elem_size = round_up(attr->value_size, 8); @@ -126,44 +125,29 @@ static struct bpf_map *array_map_alloc(union bpf_attr *attr)  		}  	} -	/* make sure there is no u32 overflow later in round_up() */ -	cost = array_size; -	if (percpu) -		cost += (u64)attr->max_entries * elem_size * num_possible_cpus(); - -	ret = bpf_map_charge_init(&mem, cost); -	if (ret < 0) -		return ERR_PTR(ret); -  	/* allocate all map elements and zero-initialize them */  	if (attr->map_flags & BPF_F_MMAPABLE) {  		void *data;  		/* kmalloc'ed memory can't be mmap'ed, use explicit vmalloc */  		data = bpf_map_area_mmapable_alloc(array_size, numa_node); -		if (!data) { -			bpf_map_charge_finish(&mem); +		if (!data)  			return ERR_PTR(-ENOMEM); -		}  		array = data + PAGE_ALIGN(sizeof(struct bpf_array))  			- offsetof(struct bpf_array, value);  	} else {  		array = bpf_map_area_alloc(array_size, numa_node);  	} -	if (!array) { -		bpf_map_charge_finish(&mem); +	if (!array)  		return ERR_PTR(-ENOMEM); -	}  	array->index_mask = index_mask;  	array->map.bypass_spec_v1 = bypass_spec_v1;  	/* copy mandatory map attributes */  	bpf_map_init_from_attr(&array->map, attr); -	bpf_map_charge_move(&array->map.memory, &mem);  	array->elem_size = elem_size;  	if (percpu && bpf_array_alloc_percpu(array)) { -		bpf_map_charge_finish(&array->map.memory);  		bpf_map_area_free(array);  		return ERR_PTR(-ENOMEM);  	} @@ -1018,7 +1002,7 @@ static struct bpf_map *prog_array_map_alloc(union bpf_attr *attr)  	struct bpf_array_aux *aux;  	struct bpf_map *map; -	aux = kzalloc(sizeof(*aux), GFP_KERNEL); +	aux = kzalloc(sizeof(*aux), GFP_KERNEL_ACCOUNT);  	if (!aux)  		return ERR_PTR(-ENOMEM);  | 
