提交 96aa267b 编写于 作者: A Andrii Nakryiko 提交者: Zheng Zengkai

libbpf: Add non-CO-RE variants of BPF_CORE_READ() macro family

mainline inclusion
from mainline-5.12-rc1
commit a4b09a9e
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I5EUVD
CVE: NA

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=a4b09a9ef9451b09d87550720f8db3ae280b3eea

-------------------------------------------------

BPF_CORE_READ(), in addition to handling CO-RE relocations, also allows much
nicer way to read data structures with nested pointers. Instead of writing
a sequence of bpf_probe_read() calls to follow links, one can just write
BPF_CORE_READ(a, b, c, d) to effectively do a->b->c->d read. This is a welcome
ability when porting BCC code, which (in most cases) allows exactly the
intuitive a->b->c->d variant.

This patch adds non-CO-RE variants of BPF_CORE_READ() family of macros for
cases where CO-RE is not supported (e.g., old kernels). In such cases, the
property of shortening a sequence of bpf_probe_read()s to a simple
BPF_PROBE_READ(a, b, c, d) invocation is still desirable, especially when
porting BCC code to libbpf. Yet, no CO-RE relocation is going to be emitted.
Signed-off-by: NAndrii Nakryiko <andrii@kernel.org>
Signed-off-by: NDaniel Borkmann <daniel@iogearbox.net>
Link: https://lore.kernel.org/bpf/20201218235614.2284956-3-andrii@kernel.orgSigned-off-by: NAlexei Starovoitov <ast@kernel.org>
(cherry picked from commit a4b09a9e)
Signed-off-by: NWang Yufen <wangyufen@huawei.com>
上级 4c64672e
...@@ -316,6 +316,18 @@ enum bpf_enum_value_kind { ...@@ -316,6 +316,18 @@ enum bpf_enum_value_kind {
dst, (src), a, ##__VA_ARGS__) \ dst, (src), a, ##__VA_ARGS__) \
}) })
/* Non-CO-RE variant of BPF_CORE_READ_INTO() */
#define BPF_PROBE_READ_INTO(dst, src, a, ...) ({ \
___core_read(bpf_probe_read, bpf_probe_read, \
dst, (src), a, ##__VA_ARGS__) \
})
/* Non-CO-RE variant of BPF_CORE_READ_USER_INTO() */
#define BPF_PROBE_READ_USER_INTO(dst, src, a, ...) ({ \
___core_read(bpf_probe_read_user, bpf_probe_read_user, \
dst, (src), a, ##__VA_ARGS__) \
})
/* /*
* BPF_CORE_READ_STR_INTO() does same "pointer chasing" as * BPF_CORE_READ_STR_INTO() does same "pointer chasing" as
* BPF_CORE_READ() for intermediate pointers, but then executes (and returns * BPF_CORE_READ() for intermediate pointers, but then executes (and returns
...@@ -332,6 +344,18 @@ enum bpf_enum_value_kind { ...@@ -332,6 +344,18 @@ enum bpf_enum_value_kind {
dst, (src), a, ##__VA_ARGS__) \ dst, (src), a, ##__VA_ARGS__) \
}) })
/* Non-CO-RE variant of BPF_CORE_READ_STR_INTO() */
#define BPF_PROBE_READ_STR_INTO(dst, src, a, ...) ({ \
___core_read(bpf_probe_read_str, bpf_probe_read, \
dst, (src), a, ##__VA_ARGS__) \
})
/* Non-CO-RE variant of BPF_CORE_READ_USER_STR_INTO() */
#define BPF_PROBE_READ_USER_STR_INTO(dst, src, a, ...) ({ \
___core_read(bpf_probe_read_user_str, bpf_probe_read_user, \
dst, (src), a, ##__VA_ARGS__) \
})
/* /*
* BPF_CORE_READ() is used to simplify BPF CO-RE relocatable read, especially * BPF_CORE_READ() is used to simplify BPF CO-RE relocatable read, especially
* when there are few pointer chasing steps. * when there are few pointer chasing steps.
...@@ -369,5 +393,19 @@ enum bpf_enum_value_kind { ...@@ -369,5 +393,19 @@ enum bpf_enum_value_kind {
__r; \ __r; \
}) })
/* Non-CO-RE variant of BPF_CORE_READ() */
#define BPF_PROBE_READ(src, a, ...) ({ \
___type((src), a, ##__VA_ARGS__) __r; \
BPF_PROBE_READ_INTO(&__r, (src), a, ##__VA_ARGS__); \
__r; \
})
/* Non-CO-RE variant of BPF_CORE_READ_USER() */
#define BPF_PROBE_READ_USER(src, a, ...) ({ \
___type((src), a, ##__VA_ARGS__) __r; \
BPF_PROBE_READ_USER_INTO(&__r, (src), a, ##__VA_ARGS__); \
__r; \
})
#endif #endif
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册