diff options
| author | Daniel Borkmann <[email protected]> | 2018-01-06 23:52:23 +0100 |
|---|---|---|
| committer | Daniel Borkmann <[email protected]> | 2018-01-06 23:52:23 +0100 |
| commit | 9be99badee761f0b2c065ecbd8bd54a96cbd0fa0 (patch) | |
| tree | 33efbd17272bf7e54425103a21e7b31856bc7683 /kernel/bpf/stackmap.c | |
| parent | 11d16edb04f113348b0c1d0c26cb666e9baaa7d3 (diff) | |
| parent | 3ced9b600234e6bb13cb25654ce44c4896485cf2 (diff) | |
Merge branch 'bpf-stacktrace-map-next-key-support'
Yonghong Song says:
====================
The patch set implements bpf syscall command BPF_MAP_GET_NEXT_KEY
for stacktrace map. Patch #1 is the core implementation
and Patch #2 implements a bpf test at tools/testing/selftests/bpf
directory. Please see individual patch comments for details.
Changelog:
v1 -> v2:
- For invalid key (key pointer is non-NULL), sets next_key to be the first valid key.
====================
Signed-off-by: Daniel Borkmann <[email protected]>
Diffstat (limited to 'kernel/bpf/stackmap.c')
| -rw-r--r-- | kernel/bpf/stackmap.c | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/kernel/bpf/stackmap.c b/kernel/bpf/stackmap.c index a15bc636cc98..6c63c2222ea8 100644 --- a/kernel/bpf/stackmap.c +++ b/kernel/bpf/stackmap.c @@ -226,9 +226,33 @@ int bpf_stackmap_copy(struct bpf_map *map, void *key, void *value) return 0; } -static int stack_map_get_next_key(struct bpf_map *map, void *key, void *next_key) +static int stack_map_get_next_key(struct bpf_map *map, void *key, + void *next_key) { - return -EINVAL; + struct bpf_stack_map *smap = container_of(map, + struct bpf_stack_map, map); + u32 id; + + WARN_ON_ONCE(!rcu_read_lock_held()); + + if (!key) { + id = 0; + } else { + id = *(u32 *)key; + if (id >= smap->n_buckets || !smap->buckets[id]) + id = 0; + else + id++; + } + + while (id < smap->n_buckets && !smap->buckets[id]) + id++; + + if (id >= smap->n_buckets) + return -ENOENT; + + *(u32 *)next_key = id; + return 0; } static int stack_map_update_elem(struct bpf_map *map, void *key, void *value, |