]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - kernel/bpf/hashtab.c
bpf: Add syscall lookup support for fd array and htab
[linux.git] / kernel / bpf / hashtab.c
index 004334ea13ba3f56f10b33e9a1a50a97906000e4..4fb463172aa88e81d9caaaee271d8d8c8a9db978 100644 (file)
@@ -1243,6 +1243,26 @@ static void fd_htab_map_free(struct bpf_map *map)
        htab_map_free(map);
 }
 
+/* only called from syscall */
+int bpf_fd_htab_map_lookup_elem(struct bpf_map *map, void *key, u32 *value)
+{
+       void **ptr;
+       int ret = 0;
+
+       if (!map->ops->map_fd_sys_lookup_elem)
+               return -ENOTSUPP;
+
+       rcu_read_lock();
+       ptr = htab_map_lookup_elem(map, key);
+       if (ptr)
+               *value = map->ops->map_fd_sys_lookup_elem(READ_ONCE(*ptr));
+       else
+               ret = -ENOENT;
+       rcu_read_unlock();
+
+       return ret;
+}
+
 /* only called from syscall */
 int bpf_fd_htab_map_update_elem(struct bpf_map *map, struct file *map_file,
                                void *key, void *value, u64 map_flags)
@@ -1305,4 +1325,5 @@ const struct bpf_map_ops htab_of_maps_map_ops = {
        .map_delete_elem = htab_map_delete_elem,
        .map_fd_get_ptr = bpf_map_fd_get_ptr,
        .map_fd_put_ptr = bpf_map_fd_put_ptr,
+       .map_fd_sys_lookup_elem = bpf_map_fd_sys_lookup_elem,
 };