bpf: Allow specifying volatile type modifier for kptrs
authorKumar Kartikeya Dwivedi <memxor@gmail.com>
Thu, 3 Nov 2022 19:09:51 +0000 (00:39 +0530)
committerAlexei Starovoitov <ast@kernel.org>
Fri, 4 Nov 2022 02:31:17 +0000 (19:31 -0700)
This is useful in particular to mark the pointer as volatile, so that
compiler treats each load and store to the field as a volatile access.
The alternative is having to define and use READ_ONCE and WRITE_ONCE in
the BPF program.

Signed-off-by: Kumar Kartikeya Dwivedi <memxor@gmail.com>
Acked-by: David Vernet <void@manifault.com>
Link: https://lore.kernel.org/r/20221103191013.1236066-3-memxor@gmail.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
include/linux/btf.h
kernel/bpf/btf.c

index f9aabab..86aad9b 100644 (file)
@@ -288,6 +288,11 @@ static inline bool btf_type_is_typedef(const struct btf_type *t)
        return BTF_INFO_KIND(t->info) == BTF_KIND_TYPEDEF;
 }
 
+static inline bool btf_type_is_volatile(const struct btf_type *t)
+{
+       return BTF_INFO_KIND(t->info) == BTF_KIND_VOLATILE;
+}
+
 static inline bool btf_type_is_func(const struct btf_type *t)
 {
        return BTF_INFO_KIND(t->info) == BTF_KIND_FUNC;
index 35c07af..f4d21ee 100644 (file)
@@ -3225,6 +3225,9 @@ static int btf_find_kptr(const struct btf *btf, const struct btf_type *t,
        enum bpf_kptr_type type;
        u32 res_id;
 
+       /* Permit modifiers on the pointer itself */
+       if (btf_type_is_volatile(t))
+               t = btf_type_by_id(btf, t->type);
        /* For PTR, sz is always == 8 */
        if (!btf_type_is_ptr(t))
                return BTF_FIELD_IGNORE;