diff options
Diffstat (limited to 'net/core/sock_map.c')
| -rw-r--r-- | net/core/sock_map.c | 42 | 
1 files changed, 11 insertions, 31 deletions
diff --git a/net/core/sock_map.c b/net/core/sock_map.c index ddc899e83313..64b5ec14ff50 100644 --- a/net/core/sock_map.c +++ b/net/core/sock_map.c @@ -27,8 +27,6 @@ struct bpf_stab {  static struct bpf_map *sock_map_alloc(union bpf_attr *attr)  {  	struct bpf_stab *stab; -	u64 cost; -	int err;  	if (!capable(CAP_NET_ADMIN))  		return ERR_PTR(-EPERM); @@ -39,29 +37,22 @@ static struct bpf_map *sock_map_alloc(union bpf_attr *attr)  	    attr->map_flags & ~SOCK_CREATE_FLAG_MASK)  		return ERR_PTR(-EINVAL); -	stab = kzalloc(sizeof(*stab), GFP_USER); +	stab = kzalloc(sizeof(*stab), GFP_USER | __GFP_ACCOUNT);  	if (!stab)  		return ERR_PTR(-ENOMEM);  	bpf_map_init_from_attr(&stab->map, attr);  	raw_spin_lock_init(&stab->lock); -	/* Make sure page count doesn't overflow. */ -	cost = (u64) stab->map.max_entries * sizeof(struct sock *); -	err = bpf_map_charge_init(&stab->map.memory, cost); -	if (err) -		goto free_stab; -  	stab->sks = bpf_map_area_alloc(stab->map.max_entries *  				       sizeof(struct sock *),  				       stab->map.numa_node); -	if (stab->sks) -		return &stab->map; -	err = -ENOMEM; -	bpf_map_charge_finish(&stab->map.memory); -free_stab: -	kfree(stab); -	return ERR_PTR(err); +	if (!stab->sks) { +		kfree(stab); +		return ERR_PTR(-ENOMEM); +	} + +	return &stab->map;  }  int sock_map_get_from_fd(const union bpf_attr *attr, struct bpf_prog *prog) @@ -975,8 +966,9 @@ static struct bpf_shtab_elem *sock_hash_alloc_elem(struct bpf_shtab *htab,  		}  	} -	new = kmalloc_node(htab->elem_size, GFP_ATOMIC | __GFP_NOWARN, -			   htab->map.numa_node); +	new = bpf_map_kmalloc_node(&htab->map, htab->elem_size, +				   GFP_ATOMIC | __GFP_NOWARN, +				   htab->map.numa_node);  	if (!new) {  		atomic_dec(&htab->count);  		return ERR_PTR(-ENOMEM); @@ -1103,7 +1095,6 @@ static struct bpf_map *sock_hash_alloc(union bpf_attr *attr)  {  	struct bpf_shtab *htab;  	int i, err; -	u64 cost;  	if (!capable(CAP_NET_ADMIN))  		return ERR_PTR(-EPERM); @@ -1116,7 +1107,7 @@ static struct bpf_map *sock_hash_alloc(union bpf_attr *attr)  	if (attr->key_size > MAX_BPF_STACK)  		return ERR_PTR(-E2BIG); -	htab = kzalloc(sizeof(*htab), GFP_USER); +	htab = kzalloc(sizeof(*htab), GFP_USER | __GFP_ACCOUNT);  	if (!htab)  		return ERR_PTR(-ENOMEM); @@ -1131,21 +1122,10 @@ static struct bpf_map *sock_hash_alloc(union bpf_attr *attr)  		goto free_htab;  	} -	cost = (u64) htab->buckets_num * sizeof(struct bpf_shtab_bucket) + -	       (u64) htab->elem_size * htab->map.max_entries; -	if (cost >= U32_MAX - PAGE_SIZE) { -		err = -EINVAL; -		goto free_htab; -	} -	err = bpf_map_charge_init(&htab->map.memory, cost); -	if (err) -		goto free_htab; -  	htab->buckets = bpf_map_area_alloc(htab->buckets_num *  					   sizeof(struct bpf_shtab_bucket),  					   htab->map.numa_node);  	if (!htab->buckets) { -		bpf_map_charge_finish(&htab->map.memory);  		err = -ENOMEM;  		goto free_htab;  	}  | 
