|
@@ -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,
|