From mboxrd@z Thu Jan 1 00:00:00 1970 From: Yonghong Song Subject: [PATCH bpf-next 3/7] tools/bpf: sync kernel header bpf.h and add bpf_trace_event_query in libbpf Date: Tue, 15 May 2018 16:45:17 -0700 Message-ID: <20180515234521.856763-4-yhs@fb.com> References: <20180515234521.856763-1-yhs@fb.com> Mime-Version: 1.0 Content-Type: text/plain Cc: To: , , , Return-path: Received: from mx0a-00082601.pphosted.com ([67.231.145.42]:37502 "EHLO mx0a-00082601.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751309AbeEOXp0 (ORCPT ); Tue, 15 May 2018 19:45:26 -0400 Received: from pps.filterd (m0109334.ppops.net [127.0.0.1]) by mx0a-00082601.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id w4FNgee0013581 for ; Tue, 15 May 2018 16:45:26 -0700 Received: from mail.thefacebook.com ([199.201.64.23]) by mx0a-00082601.pphosted.com with ESMTP id 2j05nkrn12-1 (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NOT) for ; Tue, 15 May 2018 16:45:26 -0700 In-Reply-To: <20180515234521.856763-1-yhs@fb.com> Sender: netdev-owner@vger.kernel.org List-ID: Sync kernel header bpf.h to tools/include/uapi/linux/bpf.h and implement bpf_trace_event_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. Signed-off-by: Yonghong Song --- tools/include/uapi/linux/bpf.h | 25 +++++++++++++++++++++++++ tools/lib/bpf/bpf.c | 23 +++++++++++++++++++++++ tools/lib/bpf/bpf.h | 3 +++ 3 files changed, 51 insertions(+) diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h index 1205d86..a209f01 100644 --- a/tools/include/uapi/linux/bpf.h +++ b/tools/include/uapi/linux/bpf.h @@ -97,6 +97,7 @@ enum bpf_cmd { BPF_RAW_TRACEPOINT_OPEN, BPF_BTF_LOAD, BPF_BTF_GET_FD_BY_ID, + BPF_PERF_EVENT_QUERY, }; enum bpf_map_type { @@ -379,6 +380,22 @@ union bpf_attr { __u32 btf_log_size; __u32 btf_log_level; }; + + struct { + int pid; /* input: pid */ + int fd; /* input: fd */ + __u32 flags; /* input: flags */ + __u32 buf_len; /* input: buf len */ + __aligned_u64 buf; /* input/output: + * tp_name for tracepoint + * symbol for kprobe + * filename for uprobe + */ + __u32 prog_id; /* output: prod_id */ + __u32 prog_info; /* output: BPF_PERF_INFO_* */ + __u64 probe_offset; /* output: probe_offset */ + __u64 probe_addr; /* output: probe_addr */ + } perf_event_query; } __attribute__((aligned(8))); /* The description below is an attempt at providing documentation to eBPF @@ -2450,4 +2467,12 @@ struct bpf_fib_lookup { __u8 dmac[6]; /* ETH_ALEN */ }; +enum { + BPF_PERF_INFO_TP_NAME, /* tp name */ + BPF_PERF_INFO_KPROBE, /* (symbol + offset) or addr */ + BPF_PERF_INFO_KRETPROBE, /* (symbol + offset) or addr */ + BPF_PERF_INFO_UPROBE, /* filename + offset */ + BPF_PERF_INFO_URETPROBE, /* filename + offset */ +}; + #endif /* _UAPI__LINUX_BPF_H__ */ diff --git a/tools/lib/bpf/bpf.c b/tools/lib/bpf/bpf.c index a3a8fb2..e0152aa 100644 --- a/tools/lib/bpf/bpf.c +++ b/tools/lib/bpf/bpf.c @@ -641,3 +641,26 @@ int bpf_load_btf(void *btf, __u32 btf_size, char *log_buf, __u32 log_buf_size, return fd; } + +int bpf_trace_event_query(int pid, int fd, char *buf, __u32 buf_len, + __u32 *prog_id, __u32 *prog_info, + __u64 *probe_offset, __u64 *probe_addr) +{ + union bpf_attr attr = {}; + int err; + + attr.perf_event_query.pid = pid; + attr.perf_event_query.fd = fd; + attr.perf_event_query.buf = ptr_to_u64(buf); + attr.perf_event_query.buf_len = buf_len; + + err = sys_bpf(BPF_PERF_EVENT_QUERY, &attr, sizeof(attr)); + if (!err) { + *prog_id = attr.perf_event_query.prog_id; + *prog_info = attr.perf_event_query.prog_info; + *probe_offset = attr.perf_event_query.probe_offset; + *probe_addr = attr.perf_event_query.probe_addr; + } + + return err; +} diff --git a/tools/lib/bpf/bpf.h b/tools/lib/bpf/bpf.h index fb3a146..53d05fc 100644 --- a/tools/lib/bpf/bpf.h +++ b/tools/lib/bpf/bpf.h @@ -105,4 +105,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_trace_event_query(int pid, int fd, char *buf, __u32 buf_len, + __u32 *prog_id, __u32 *prog_info, + __u64 *probe_offset, __u64 *probe_addr); #endif -- 2.9.5