Re: [PATCH 1/9] bpf: Add d_path helper
From: Andrii Nakryiko <hidden>
Date: 2020-05-14 22:06:14
Also in:
bpf
On Wed, May 6, 2020 at 6:30 AM Jiri Olsa [off-list ref] wrote:
Adding d_path helper function that returns full path for give 'struct path' object, which needs to be the kernel BTF 'path' object. The helper calls directly d_path function. Updating also bpf.h tools uapi header and adding 'path' to bpf_helpers_doc.py script. Signed-off-by: Jiri Olsa <jolsa@kernel.org> --- include/uapi/linux/bpf.h | 14 +++++++++++++- kernel/trace/bpf_trace.c | 31 +++++++++++++++++++++++++++++++ scripts/bpf_helpers_doc.py | 2 ++ tools/include/uapi/linux/bpf.h | 14 +++++++++++++- 4 files changed, 59 insertions(+), 2 deletions(-)
[...]
+BPF_CALL_3(bpf_d_path, struct path *, path, char *, buf, u32, sz)
+{
+ char *p = d_path(path, buf, sz - 1);
+ int len;
+
+ if (IS_ERR(p)) {
+ len = PTR_ERR(p);
+ } else {
+ len = strlen(p);
+ if (len && p != buf) {
+ memmove(buf, p, len);
+ buf[len] = 0;
+ }
+ }
+
+ return len;
+}
+
+static u32 bpf_d_path_btf_ids[3];Using shorter than 5 element array is "unconventional", but seems like btf_distill_func_proto will never access elements that are not ARG_PTR_TO_BTF_ID, so it's fine. But than again, if we are saving space, why not just 1-element array? :)
+static const struct bpf_func_proto bpf_d_path_proto = {
+ .func = bpf_d_path,
+ .gpl_only = true,
+ .ret_type = RET_INTEGER,
+ .arg1_type = ARG_PTR_TO_BTF_ID,
+ .arg2_type = ARG_PTR_TO_MEM,
+ .arg3_type = ARG_CONST_SIZE,
+ .btf_id = bpf_d_path_btf_ids,
+};
+[...]
quoted hunk ↗ jump to hunk
diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h index b3643e27e264..bc13cad27872 100644 --- a/tools/include/uapi/linux/bpf.h +++ b/tools/include/uapi/linux/bpf.h@@ -3068,6 +3068,17 @@ union bpf_attr { * See: clock_gettime(CLOCK_BOOTTIME) * Return * Current *ktime*. + * + * int bpf_d_path(struct path *path, char *buf, u32 sz) + * Description + * Return full path for given 'struct path' object, which + * needs to be the kernel BTF 'path' object. The path is + * returned in buffer provided 'buf' of size 'sz'. + *
Please specify if it's always zero-terminated string (especially on truncation).
quoted hunk ↗ jump to hunk
+ * Return + * length of returned string on success, or a negative + * error in case of failure + * */ #define __BPF_FUNC_MAPPER(FN) \ FN(unspec), \@@ -3195,7 +3206,8 @@ union bpf_attr { FN(get_netns_cookie), \ FN(get_current_ancestor_cgroup_id), \ FN(sk_assign), \ - FN(ktime_get_boot_ns), + FN(ktime_get_boot_ns), \ + FN(d_path), /* integer value in 'imm' field of BPF_CALL instruction selects which helper * function eBPF program intends to call --2.25.4