diff options
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, | 
