OSDN Git Service

bpf: Define no-ops for externally called bpf dynptr functions
authorJoanne Koong <joannelkoong@gmail.com>
Wed, 1 Mar 2023 15:49:47 +0000 (07:49 -0800)
committerAlexei Starovoitov <ast@kernel.org>
Wed, 1 Mar 2023 17:55:23 +0000 (09:55 -0800)
Some bpf dynptr functions will be called from places where
if CONFIG_BPF_SYSCALL is not set, then the dynptr function is
undefined. For example, when skb type dynptrs are added in the
next commit, dynptr functions are called from net/core/filter.c

This patch defines no-op implementations of these dynptr functions
so that they do not break compilation by being an undefined reference.

Signed-off-by: Joanne Koong <joannelkoong@gmail.com>
Link: https://lore.kernel.org/r/20230301154953.641654-5-joannelkoong@gmail.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
include/linux/bpf.h

index 520b238..296841a 100644 (file)
@@ -1124,6 +1124,33 @@ static __always_inline __nocfi unsigned int bpf_dispatcher_nop_func(
        return bpf_func(ctx, insnsi);
 }
 
+/* the implementation of the opaque uapi struct bpf_dynptr */
+struct bpf_dynptr_kern {
+       void *data;
+       /* Size represents the number of usable bytes of dynptr data.
+        * If for example the offset is at 4 for a local dynptr whose data is
+        * of type u64, the number of usable bytes is 4.
+        *
+        * The upper 8 bits are reserved. It is as follows:
+        * Bits 0 - 23 = size
+        * Bits 24 - 30 = dynptr type
+        * Bit 31 = whether dynptr is read-only
+        */
+       u32 size;
+       u32 offset;
+} __aligned(8);
+
+enum bpf_dynptr_type {
+       BPF_DYNPTR_TYPE_INVALID,
+       /* Points to memory that is local to the bpf program */
+       BPF_DYNPTR_TYPE_LOCAL,
+       /* Underlying data is a ringbuf record */
+       BPF_DYNPTR_TYPE_RINGBUF,
+};
+
+int bpf_dynptr_check_size(u32 size);
+u32 bpf_dynptr_get_size(const struct bpf_dynptr_kern *ptr);
+
 #ifdef CONFIG_BPF_JIT
 int bpf_trampoline_link_prog(struct bpf_tramp_link *link, struct bpf_trampoline *tr);
 int bpf_trampoline_unlink_prog(struct bpf_tramp_link *link, struct bpf_trampoline *tr);
@@ -2266,6 +2293,11 @@ static inline bool has_current_bpf_ctx(void)
 }
 
 void notrace bpf_prog_inc_misses_counter(struct bpf_prog *prog);
+
+void bpf_dynptr_init(struct bpf_dynptr_kern *ptr, void *data,
+                    enum bpf_dynptr_type type, u32 offset, u32 size);
+void bpf_dynptr_set_null(struct bpf_dynptr_kern *ptr);
+void bpf_dynptr_set_rdonly(struct bpf_dynptr_kern *ptr);
 #else /* !CONFIG_BPF_SYSCALL */
 static inline struct bpf_prog *bpf_prog_get(u32 ufd)
 {
@@ -2495,6 +2527,19 @@ static inline void bpf_prog_inc_misses_counter(struct bpf_prog *prog)
 static inline void bpf_cgrp_storage_free(struct cgroup *cgroup)
 {
 }
+
+static inline void bpf_dynptr_init(struct bpf_dynptr_kern *ptr, void *data,
+                                  enum bpf_dynptr_type type, u32 offset, u32 size)
+{
+}
+
+static inline void bpf_dynptr_set_null(struct bpf_dynptr_kern *ptr)
+{
+}
+
+static inline void bpf_dynptr_set_rdonly(struct bpf_dynptr_kern *ptr)
+{
+}
 #endif /* CONFIG_BPF_SYSCALL */
 
 void __bpf_free_used_btfs(struct bpf_prog_aux *aux,
@@ -2913,36 +2958,6 @@ int bpf_bprintf_prepare(char *fmt, u32 fmt_size, const u64 *raw_args,
                        u32 num_args, struct bpf_bprintf_data *data);
 void bpf_bprintf_cleanup(struct bpf_bprintf_data *data);
 
-/* the implementation of the opaque uapi struct bpf_dynptr */
-struct bpf_dynptr_kern {
-       void *data;
-       /* Size represents the number of usable bytes of dynptr data.
-        * If for example the offset is at 4 for a local dynptr whose data is
-        * of type u64, the number of usable bytes is 4.
-        *
-        * The upper 8 bits are reserved. It is as follows:
-        * Bits 0 - 23 = size
-        * Bits 24 - 30 = dynptr type
-        * Bit 31 = whether dynptr is read-only
-        */
-       u32 size;
-       u32 offset;
-} __aligned(8);
-
-enum bpf_dynptr_type {
-       BPF_DYNPTR_TYPE_INVALID,
-       /* Points to memory that is local to the bpf program */
-       BPF_DYNPTR_TYPE_LOCAL,
-       /* Underlying data is a kernel-produced ringbuf record */
-       BPF_DYNPTR_TYPE_RINGBUF,
-};
-
-void bpf_dynptr_init(struct bpf_dynptr_kern *ptr, void *data,
-                    enum bpf_dynptr_type type, u32 offset, u32 size);
-void bpf_dynptr_set_null(struct bpf_dynptr_kern *ptr);
-int bpf_dynptr_check_size(u32 size);
-u32 bpf_dynptr_get_size(const struct bpf_dynptr_kern *ptr);
-
 #ifdef CONFIG_BPF_LSM
 void bpf_cgroup_atype_get(u32 attach_btf_id, int cgroup_atype);
 void bpf_cgroup_atype_put(int cgroup_atype);