From: Beau Belgrave <beaub@linux.microsoft.com>
To: rostedt@goodmis.org, mhiramat@kernel.org
Cc: linux-trace-devel@vger.kernel.org, linux-kernel@vger.kernel.org,
beaub@linux.microsoft.com
Subject: [PATCH v10 04/12] user_events: Add basic perf and eBPF support
Date: Tue, 18 Jan 2022 12:43:18 -0800 [thread overview]
Message-ID: <20220118204326.2169-5-beaub@linux.microsoft.com> (raw)
In-Reply-To: <20220118204326.2169-1-beaub@linux.microsoft.com>
Adds support to write out user_event data to perf_probe/perf files as
well as to any attached eBPF program.
Signed-off-by: Beau Belgrave <beaub@linux.microsoft.com>
---
kernel/trace/trace_events_user.c | 72 +++++++++++++++++++++++++++++++-
1 file changed, 71 insertions(+), 1 deletion(-)
diff --git a/kernel/trace/trace_events_user.c b/kernel/trace/trace_events_user.c
index a6794cb1f586..371f31472156 100644
--- a/kernel/trace/trace_events_user.c
+++ b/kernel/trace/trace_events_user.c
@@ -551,6 +551,50 @@ static void user_event_ftrace(struct user_event *user, void *data, u32 datalen,
trace_event_buffer_commit(&event_buffer);
}
+#ifdef CONFIG_PERF_EVENTS
+/*
+ * Writes the user supplied payload out to perf ring buffer or eBPF program.
+ */
+static void user_event_perf(struct user_event *user, void *data, u32 datalen,
+ void *tpdata)
+{
+ struct hlist_head *perf_head;
+
+ if (bpf_prog_array_valid(&user->call)) {
+ struct user_bpf_context context = {0};
+
+ context.data_len = datalen;
+ context.data_type = USER_BPF_DATA_KERNEL;
+ context.kdata = data;
+
+ trace_call_bpf(&user->call, &context);
+ }
+
+ perf_head = this_cpu_ptr(user->call.perf_events);
+
+ if (perf_head && !hlist_empty(perf_head)) {
+ struct trace_entry *perf_entry;
+ struct pt_regs *regs;
+ size_t size = sizeof(*perf_entry) + datalen;
+ int context;
+
+ perf_entry = perf_trace_buf_alloc(ALIGN(size, 8),
+ ®s, &context);
+
+ if (unlikely(!perf_entry))
+ return;
+
+ perf_fetch_caller_regs(regs);
+
+ memcpy(perf_entry + 1, data, datalen);
+
+ perf_trace_buf_submit(perf_entry, size, context,
+ user->call.event.type, 1, regs,
+ perf_head, NULL);
+ }
+}
+#endif
+
/*
* Update the register page that is shared between user processes.
*/
@@ -573,6 +617,10 @@ static void update_reg_page_for(struct user_event *user)
if (probe_func == user_event_ftrace)
status |= EVENT_STATUS_FTRACE;
+#ifdef CONFIG_PERF_EVENTS
+ else if (probe_func == user_event_perf)
+ status |= EVENT_STATUS_PERF;
+#endif
else
status |= EVENT_STATUS_OTHER;
} while ((++probe_func_ptr)->func);
@@ -612,8 +660,27 @@ static int user_event_reg(struct trace_event_call *call,
data);
goto dec;
- default:
+#ifdef CONFIG_PERF_EVENTS
+ case TRACE_REG_PERF_REGISTER:
+ ret = tracepoint_probe_register(call->tp,
+ call->class->perf_probe,
+ data);
+ if (!ret)
+ goto inc;
+ break;
+
+ case TRACE_REG_PERF_UNREGISTER:
+ tracepoint_probe_unregister(call->tp,
+ call->class->perf_probe,
+ data);
+ goto dec;
+
+ case TRACE_REG_PERF_OPEN:
+ case TRACE_REG_PERF_CLOSE:
+ case TRACE_REG_PERF_ADD:
+ case TRACE_REG_PERF_DEL:
break;
+#endif
}
return ret;
@@ -870,6 +937,9 @@ static int user_event_parse(char *name, char *args, char *flags,
user->class.get_fields = user_event_get_fields;
user->class.reg = user_event_reg;
user->class.probe = user_event_ftrace;
+#ifdef CONFIG_PERF_EVENTS
+ user->class.perf_probe = user_event_perf;
+#endif
mutex_lock(&event_mutex);
ret = user_event_trace_register(user);
--
2.17.1
next prev parent reply other threads:[~2022-01-18 20:43 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-01-18 20:43 [PATCH v10 00/12] user_events: Enable user processes to create and write to trace events Beau Belgrave
2022-01-18 20:43 ` [PATCH v10 01/12] user_events: Add minimal support for trace_event into ftrace Beau Belgrave
2022-01-18 20:43 ` [PATCH v10 02/12] user_events: Add print_fmt generation support for basic types Beau Belgrave
2022-01-18 20:43 ` [PATCH v10 03/12] user_events: Handle matching arguments from dyn_events Beau Belgrave
2022-01-18 20:43 ` Beau Belgrave [this message]
2022-01-18 20:43 ` [PATCH v10 05/12] user_events: Optimize writing events by only copying data once Beau Belgrave
2022-01-18 20:43 ` [PATCH v10 06/12] user_events: Validate user payloads for size and null termination Beau Belgrave
2022-01-18 20:43 ` [PATCH v10 07/12] user_events: Add self-test for ftrace integration Beau Belgrave
2022-01-18 20:43 ` [PATCH v10 08/12] user_events: Add self-test for dynamic_events integration Beau Belgrave
2022-01-18 20:43 ` [PATCH v10 09/12] user_events: Add self-test for perf_event integration Beau Belgrave
2022-01-18 20:43 ` [PATCH v10 10/12] user_events: Add self-test for validator boundaries Beau Belgrave
2022-01-18 20:43 ` [PATCH v10 11/12] user_events: Add sample code for typical usage Beau Belgrave
2022-01-18 20:43 ` [PATCH v10 12/12] user_events: Add documentation file Beau Belgrave
2022-01-19 8:32 ` [PATCH v10 00/12] user_events: Enable user processes to create and write to trace events Masami Hiramatsu
2022-01-21 19:28 ` Beau Belgrave
2022-02-11 4:00 ` Steven Rostedt
2022-02-12 0:15 ` Beau Belgrave
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220118204326.2169-5-beaub@linux.microsoft.com \
--to=beaub@linux.microsoft.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-trace-devel@vger.kernel.org \
--cc=mhiramat@kernel.org \
--cc=rostedt@goodmis.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.