mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-11-01 17:08:10 +00:00
bpf: devmap: pass on return value of bpf_map_precharge_memlock
If bpf_map_precharge_memlock in dev_map_alloc, -ENOMEM is returned regardless of the actual error produced by bpf_map_precharge_memlock. Fix it by passing on the error returned by bpf_map_precharge_memlock. Also return -EINVAL instead of -ENOMEM if the page count overflow check fails. This makes dev_map_alloc match the behavior of other bpf maps' alloc functions wrt. return values. Signed-off-by: Tobias Klauser <tklauser@distanz.ch> Acked-by: Daniel Borkmann <daniel@iogearbox.net> Acked-by: Alexei Starovoitov <ast@kernel.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
1e3c5ec661
commit
582db7e0c4
1 changed files with 4 additions and 2 deletions
|
@ -75,8 +75,8 @@ static u64 dev_map_bitmap_size(const union bpf_attr *attr)
|
||||||
static struct bpf_map *dev_map_alloc(union bpf_attr *attr)
|
static struct bpf_map *dev_map_alloc(union bpf_attr *attr)
|
||||||
{
|
{
|
||||||
struct bpf_dtab *dtab;
|
struct bpf_dtab *dtab;
|
||||||
|
int err = -EINVAL;
|
||||||
u64 cost;
|
u64 cost;
|
||||||
int err;
|
|
||||||
|
|
||||||
/* check sanity of attributes */
|
/* check sanity of attributes */
|
||||||
if (attr->max_entries == 0 || attr->key_size != 4 ||
|
if (attr->max_entries == 0 || attr->key_size != 4 ||
|
||||||
|
@ -108,6 +108,8 @@ static struct bpf_map *dev_map_alloc(union bpf_attr *attr)
|
||||||
if (err)
|
if (err)
|
||||||
goto free_dtab;
|
goto free_dtab;
|
||||||
|
|
||||||
|
err = -ENOMEM;
|
||||||
|
|
||||||
/* A per cpu bitfield with a bit per possible net device */
|
/* A per cpu bitfield with a bit per possible net device */
|
||||||
dtab->flush_needed = __alloc_percpu(dev_map_bitmap_size(attr),
|
dtab->flush_needed = __alloc_percpu(dev_map_bitmap_size(attr),
|
||||||
__alignof__(unsigned long));
|
__alignof__(unsigned long));
|
||||||
|
@ -128,7 +130,7 @@ static struct bpf_map *dev_map_alloc(union bpf_attr *attr)
|
||||||
free_dtab:
|
free_dtab:
|
||||||
free_percpu(dtab->flush_needed);
|
free_percpu(dtab->flush_needed);
|
||||||
kfree(dtab);
|
kfree(dtab);
|
||||||
return ERR_PTR(-ENOMEM);
|
return ERR_PTR(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dev_map_free(struct bpf_map *map)
|
static void dev_map_free(struct bpf_map *map)
|
||||||
|
|
Loading…
Reference in a new issue