[PATCH bpf-next 1/6] bpf: error handling when map_lookup_elem isn't supported
The error value returned by map_lookup_elem doesn't differentiate whether lookup was failed because of invalid key or lookup is not supported. Lets add handling for -EOPNOTSUPP return value of map_lookup_elem() method of map, with expectation from map's implementation that it should return -EOPNOTSUPP if lookup is not supported. The errno for bpf syscall for BPF_MAP_LOOKUP_ELEM command will be set to EOPNOTSUPP if map lookup is not supported. Signed-off-by: Prashant Bhole Acked-by: Alexei Starovoitov --- kernel/bpf/syscall.c | 9 +++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c index 5742df21598c..4f416234251f 100644 --- a/kernel/bpf/syscall.c +++ b/kernel/bpf/syscall.c @@ -719,10 +719,15 @@ static int map_lookup_elem(union bpf_attr *attr) } else { rcu_read_lock(); ptr = map->ops->map_lookup_elem(map, key); - if (ptr) + if (IS_ERR(ptr)) { + err = PTR_ERR(ptr); + } else if (!ptr) { + err = -ENOENT; + } else { + err = 0; memcpy(value, ptr, value_size); + } rcu_read_unlock(); - err = ptr ? 0 : -ENOENT; } if (err) -- 2.17.1
Re: [PATCH bpf-next 1/6] bpf: error handling when map_lookup_elem isn't supported
On Mon, Oct 8, 2018 at 6:06 PM Prashant Bhole wrote: > > The error value returned by map_lookup_elem doesn't differentiate > whether lookup was failed because of invalid key or lookup is not > supported. > > Lets add handling for -EOPNOTSUPP return value of map_lookup_elem() > method of map, with expectation from map's implementation that it > should return -EOPNOTSUPP if lookup is not supported. > > The errno for bpf syscall for BPF_MAP_LOOKUP_ELEM command will be set > to EOPNOTSUPP if map lookup is not supported. > > Signed-off-by: Prashant Bhole > Acked-by: Alexei Starovoitov Acked-by: Song Liu > --- > kernel/bpf/syscall.c | 9 +++-- > 1 file changed, 7 insertions(+), 2 deletions(-) > > diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c > index 5742df21598c..4f416234251f 100644 > --- a/kernel/bpf/syscall.c > +++ b/kernel/bpf/syscall.c > @@ -719,10 +719,15 @@ static int map_lookup_elem(union bpf_attr *attr) > } else { > rcu_read_lock(); > ptr = map->ops->map_lookup_elem(map, key); > - if (ptr) > + if (IS_ERR(ptr)) { > + err = PTR_ERR(ptr); > + } else if (!ptr) { > + err = -ENOENT; > + } else { > + err = 0; > memcpy(value, ptr, value_size); > + } > rcu_read_unlock(); > - err = ptr ? 0 : -ENOENT; > } > > if (err) > -- > 2.17.1 > >