bpf: Add a __btf_get_by_fd helper
authorAnton Protopopov <aspsk@isovalent.com>
Fri, 13 Dec 2024 13:09:28 +0000 (13:09 +0000)
committerAndrii Nakryiko <andrii@kernel.org>
Fri, 13 Dec 2024 22:45:58 +0000 (14:45 -0800)
Add a new helper to get a pointer to a struct btf from a file
descriptor. This helper doesn't increase a refcnt. Add a comment
explaining this and pointing to a corresponding function which
does take a reference.

Signed-off-by: Anton Protopopov <aspsk@isovalent.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Acked-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20241213130934.1087929-2-aspsk@isovalent.com
include/linux/bpf.h
kernel/bpf/btf.c

index eaee2a819f4c150a34a7b1075584711609682e4c..ac44b857b2f9191a2e3baa860ecf400969f67b6c 100644 (file)
@@ -2301,6 +2301,14 @@ void __bpf_obj_drop_impl(void *p, const struct btf_record *rec, bool percpu);
 struct bpf_map *bpf_map_get(u32 ufd);
 struct bpf_map *bpf_map_get_with_uref(u32 ufd);
 
+/*
+ * The __bpf_map_get() and __btf_get_by_fd() functions parse a file
+ * descriptor and return a corresponding map or btf object.
+ * Their names are double underscored to emphasize the fact that they
+ * do not increase refcnt. To also increase refcnt use corresponding
+ * bpf_map_get() and btf_get_by_fd() functions.
+ */
+
 static inline struct bpf_map *__bpf_map_get(struct fd f)
 {
        if (fd_empty(f))
@@ -2310,6 +2318,15 @@ static inline struct bpf_map *__bpf_map_get(struct fd f)
        return fd_file(f)->private_data;
 }
 
+static inline struct btf *__btf_get_by_fd(struct fd f)
+{
+       if (fd_empty(f))
+               return ERR_PTR(-EBADF);
+       if (unlikely(fd_file(f)->f_op != &btf_fops))
+               return ERR_PTR(-EINVAL);
+       return fd_file(f)->private_data;
+}
+
 void bpf_map_inc(struct bpf_map *map);
 void bpf_map_inc_with_uref(struct bpf_map *map);
 struct bpf_map *__bpf_map_inc_not_zero(struct bpf_map *map, bool uref);
index e7a59e6462a9331d0acb17a88a4ebf641509c050..2ef4fef719105f7dcfe37ebec2a57e380704e17e 100644 (file)
@@ -7746,14 +7746,9 @@ struct btf *btf_get_by_fd(int fd)
        struct btf *btf;
        CLASS(fd, f)(fd);
 
-       if (fd_empty(f))
-               return ERR_PTR(-EBADF);
-
-       if (fd_file(f)->f_op != &btf_fops)
-               return ERR_PTR(-EINVAL);
-
-       btf = fd_file(f)->private_data;
-       refcount_inc(&btf->refcnt);
+       btf = __btf_get_by_fd(f);
+       if (!IS_ERR(btf))
+               refcount_inc(&btf->refcnt);
 
        return btf;
 }