]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
tools/bpf: sync kernel header bpf.h and add bpf_task_fd_query in libbpf
authorYonghong Song <yhs@fb.com>
Thu, 24 May 2018 18:21:10 +0000 (11:21 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Fri, 25 May 2018 01:18:19 +0000 (18:18 -0700)
Sync kernel header bpf.h to tools/include/uapi/linux/bpf.h and
implement bpf_task_fd_query() in libbpf. The test programs
in samples/bpf and tools/testing/selftests/bpf, and later bpftool
will use this libbpf function to query kernel.

Acked-by: Martin KaFai Lau <kafai@fb.com>
Signed-off-by: Yonghong Song <yhs@fb.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
tools/include/uapi/linux/bpf.h
tools/lib/bpf/bpf.c
tools/lib/bpf/bpf.h

index e95fec90c2c199fb909201f13c8ea2aa8886dd19..9b8c6e310e9a9666aefec27c74451954711d6bde 100644 (file)
@@ -97,6 +97,7 @@ enum bpf_cmd {
        BPF_RAW_TRACEPOINT_OPEN,
        BPF_BTF_LOAD,
        BPF_BTF_GET_FD_BY_ID,
+       BPF_TASK_FD_QUERY,
 };
 
 enum bpf_map_type {
@@ -380,6 +381,22 @@ union bpf_attr {
                __u32           btf_log_size;
                __u32           btf_log_level;
        };
+
+       struct {
+               __u32           pid;            /* input: pid */
+               __u32           fd;             /* input: fd */
+               __u32           flags;          /* input: flags */
+               __u32           buf_len;        /* input/output: buf len */
+               __aligned_u64   buf;            /* input/output:
+                                                *   tp_name for tracepoint
+                                                *   symbol for kprobe
+                                                *   filename for uprobe
+                                                */
+               __u32           prog_id;        /* output: prod_id */
+               __u32           fd_type;        /* output: BPF_FD_TYPE_* */
+               __u64           probe_offset;   /* output: probe_offset */
+               __u64           probe_addr;     /* output: probe_addr */
+       } task_fd_query;
 } __attribute__((aligned(8)));
 
 /* The description below is an attempt at providing documentation to eBPF
@@ -2557,4 +2574,13 @@ struct bpf_fib_lookup {
        __u8    dmac[6];     /* ETH_ALEN */
 };
 
+enum bpf_task_fd_type {
+       BPF_FD_TYPE_RAW_TRACEPOINT,     /* tp name */
+       BPF_FD_TYPE_TRACEPOINT,         /* tp name */
+       BPF_FD_TYPE_KPROBE,             /* (symbol + offset) or addr */
+       BPF_FD_TYPE_KRETPROBE,          /* (symbol + offset) or addr */
+       BPF_FD_TYPE_UPROBE,             /* filename + offset */
+       BPF_FD_TYPE_URETPROBE,          /* filename + offset */
+};
+
 #endif /* _UAPI__LINUX_BPF_H__ */
index 442b4cdfeb71d38b57f4423edbff0dd0fe4e2dea..9ddc89dae9625111bfab669a3d0674888b2c9a95 100644 (file)
@@ -643,3 +643,26 @@ int bpf_load_btf(void *btf, __u32 btf_size, char *log_buf, __u32 log_buf_size,
 
        return fd;
 }
+
+int bpf_task_fd_query(int pid, int fd, __u32 flags, char *buf, __u32 *buf_len,
+                     __u32 *prog_id, __u32 *fd_type, __u64 *probe_offset,
+                     __u64 *probe_addr)
+{
+       union bpf_attr attr = {};
+       int err;
+
+       attr.task_fd_query.pid = pid;
+       attr.task_fd_query.fd = fd;
+       attr.task_fd_query.flags = flags;
+       attr.task_fd_query.buf = ptr_to_u64(buf);
+       attr.task_fd_query.buf_len = *buf_len;
+
+       err = sys_bpf(BPF_TASK_FD_QUERY, &attr, sizeof(attr));
+       *buf_len = attr.task_fd_query.buf_len;
+       *prog_id = attr.task_fd_query.prog_id;
+       *fd_type = attr.task_fd_query.fd_type;
+       *probe_offset = attr.task_fd_query.probe_offset;
+       *probe_addr = attr.task_fd_query.probe_addr;
+
+       return err;
+}
index d12344f66d4e91be5c31e044ec1cd70606ca3d8d..0639a30a457def3ebf71a537f71353bd6d62686b 100644 (file)
@@ -107,4 +107,7 @@ int bpf_prog_query(int target_fd, enum bpf_attach_type type, __u32 query_flags,
 int bpf_raw_tracepoint_open(const char *name, int prog_fd);
 int bpf_load_btf(void *btf, __u32 btf_size, char *log_buf, __u32 log_buf_size,
                 bool do_log);
+int bpf_task_fd_query(int pid, int fd, __u32 flags, char *buf, __u32 *buf_len,
+                     __u32 *prog_id, __u32 *fd_type, __u64 *probe_offset,
+                     __u64 *probe_addr);
 #endif