Message ID | 20170918130346.10833-1-tklauser@distanz.ch |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
Series | bpf: devmap: pass on return value of bpf_map_precharge_memlock | expand |
On 09/18/2017 03:03 PM, Tobias Klauser wrote: > 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> (This would then need to go via net tree.) Acked-by: Daniel Borkmann <daniel@iogearbox.net>
On Mon, Sep 18, 2017 at 03:03:46PM +0200, Tobias Klauser wrote: > 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> good catch. Acked-by: Alexei Starovoitov <ast@kernel.org>
From: Tobias Klauser <tklauser@distanz.ch> Date: Mon, 18 Sep 2017 15:03:46 +0200 > 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> Applied, thank you.
diff --git a/kernel/bpf/devmap.c b/kernel/bpf/devmap.c index 959c9a07f318..e093d9a2c4dd 100644 --- a/kernel/bpf/devmap.c +++ b/kernel/bpf/devmap.c @@ -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) { struct bpf_dtab *dtab; + int err = -EINVAL; u64 cost; - int err; /* check sanity of attributes */ 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) goto free_dtab; + err = -ENOMEM; + /* A per cpu bitfield with a bit per possible net device */ dtab->flush_needed = __alloc_percpu(dev_map_bitmap_size(attr), __alignof__(unsigned long)); @@ -128,7 +130,7 @@ static struct bpf_map *dev_map_alloc(union bpf_attr *attr) free_dtab: free_percpu(dtab->flush_needed); kfree(dtab); - return ERR_PTR(-ENOMEM); + return ERR_PTR(err); } static void dev_map_free(struct bpf_map *map)
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> --- kernel/bpf/devmap.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)