From patchwork Tue Aug 20 21:48:16 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Xu X-Patchwork-Id: 1150396 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: incoming-bpf@patchwork.ozlabs.org Delivered-To: patchwork-incoming-bpf@bilbo.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=bpf-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=dxuuu.xyz Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=dxuuu.xyz header.i=@dxuuu.xyz header.b="rz8uPXvV"; dkim=pass (2048-bit key; unprotected) header.d=messagingengine.com header.i=@messagingengine.com header.b="mO4CKoUe"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 46Ckw01BJvz9sBp for ; Wed, 21 Aug 2019 07:49:20 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730882AbfHTVtD (ORCPT ); Tue, 20 Aug 2019 17:49:03 -0400 Received: from new4-smtp.messagingengine.com ([66.111.4.230]:58177 "EHLO new4-smtp.messagingengine.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730430AbfHTVtC (ORCPT ); Tue, 20 Aug 2019 17:49:02 -0400 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailnew.nyi.internal (Postfix) with ESMTP id 498D52CAE; Tue, 20 Aug 2019 17:49:01 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute4.internal (MEProxy); Tue, 20 Aug 2019 17:49:01 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dxuuu.xyz; h= from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; s=fm1; bh=GpEKID6TfOFP4 CaEQSHu9G/hQ0IKQBVHpwa2lUjQrgs=; b=rz8uPXvVFavAYeBk8XDhzbsEX0KD4 QWRGbaGXIKB81NBnxV2EY0PggyvzQHXFzfQ2kOiGeEI8XCMKWGGru6JUzTsWKK8O mQtpEtCsXasU2Z7Nu+dGMh1BdvSyWXJIUZCPSksYwEN+bVzY1kpCTSH0vaphrLeu WzqoMAlThxP6RFCnYZ0o0xLQgUVdbRWOVQ71DaUbBLsm13hUOkzG7bep338g7XwO SzCTHBtyp9x7G7VAGBqm8WsiGCcnsT7ooYrtVqYOhWHS1s5xB+ABT5b4jYkB4PBy 62I3/cX0elh+Wx6TWB5a9byEokGvDEVKJ2YyzhzIIbFP/Wi7SNwLn52+w== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-transfer-encoding:date:from :in-reply-to:message-id:mime-version:references:subject:to :x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s= fm3; bh=GpEKID6TfOFP4CaEQSHu9G/hQ0IKQBVHpwa2lUjQrgs=; b=mO4CKoUe f6wzbSwD2wmuvHsBqX4xWcSxKOy7X7ShGXA2MlrhYMLdT0Lgc1KNZSwBmG3mXRXB ggLzy32bjyjZVZWHRn01bPyWi+AP2EMUvZ9VhV8NoTRDbwj8iYnEJiBniT0PBCR5 p3jgAHc/wCYp1aalB2lvEpUz4NJ5ikNUL5HM8UN/4b8aiy/jsqz0yaZcCSjfBu6b 5E4kw1JomE7k1lpilVcqUX135M6MhFs1WnYLiEpMJi8BYeMR8f+kA5n4xCdtMFl2 ut2qiRehKsdTzUuuG6ocp/HHZnB9QSYKCu4OyUauVznDyfWg9m1Xpc8cJBN9kkKM VYyqR50YDTRVgQ== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeduvddrudegvddgtdegucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucgfrhhlucfvnfffucdljedtmdenucfjughrpefhvf fufffkofgjfhgggfestdekredtredttdenucfhrhhomhepffgrnhhivghlucgiuhcuoegu gihusegugihuuhhurdighiiiqeenucfkphepudelledrvddtuddrieegrddvnecurfgrrh grmhepmhgrihhlfhhrohhmpegugihusegugihuuhhurdighiiinecuvehluhhsthgvrhfu ihiivgeptd X-ME-Proxy: Received: from dlxu-fedora-R90QNFJV.thefacebook.com (unknown [199.201.64.2]) by mail.messagingengine.com (Postfix) with ESMTPA id 3DA1880064; Tue, 20 Aug 2019 17:48:59 -0400 (EDT) From: Daniel Xu To: bpf@vger.kernel.org, songliubraving@fb.com, yhs@fb.com, andriin@fb.com, peterz@infradead.org, mingo@redhat.com, acme@kernel.org Cc: Daniel Xu , ast@fb.com, alexander.shishkin@linux.intel.com, jolsa@redhat.com, namhyung@kernel.org, linux-kernel@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v4 bpf-next 1/4] tracing/probe: Add PERF_EVENT_IOC_QUERY_PROBE ioctl Date: Tue, 20 Aug 2019 14:48:16 -0700 Message-Id: <20190820214819.16154-2-dxu@dxuuu.xyz> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190820214819.16154-1-dxu@dxuuu.xyz> References: <20190820214819.16154-1-dxu@dxuuu.xyz> MIME-Version: 1.0 Sender: bpf-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: bpf@vger.kernel.org It's useful to know [uk]probe's nmissed and nhit stats. For example with tracing tools, it's important to know when events may have been lost. debugfs currently exposes a control file to get this information, but it is not compatible with probes registered with the perf API. While bpf programs may be able to manually count nhit, there is no way to gather nmissed. In other words, it is currently not possible to retrieve information about FD-based probes. This patch adds a new ioctl that lets users query nmissed (as well as nhit for completeness). We currently only add support for [uk]probes but leave the possibility open for other probes like tracepoint. Signed-off-by: Daniel Xu --- include/linux/trace_events.h | 2 ++ include/uapi/linux/perf_event.h | 23 +++++++++++++++++++++++ kernel/events/core.c | 20 ++++++++++++++++++++ kernel/trace/trace_kprobe.c | 25 +++++++++++++++++++++++++ kernel/trace/trace_uprobe.c | 25 +++++++++++++++++++++++++ 5 files changed, 95 insertions(+) diff --git a/include/linux/trace_events.h b/include/linux/trace_events.h index 5150436783e8..96f3cf2e39b4 100644 --- a/include/linux/trace_events.h +++ b/include/linux/trace_events.h @@ -586,6 +586,7 @@ extern int bpf_get_kprobe_info(const struct perf_event *event, u32 *fd_type, const char **symbol, u64 *probe_offset, u64 *probe_addr, bool perf_type_tracepoint); +extern int perf_kprobe_event_query(struct perf_event *event, void __user *info); #endif #ifdef CONFIG_UPROBE_EVENTS extern int perf_uprobe_init(struct perf_event *event, @@ -594,6 +595,7 @@ extern void perf_uprobe_destroy(struct perf_event *event); extern int bpf_get_uprobe_info(const struct perf_event *event, u32 *fd_type, const char **filename, u64 *probe_offset, bool perf_type_tracepoint); +extern int perf_uprobe_event_query(struct perf_event *event, void __user *info); #endif extern int ftrace_profile_set_filter(struct perf_event *event, int event_id, char *filter_str); diff --git a/include/uapi/linux/perf_event.h b/include/uapi/linux/perf_event.h index 7198ddd0c6b1..8783d29a807a 100644 --- a/include/uapi/linux/perf_event.h +++ b/include/uapi/linux/perf_event.h @@ -447,6 +447,28 @@ struct perf_event_query_bpf { __u32 ids[0]; }; +/* + * Structure used by below PERF_EVENT_IOC_QUERY_PROBE command + * to query information about the probe attached to the perf + * event. Currently only supports [uk]probes. + */ +struct perf_event_query_probe { + /* + * Size of structure for forward/backward compatibility + */ + __u64 size; + /* + * Set by the kernel to indicate number of times this probe + * was temporarily disabled + */ + __u64 nmissed; + /* + * Set by the kernel to indicate number of times this probe + * was hit + */ + __u64 nhit; +}; + /* * Ioctls that can be done on a perf event fd: */ @@ -462,6 +484,7 @@ struct perf_event_query_bpf { #define PERF_EVENT_IOC_PAUSE_OUTPUT _IOW('$', 9, __u32) #define PERF_EVENT_IOC_QUERY_BPF _IOWR('$', 10, struct perf_event_query_bpf *) #define PERF_EVENT_IOC_MODIFY_ATTRIBUTES _IOW('$', 11, struct perf_event_attr *) +#define PERF_EVENT_IOC_QUERY_PROBE _IOR('$', 12, struct perf_event_query_probe *) enum perf_event_ioc_flags { PERF_IOC_FLAG_GROUP = 1U << 0, diff --git a/kernel/events/core.c b/kernel/events/core.c index 0463c1151bae..ed33d50511a3 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -5060,6 +5060,8 @@ static int perf_event_set_filter(struct perf_event *event, void __user *arg); static int perf_event_set_bpf_prog(struct perf_event *event, u32 prog_fd); static int perf_copy_attr(struct perf_event_attr __user *uattr, struct perf_event_attr *attr); +static int perf_probe_event_query(struct perf_event *event, + void __user *info); static long _perf_ioctl(struct perf_event *event, unsigned int cmd, unsigned long arg) { @@ -5143,6 +5145,10 @@ static long _perf_ioctl(struct perf_event *event, unsigned int cmd, unsigned lon return perf_event_modify_attr(event, &new_attr); } +#if defined(CONFIG_KPROBE_EVENTS) || defined(CONFIG_UPROBE_EVENTS) + case PERF_EVENT_IOC_QUERY_PROBE: + return perf_probe_event_query(event, (void __user *)arg); +#endif default: return -ENOTTY; } @@ -8833,6 +8839,20 @@ static inline void perf_tp_register(void) #endif } +static int perf_probe_event_query(struct perf_event *event, + void __user *info) +{ +#ifdef CONFIG_KPROBE_EVENTS + if (event->attr.type == perf_kprobe.type) + return perf_kprobe_event_query(event, (void __user *)info); +#endif +#ifdef CONFIG_UPROBE_EVENTS + if (event->attr.type == perf_uprobe.type) + return perf_uprobe_event_query(event, (void __user *)info); +#endif + return -EINVAL; +} + static void perf_event_free_filter(struct perf_event *event) { ftrace_profile_free_filter(event); diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c index 9d483ad9bb6c..7da9b0102e34 100644 --- a/kernel/trace/trace_kprobe.c +++ b/kernel/trace/trace_kprobe.c @@ -196,6 +196,31 @@ bool trace_kprobe_error_injectable(struct trace_event_call *call) return within_error_injection_list(trace_kprobe_address(tk)); } +int perf_kprobe_event_query(struct perf_event *event, void __user *info) +{ + struct perf_event_query_probe __user *uquery = info; + struct perf_event_query_probe query = {}; + struct trace_event_call *call = event->tp_event; + struct trace_kprobe *tk = (struct trace_kprobe *)call->data; + u64 ncopy; + + if (!capable(CAP_SYS_ADMIN)) + return -EPERM; + if (copy_from_user(&query, uquery, + offsetofend(struct perf_event_query_probe, size))) + return -EFAULT; + + ncopy = min_t(u64, query.size, sizeof(query)); + query.size = ncopy; + query.nhit = trace_kprobe_nhit(tk); + query.nmissed = tk->rp.kp.nmissed; + + if (copy_to_user(uquery, &query, ncopy)) + return -EFAULT; + + return 0; +} + static int register_kprobe_event(struct trace_kprobe *tk); static int unregister_kprobe_event(struct trace_kprobe *tk); diff --git a/kernel/trace/trace_uprobe.c b/kernel/trace/trace_uprobe.c index 1ceedb9146b1..88c03cc9042e 100644 --- a/kernel/trace/trace_uprobe.c +++ b/kernel/trace/trace_uprobe.c @@ -1333,6 +1333,31 @@ static inline void init_trace_event_call(struct trace_uprobe *tu) call->data = tu; } +int perf_uprobe_event_query(struct perf_event *event, void __user *info) +{ + struct perf_event_query_probe __user *uquery = info; + struct perf_event_query_probe query = {}; + struct trace_event_call *call = event->tp_event; + struct trace_uprobe *tu = (struct trace_uprobe *)call->data; + u64 ncopy; + + if (!capable(CAP_SYS_ADMIN)) + return -EPERM; + if (copy_from_user(&query, uquery, + offsetofend(struct perf_event_query_probe, size))) + return -EFAULT; + + ncopy = min_t(u64, query.size, sizeof(query)); + query.size = ncopy; + query.nhit = tu->nhit; + query.nmissed = 0; + + if (copy_to_user(uquery, &query, ncopy)) + return -EFAULT; + + return 0; +} + static int register_uprobe_event(struct trace_uprobe *tu) { init_trace_event_call(tu); From patchwork Tue Aug 20 21:48:17 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Xu X-Patchwork-Id: 1150395 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: incoming-bpf@patchwork.ozlabs.org Delivered-To: patchwork-incoming-bpf@bilbo.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=bpf-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=dxuuu.xyz Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=dxuuu.xyz header.i=@dxuuu.xyz header.b="n1cViQBo"; dkim=pass (2048-bit key; unprotected) header.d=messagingengine.com header.i=@messagingengine.com header.b="M+KoGwTq"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 46Ckvz36PSz9sNf for ; Wed, 21 Aug 2019 07:49:19 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730959AbfHTVtP (ORCPT ); Tue, 20 Aug 2019 17:49:15 -0400 Received: from new4-smtp.messagingengine.com ([66.111.4.230]:60659 "EHLO new4-smtp.messagingengine.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730866AbfHTVtE (ORCPT ); Tue, 20 Aug 2019 17:49:04 -0400 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailnew.nyi.internal (Postfix) with ESMTP id 2D6042CFE; Tue, 20 Aug 2019 17:49:03 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute4.internal (MEProxy); Tue, 20 Aug 2019 17:49:03 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dxuuu.xyz; h= from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; s=fm1; bh=evbhp73Xk8bWT LyfS6KQIzihDp0fb6c/a4M3e31kJSI=; b=n1cViQBoOVXChiLULzrLRpsR3NBgV 83aKYIeB/kwLMadT20lkAbu+XBIoYPHC0Rb13gaW/xwqukjZt5qDww6EtGRp6l+r AJGZSTmSK5x6TQqi1s4VmEpEgSNi1JMxUJl6Qzy/ujSzdbQiB9oKZ2FXhW7x6+7O s+d/fYhJ0xEtA6n3IalNqxtp35yQWIcX2YQytWNVqor+X6y9+iE3Z5NGyrtnm0kg Tys+uRkW/bWM7vkQjRq8jGEBl0KmqyEbUL3GwLD4aXl10LF7eB9XTfIUHMCugZxp 8UaXhyiKs6dizauTR5Nb2tAEBIBZU4UNjA/7hBNtOSPJZsqpbdNRHUT/g== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-transfer-encoding:date:from :in-reply-to:message-id:mime-version:references:subject:to :x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s= fm3; bh=evbhp73Xk8bWTLyfS6KQIzihDp0fb6c/a4M3e31kJSI=; b=M+KoGwTq 09BUUWEVKHN6Tm+IIB8BYRLmXtXq3vh8t854p12nUrb/xhrOt66zPYdQZTarIvBC YpFlMgnroFT5r9537ljQtYbc/uiw14i6M9u6kLWIDUAUsl9RtqdK0fEKXRZ6gJh5 4EiDD/CcPWVQUpeFbZkJ7hOiuh5Gju/aZ9zGqXRPUd3ItJMa/SiiARUkjXSibMzw C+rHk0pQ8Sh6hAoAyfP58o2y4+AHfTOmqQfMa2KKaPGdiuHI6NVAvS1z+xk6Iae5 xFFw11cR3y/TyrIrZegbWKIcf5mFQurnkcemU55pL4+KBBpYHLWfOjzA9KX7Bvp6 9T/v4fisgsdXMQ== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeduvddrudegvddgtdegucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucgfrhhlucfvnfffucdlfeehmdenucfjughrpefhvf fufffkofgjfhgggfestdekredtredttdenucfhrhhomhepffgrnhhivghlucgiuhcuoegu gihusegugihuuhhurdighiiiqeenucfkphepudelledrvddtuddrieegrddvnecurfgrrh grmhepmhgrihhlfhhrohhmpegugihusegugihuuhhurdighiiinecuvehluhhsthgvrhfu ihiivgepud X-ME-Proxy: Received: from dlxu-fedora-R90QNFJV.thefacebook.com (unknown [199.201.64.2]) by mail.messagingengine.com (Postfix) with ESMTPA id 1299C80059; Tue, 20 Aug 2019 17:49:00 -0400 (EDT) From: Daniel Xu To: bpf@vger.kernel.org, songliubraving@fb.com, yhs@fb.com, andriin@fb.com, peterz@infradead.org, mingo@redhat.com, acme@kernel.org Cc: Daniel Xu , ast@fb.com, alexander.shishkin@linux.intel.com, jolsa@redhat.com, namhyung@kernel.org, linux-kernel@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v4 bpf-next 2/4] libbpf: Add helpers to extract perf fd from bpf_link Date: Tue, 20 Aug 2019 14:48:17 -0700 Message-Id: <20190820214819.16154-3-dxu@dxuuu.xyz> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190820214819.16154-1-dxu@dxuuu.xyz> References: <20190820214819.16154-1-dxu@dxuuu.xyz> MIME-Version: 1.0 Sender: bpf-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: bpf@vger.kernel.org It is sometimes necessary to perform ioctl's on the underlying perf fd. There is not currently a way to extract the fd given a bpf_link, so add a a pair of casting and getting helpers. The casting and getting helpers are nice because they let us define broad categories of links that makes it clear to users what they can expect to extract from what type of link. Acked-by: Song Liu Acked-by: Andrii Nakryiko Signed-off-by: Daniel Xu --- tools/lib/bpf/libbpf.c | 21 +++++++++++++++++++++ tools/lib/bpf/libbpf.h | 13 +++++++++++++ tools/lib/bpf/libbpf.map | 3 +++ 3 files changed, 37 insertions(+) diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index 2233f919dd88..41588e13be2b 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c @@ -4876,6 +4876,7 @@ int bpf_prog_load_xattr(const struct bpf_prog_load_attr *attr, struct bpf_link { int (*destroy)(struct bpf_link *link); + enum bpf_link_type type; }; int bpf_link__destroy(struct bpf_link *link) @@ -4909,6 +4910,24 @@ static int bpf_link__destroy_perf_event(struct bpf_link *link) return err; } +const struct bpf_link_fd *bpf_link__as_fd(const struct bpf_link *link) +{ + if (link->type != LIBBPF_LINK_FD) + return NULL; + + return (struct bpf_link_fd *)link; +} + +enum bpf_link_type bpf_link__type(const struct bpf_link *link) +{ + return link->type; +} + +int bpf_link_fd__fd(const struct bpf_link_fd *link) +{ + return link->fd; +} + struct bpf_link *bpf_program__attach_perf_event(struct bpf_program *prog, int pfd) { @@ -4932,6 +4951,7 @@ struct bpf_link *bpf_program__attach_perf_event(struct bpf_program *prog, if (!link) return ERR_PTR(-ENOMEM); link->link.destroy = &bpf_link__destroy_perf_event; + link->link.type = LIBBPF_LINK_FD; link->fd = pfd; if (ioctl(pfd, PERF_EVENT_IOC_SET_BPF, prog_fd) < 0) { @@ -5225,6 +5245,7 @@ struct bpf_link *bpf_program__attach_raw_tracepoint(struct bpf_program *prog, link = malloc(sizeof(*link)); if (!link) return ERR_PTR(-ENOMEM); + link->link.type = LIBBPF_LINK_FD; link->link.destroy = &bpf_link__destroy_fd; pfd = bpf_raw_tracepoint_open(tp_name, prog_fd); diff --git a/tools/lib/bpf/libbpf.h b/tools/lib/bpf/libbpf.h index e8f70977d137..2ddef5315ff9 100644 --- a/tools/lib/bpf/libbpf.h +++ b/tools/lib/bpf/libbpf.h @@ -166,7 +166,20 @@ LIBBPF_API int bpf_program__pin(struct bpf_program *prog, const char *path); LIBBPF_API int bpf_program__unpin(struct bpf_program *prog, const char *path); LIBBPF_API void bpf_program__unload(struct bpf_program *prog); +enum bpf_link_type { + LIBBPF_LINK_FD, +}; + struct bpf_link; +struct bpf_link_fd; + +/* casting APIs */ +LIBBPF_API const struct bpf_link_fd * +bpf_link__as_fd(const struct bpf_link *link); + +/* getters APIs */ +LIBBPF_API enum bpf_link_type bpf_link__type(const struct bpf_link *link); +LIBBPF_API int bpf_link_fd__fd(const struct bpf_link_fd *link); LIBBPF_API int bpf_link__destroy(struct bpf_link *link); diff --git a/tools/lib/bpf/libbpf.map b/tools/lib/bpf/libbpf.map index 664ce8e7a60e..ed169579896f 100644 --- a/tools/lib/bpf/libbpf.map +++ b/tools/lib/bpf/libbpf.map @@ -188,4 +188,7 @@ LIBBPF_0.0.4 { LIBBPF_0.0.5 { global: bpf_btf_get_next_id; + bpf_link__type; + bpf_link__as_fd; + bpf_link_fd__fd; } LIBBPF_0.0.4; From patchwork Tue Aug 20 21:48:18 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Xu X-Patchwork-Id: 1150394 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: incoming-bpf@patchwork.ozlabs.org Delivered-To: patchwork-incoming-bpf@bilbo.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=bpf-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=dxuuu.xyz Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=dxuuu.xyz header.i=@dxuuu.xyz header.b="kP5EwCsV"; dkim=pass (2048-bit key; unprotected) header.d=messagingengine.com header.i=@messagingengine.com header.b="WfM15Iqi"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 46Ckvt055Vz9sNp for ; Wed, 21 Aug 2019 07:49:14 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730875AbfHTVtF (ORCPT ); Tue, 20 Aug 2019 17:49:05 -0400 Received: from new4-smtp.messagingengine.com ([66.111.4.230]:45801 "EHLO new4-smtp.messagingengine.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730430AbfHTVtF (ORCPT ); Tue, 20 Aug 2019 17:49:05 -0400 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailnew.nyi.internal (Postfix) with ESMTP id 10C852D24; Tue, 20 Aug 2019 17:49:05 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute4.internal (MEProxy); Tue, 20 Aug 2019 17:49:05 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dxuuu.xyz; h= from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; s=fm1; bh=z4oOh2xhhsCcC my3nCpcf0gr83yq5CvcoHQWJ/otDsI=; b=kP5EwCsV6T27tUgWYdhlESnp9q+j5 kT9++Hy70YvWqWRh6EirRf0AEeVUKO7Vr+GMwG9683xnv5zWXbH7Qrm+aUMp/c+6 Mkxs0dlnRO0uB+aAHtvWtfh3PsSxwwtxiLlvRWEksKEEWxbGu8WTDOfrh5YqymEU 5Xw36ToJEe0fUfb/fwalkQleSEpICjofhdl9eMdJcJKy2j1frTgMuC4kxlDvr3Gd MZyU5fRoDbu54NbNte7JfZeZf653SG7GuSWsGAPGfOr+Dxdsfv0uM6tcvcwiEy9m 3Ur7hnsE930rFw1U9WEsODkw81YZndKbvB70PqnImWEU0eUSnjIO3QpwQ== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-transfer-encoding:date:from :in-reply-to:message-id:mime-version:references:subject:to :x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s= fm3; bh=z4oOh2xhhsCcCmy3nCpcf0gr83yq5CvcoHQWJ/otDsI=; b=WfM15Iqi RTL6PLoBQp1vEzQkU2BOzTG748uaN4yNlgzNDa9c1jN17XnI0lI/fAKGhd0yM2Ai DNqxIuQa/gMkhZ0LfmzsKwQMaz7A700ZpHRzNiiN9bEFDlZZ/N0qxK90BSaf/Xqb 97eYFGWshZVctDWGoWPPR+NKcNEf8tZ7JdWgqzPqtBxTQd8WKqXTkjdC29X0U269 jYOEJuOfvh3MzFRIljWqwq4ct/uZiR12CNCepDgQIxWaqIceE5aObsBl+aFZO/2i NCnlszeGoYRWSqkyX2xsq94zXjngzp3/ehu3u6Jms/qlZmzAcanDawGIVP82oOc5 WChN8O+Wt+2jkQ== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeduvddrudegvddgtdegucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucgfrhhlucfvnfffucdljedtmdenucfjughrpefhvf fufffkofgjfhgggfestdekredtredttdenucfhrhhomhepffgrnhhivghlucgiuhcuoegu gihusegugihuuhhurdighiiiqeenucfkphepudelledrvddtuddrieegrddvnecurfgrrh grmhepmhgrihhlfhhrohhmpegugihusegugihuuhhurdighiiinecuvehluhhsthgvrhfu ihiivgepud X-ME-Proxy: Received: from dlxu-fedora-R90QNFJV.thefacebook.com (unknown [199.201.64.2]) by mail.messagingengine.com (Postfix) with ESMTPA id 08CCB80064; Tue, 20 Aug 2019 17:49:02 -0400 (EDT) From: Daniel Xu To: bpf@vger.kernel.org, songliubraving@fb.com, yhs@fb.com, andriin@fb.com, peterz@infradead.org, mingo@redhat.com, acme@kernel.org Cc: Daniel Xu , ast@fb.com, alexander.shishkin@linux.intel.com, jolsa@redhat.com, namhyung@kernel.org, linux-kernel@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v4 bpf-next 3/4] tracing/probe: Sync perf_event.h to tools Date: Tue, 20 Aug 2019 14:48:18 -0700 Message-Id: <20190820214819.16154-4-dxu@dxuuu.xyz> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190820214819.16154-1-dxu@dxuuu.xyz> References: <20190820214819.16154-1-dxu@dxuuu.xyz> MIME-Version: 1.0 Sender: bpf-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: bpf@vger.kernel.org Signed-off-by: Daniel Xu --- tools/include/uapi/linux/perf_event.h | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/tools/include/uapi/linux/perf_event.h b/tools/include/uapi/linux/perf_event.h index 7198ddd0c6b1..8783d29a807a 100644 --- a/tools/include/uapi/linux/perf_event.h +++ b/tools/include/uapi/linux/perf_event.h @@ -447,6 +447,28 @@ struct perf_event_query_bpf { __u32 ids[0]; }; +/* + * Structure used by below PERF_EVENT_IOC_QUERY_PROBE command + * to query information about the probe attached to the perf + * event. Currently only supports [uk]probes. + */ +struct perf_event_query_probe { + /* + * Size of structure for forward/backward compatibility + */ + __u64 size; + /* + * Set by the kernel to indicate number of times this probe + * was temporarily disabled + */ + __u64 nmissed; + /* + * Set by the kernel to indicate number of times this probe + * was hit + */ + __u64 nhit; +}; + /* * Ioctls that can be done on a perf event fd: */ @@ -462,6 +484,7 @@ struct perf_event_query_bpf { #define PERF_EVENT_IOC_PAUSE_OUTPUT _IOW('$', 9, __u32) #define PERF_EVENT_IOC_QUERY_BPF _IOWR('$', 10, struct perf_event_query_bpf *) #define PERF_EVENT_IOC_MODIFY_ATTRIBUTES _IOW('$', 11, struct perf_event_attr *) +#define PERF_EVENT_IOC_QUERY_PROBE _IOR('$', 12, struct perf_event_query_probe *) enum perf_event_ioc_flags { PERF_IOC_FLAG_GROUP = 1U << 0, From patchwork Tue Aug 20 21:48:19 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Xu X-Patchwork-Id: 1150393 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: incoming-bpf@patchwork.ozlabs.org Delivered-To: patchwork-incoming-bpf@bilbo.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=bpf-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=dxuuu.xyz Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=dxuuu.xyz header.i=@dxuuu.xyz header.b="sJJ+Nd9K"; dkim=pass (2048-bit key; unprotected) header.d=messagingengine.com header.i=@messagingengine.com header.b="KvnfySik"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 46Ckvs1xYYz9sNf for ; Wed, 21 Aug 2019 07:49:13 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730895AbfHTVtI (ORCPT ); Tue, 20 Aug 2019 17:49:08 -0400 Received: from new4-smtp.messagingengine.com ([66.111.4.230]:44007 "EHLO new4-smtp.messagingengine.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730959AbfHTVtI (ORCPT ); Tue, 20 Aug 2019 17:49:08 -0400 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailnew.nyi.internal (Postfix) with ESMTP id E6B212D8D; Tue, 20 Aug 2019 17:49:06 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute4.internal (MEProxy); Tue, 20 Aug 2019 17:49:06 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dxuuu.xyz; h= from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; s=fm1; bh=wwzGUs2eyk7oG KkxpIpcL+YllWVCcAIC2rCVN5UFoSE=; b=sJJ+Nd9KAIanYgid7Uunyl0bcNSWD 79wzJl5yG56rIJhAeUwgetaTfwIhf3d9uUSWgFtoT+LhJOuAfyyqmc0z31QmeZRT qKMeJ724G3fiq4dE5Q/kfq3eDeC+ml2KhblOsJJ5jGvqNQC0dY9UCliRWPsw48+B qZ2BEyLWr1dM8srMsUt2lRioKlLsbCkXFCyYDnQ7tagHaxZ/IBRGrpYffJf+MMWb p6Y4nnmXxaw4rp4K8Y8yXHawf+qVfN5kFWWnTx/z5euRqlon/2oR9kBAvI1E/EFb fK37xLWJCQYTtqPNuYHManTi7XOGxPXJwI14Y5/MyFZhH3G4kF3kxrt1Q== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-transfer-encoding:date:from :in-reply-to:message-id:mime-version:references:subject:to :x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s= fm3; bh=wwzGUs2eyk7oGKkxpIpcL+YllWVCcAIC2rCVN5UFoSE=; b=KvnfySik zzfcW6uLPaAku9Ew9As/y9bTbTLJIYn4ROZsdIQtX8kTfpItLKlr8d4RMmj3K4EN UGvCRkv8qM18oy5XYtXOgnHol61u10ysbqArNBim/BfmrlZycdj/S6K7i0ttJGoM qhx+EK8orMk0KiTUNLKbbAlYttXIb6TSO1VCE1O3bsAArAf02e12QOzF0Uj2UR14 wxQBbC/cfiRi6HgfIrGDAI1hyRzjm9iXVgt0AyS7G0+7O+oFA7c/mwqQmfPXk5Am Vnx6/BG4n92DGrsqOFjpOfoadIqR5/HqnH83TL3jNbyPCX76kU+liZNtogA3E1/1 H4BCqMzSbTiLVA== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeduvddrudegvddgtdegucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucgfrhhlucfvnfffucdlfeehmdenucfjughrpefhvf fufffkofgjfhgggfestdekredtredttdenucfhrhhomhepffgrnhhivghlucgiuhcuoegu gihusegugihuuhhurdighiiiqeenucfkphepudelledrvddtuddrieegrddvnecurfgrrh grmhepmhgrihhlfhhrohhmpegugihusegugihuuhhurdighiiinecuvehluhhsthgvrhfu ihiivgepud X-ME-Proxy: Received: from dlxu-fedora-R90QNFJV.thefacebook.com (unknown [199.201.64.2]) by mail.messagingengine.com (Postfix) with ESMTPA id D1F7280060; Tue, 20 Aug 2019 17:49:04 -0400 (EDT) From: Daniel Xu To: bpf@vger.kernel.org, songliubraving@fb.com, yhs@fb.com, andriin@fb.com, peterz@infradead.org, mingo@redhat.com, acme@kernel.org Cc: Daniel Xu , ast@fb.com, alexander.shishkin@linux.intel.com, jolsa@redhat.com, namhyung@kernel.org, linux-kernel@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v4 bpf-next 4/4] tracing/probe: Add self test for PERF_EVENT_IOC_QUERY_PROBE Date: Tue, 20 Aug 2019 14:48:19 -0700 Message-Id: <20190820214819.16154-5-dxu@dxuuu.xyz> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190820214819.16154-1-dxu@dxuuu.xyz> References: <20190820214819.16154-1-dxu@dxuuu.xyz> MIME-Version: 1.0 Sender: bpf-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: bpf@vger.kernel.org Acked-by: Andrii Nakryiko Signed-off-by: Daniel Xu --- .../selftests/bpf/prog_tests/attach_probe.c | 115 ++++++++++++++++++ 1 file changed, 115 insertions(+) diff --git a/tools/testing/selftests/bpf/prog_tests/attach_probe.c b/tools/testing/selftests/bpf/prog_tests/attach_probe.c index 5ecc267d98b0..414d5f4f7ccd 100644 --- a/tools/testing/selftests/bpf/prog_tests/attach_probe.c +++ b/tools/testing/selftests/bpf/prog_tests/attach_probe.c @@ -27,17 +27,27 @@ void test_attach_probe(void) const char *kretprobe_name = "kretprobe/sys_nanosleep"; const char *uprobe_name = "uprobe/trigger_func"; const char *uretprobe_name = "uretprobe/trigger_func"; + struct perf_event_query_probe kprobe_query = {}; + struct perf_event_query_probe kretprobe_query = {}; + struct perf_event_query_probe uprobe_query = {}; + struct perf_event_query_probe uretprobe_query = {}; const int kprobe_idx = 0, kretprobe_idx = 1; const int uprobe_idx = 2, uretprobe_idx = 3; const char *file = "./test_attach_probe.o"; struct bpf_program *kprobe_prog, *kretprobe_prog; struct bpf_program *uprobe_prog, *uretprobe_prog; struct bpf_object *obj; + const struct bpf_link_fd *kprobe_fd_link; + const struct bpf_link_fd *kretprobe_fd_link; + const struct bpf_link_fd *uprobe_fd_link; + const struct bpf_link_fd *uretprobe_fd_link; int err, prog_fd, duration = 0, res; struct bpf_link *kprobe_link = NULL; struct bpf_link *kretprobe_link = NULL; struct bpf_link *uprobe_link = NULL; struct bpf_link *uretprobe_link = NULL; + int kprobe_fd, kretprobe_fd; + int uprobe_fd, uretprobe_fd; int results_map_fd; size_t uprobe_offset; ssize_t base_addr; @@ -116,6 +126,63 @@ void test_attach_probe(void) /* trigger & validate kprobe && kretprobe */ usleep(1); + kprobe_fd_link = bpf_link__as_fd(kprobe_link); + if (CHECK(!kprobe_fd_link, "kprobe_link_as_fd", + "failed to cast link to fd link\n")) + goto cleanup; + + kprobe_fd = bpf_link_fd__fd(kprobe_fd_link); + if (CHECK(kprobe_fd < 0, "kprobe_get_perf_fd", + "failed to get perf fd from kprobe link\n")) + goto cleanup; + + kretprobe_fd_link = bpf_link__as_fd(kretprobe_link); + if (CHECK(!kretprobe_fd_link, "kretprobe_link_as_fd", + "failed to cast link to fd link\n")) + goto cleanup; + + kretprobe_fd = bpf_link_fd__fd(kretprobe_fd_link); + if (CHECK(kretprobe_fd < 0, "kretprobe_get_perf_fd", + "failed to get perf fd from kretprobe link\n")) + goto cleanup; + + kprobe_query.size = sizeof(kprobe_query); + err = ioctl(kprobe_fd, PERF_EVENT_IOC_QUERY_PROBE, &kprobe_query); + if (CHECK(err, "get_kprobe_ioctl", + "failed to issue kprobe query ioctl\n")) + goto cleanup; + if (CHECK(kprobe_query.size != sizeof(kprobe_query), "get_kprobe_ioctl", + "read incorrect size from kprobe_ioctl: %llu\n", + kprobe_query.size)) + goto cleanup; + if (CHECK(kprobe_query.nmissed > 0, "get_kprobe_ioctl", + "read incorrect nmissed from kprobe_ioctl: %llu\n", + kprobe_query.nmissed)) + goto cleanup; + if (CHECK(kprobe_query.nhit == 0, "get_kprobe_ioctl", + "read incorrect nhit from kprobe_ioctl: %llu\n", + kprobe_query.nhit)) + goto cleanup; + + kretprobe_query.size = sizeof(kretprobe_query); + err = ioctl(kretprobe_fd, PERF_EVENT_IOC_QUERY_PROBE, &kretprobe_query); + if (CHECK(err, "get_kretprobe_ioctl", + "failed to issue kretprobe query ioctl\n")) + goto cleanup; + if (CHECK(kretprobe_query.size != sizeof(kretprobe_query), + "get_kretprobe_ioctl", + "read incorrect size from kretprobe_ioctl: %llu\n", + kretprobe_query.size)) + goto cleanup; + if (CHECK(kretprobe_query.nmissed > 0, "get_kretprobe_ioctl", + "read incorrect nmissed from kretprobe_ioctl: %llu\n", + kretprobe_query.nmissed)) + goto cleanup; + if (CHECK(kretprobe_query.nhit <= 0, "get_kretprobe_ioctl", + "read incorrect nhit from kretprobe_ioctl: %llu\n", + kretprobe_query.nhit)) + goto cleanup; + err = bpf_map_lookup_elem(results_map_fd, &kprobe_idx, &res); if (CHECK(err, "get_kprobe_res", "failed to get kprobe res: %d\n", err)) @@ -135,6 +202,54 @@ void test_attach_probe(void) /* trigger & validate uprobe & uretprobe */ get_base_addr(); + uprobe_fd_link = bpf_link__as_fd(uprobe_link); + if (CHECK(!uprobe_fd_link, "uprobe_link_as_fd", + "failed to cast link to fd link\n")) + goto cleanup; + + uprobe_fd = bpf_link_fd__fd(uprobe_fd_link); + if (CHECK(uprobe_fd < 0, "uprobe_get_perf_fd", + "failed to get perf fd from uprobe link\n")) + goto cleanup; + + uretprobe_fd_link = bpf_link__as_fd(uretprobe_link); + if (CHECK(!uretprobe_fd_link, "uretprobe_link_as_fd", + "failed to cast link to fd link\n")) + goto cleanup; + + uretprobe_fd = bpf_link_fd__fd(uretprobe_fd_link); + if (CHECK(uretprobe_fd < 0, "uretprobe_get_perf_fd", + "failed to get perf fd from uretprobe link\n")) + goto cleanup; + + uprobe_query.size = sizeof(uprobe_query); + err = ioctl(uprobe_fd, PERF_EVENT_IOC_QUERY_PROBE, &uprobe_query); + if (CHECK(err, "get_uprobe_ioctl", + "failed to issue uprobe query ioctl\n")) + goto cleanup; + if (CHECK(uprobe_query.nmissed > 0, "get_uprobe_ioctl", + "read incorrect nmissed from uprobe_ioctl: %llu\n", + uprobe_query.nmissed)) + goto cleanup; + if (CHECK(uprobe_query.nhit == 0, "get_uprobe_ioctl", + "read incorrect nhit from uprobe_ioctl: %llu\n", + uprobe_query.nhit)) + goto cleanup; + + uretprobe_query.size = sizeof(uretprobe_query); + err = ioctl(uretprobe_fd, PERF_EVENT_IOC_QUERY_PROBE, &uretprobe_query); + if (CHECK(err, "get_uretprobe_ioctl", + "failed to issue uretprobe query ioctl\n")) + goto cleanup; + if (CHECK(uretprobe_query.nmissed > 0, "get_uretprobe_ioctl", + "read incorrect nmissed from uretprobe_ioctl: %llu\n", + uretprobe_query.nmissed)) + goto cleanup; + if (CHECK(uretprobe_query.nhit <= 0, "get_uretprobe_ioctl", + "read incorrect nhit from uretprobe_ioctl: %llu\n", + uretprobe_query.nhit)) + goto cleanup; + err = bpf_map_lookup_elem(results_map_fd, &uprobe_idx, &res); if (CHECK(err, "get_uprobe_res", "failed to get uprobe res: %d\n", err))