From patchwork Tue May 15 23:45:17 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yonghong Song X-Patchwork-Id: 914028 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=fb.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=fb.com header.i=@fb.com header.b="evq6NQvx"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40lvMM2Crpz9s0y for ; Wed, 16 May 2018 09:45:35 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752272AbeEOXp1 (ORCPT ); Tue, 15 May 2018 19:45:27 -0400 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 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fb.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-type; s=facebook; bh=oKWZqdwBA4bkE0jN6XlVdReIWgBIx8W6tDwT98o7B9I=; b=evq6NQvx6us1SwYUWde9srYkuYeaJoP1DiVXopB2XeQ5ldZptU1ZO4tHUJANzJKUzh0Y Q8P9UCYfQ1rTzKb6z2DGSlRgxovlS1/37KApEhh+dTp1iVrBwICgHQ1jfGqMmYTJLMng bnSh65nOFwZRFNCFvQ+yvAgpwFLI1K0rl38= 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 Received: from mx-out.facebook.com (192.168.52.123) by PRN-CHUB10.TheFacebook.com (192.168.16.20) with Microsoft SMTP Server id 14.3.361.1; Tue, 15 May 2018 16:45:24 -0700 Received: by devbig003.ftw2.facebook.com (Postfix, from userid 128203) id A306D37015D5; Tue, 15 May 2018 16:45:22 -0700 (PDT) Smtp-Origin-Hostprefix: devbig From: Yonghong Song Smtp-Origin-Hostname: devbig003.ftw2.facebook.com To: , , , CC: Smtp-Origin-Cluster: ftw2c04 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> X-Mailer: git-send-email 2.9.5 In-Reply-To: <20180515234521.856763-1-yhs@fb.com> References: <20180515234521.856763-1-yhs@fb.com> X-FB-Internal: Safe MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:, , definitions=2018-05-15_09:, , signatures=0 X-Proofpoint-Spam-Reason: safe X-FB-Internal: Safe Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org 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