Thread (28 messages) 28 messages, 4 authors, 2020-06-02

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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help