This patch adds the flag dump_enable to control the trace data
output process when perf sampling. By setting this flag and
integrating with ebpf, we can control the data output process and
get the samples we are most interested in.
The bpf helper bpf_perf_event_dump_control() can control the
perf_event on current cpu.
Signed-off-by: Kaixu Xia <xiakaixu@xxxxxxxxxx>
---
include/linux/perf_event.h | 1 +
include/uapi/linux/bpf.h | 5 +++++
include/uapi/linux/perf_event.h | 3 ++-
kernel/bpf/verifier.c | 3 ++-
kernel/events/core.c | 13 ++++++++++++
kernel/trace/bpf_trace.c | 44 +++++++++++++++++++++++++++++++++++++++++
6 files changed, 67 insertions(+), 2 deletions(-)
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h
index 092a0e8..2af527e 100644
--- a/include/linux/perf_event.h
+++ b/include/linux/perf_event.h
@@ -472,6 +472,7 @@ struct perf_event {
struct irq_work pending;
atomic_t event_limit;
+ atomic_t dump_enable;
--- a/include/uapi/linux/bpf.h
+++ b/include/uapi/linux/bpf.h
@@ -287,6 +287,11 @@ enum bpf_func_id {
* Return: realm if != 0
*/
BPF_FUNC_get_route_realm,
+
+ /**
+ * u64 bpf_perf_event_dump_control(&map, index, flag)
+ */
+ BPF_FUNC_perf_event_dump_control,
--- a/include/uapi/linux/perf_event.h
+++ b/include/uapi/linux/perf_event.h
@@ -331,7 +331,8 @@ struct perf_event_attr {
comm_exec : 1, /* flag comm events that are due to an exec */
use_clockid : 1, /* use @clockid for time fields */
context_switch : 1, /* context switch data */
- __reserved_1 : 37;
+ dump_enable : 1, /* don't output data on samples */
diff --git a/kernel/events/core.c b/kernel/events/core.c
index b11756f..74a16af 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -6337,6 +6337,9 @@ static int __perf_event_overflow(struct perf_event *event,
irq_work_queue(&event->pending);
}
+ if (!atomic_read(&event->dump_enable))
+ return ret;
+static void perf_event_check_dump_flag(struct perf_event *event)
+{
+ if (event->attr.dump_enable == 1)
+ atomic_set(&event->dump_enable, 1);
+ else
+ atomic_set(&event->dump_enable, 0);