From: Adrian Hunter <adrian.hunter@intel.com>
To: Peter Zijlstra <a.p.zijlstra@chello.nl>, Ingo Molnar <mingo@redhat.com>
Cc: Thomas Gleixner <tglx@linutronix.de>,
H Peter Anvin <hpa@zytor.com>,
Arnaldo Carvalho de Melo <acme@ghostprotocols.net>,
linux-kernel@vger.kernel.org, David Ahern <dsahern@gmail.com>,
Frederic Weisbecker <fweisbec@gmail.com>,
Jiri Olsa <jolsa@redhat.com>, Mike Galbraith <efault@gmx.de>,
Namhyung Kim <namhyung@gmail.com>,
Paul Mackerras <paulus@samba.org>,
Peter Zijlstra <peterz@infradead.org>,
Stephane Eranian <eranian@google.com>,
Adrian Hunter <adrian.hunter@intel.com>
Subject: [PATCH 4/5] perf: add 'keep tracking' flag to PERF_EVENT_IOC_DISABLE
Date: Fri, 28 Jun 2013 16:22:20 +0300 [thread overview]
Message-ID: <1372425741-1676-5-git-send-email-adrian.hunter@intel.com> (raw)
In-Reply-To: <1372425741-1676-1-git-send-email-adrian.hunter@intel.com>
Make it possible to disable an event but continue to receive
"tracking" events i.e. continue to receive mmap, comm, task events.
The flag is updated by both PERF_EVENT_IOC_DISABLE and
PERF_EVENT_IOC_ENABLE. The flag is cleared by prctl
PR_TASK_PERF_EVENTS_DISABLE.
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
---
include/linux/perf_event.h | 1 +
include/uapi/linux/perf_event.h | 1 +
kernel/events/core.c | 21 +++++++++++++++++++--
3 files changed, 21 insertions(+), 2 deletions(-)
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h
index 50b3efd..789eeeb 100644
--- a/include/linux/perf_event.h
+++ b/include/linux/perf_event.h
@@ -436,6 +436,7 @@ struct perf_event {
struct perf_cgroup *cgrp; /* cgroup event is attach to */
int cgrp_defer_enabled;
#endif
+ int keep_tracking;
#endif /* CONFIG_PERF_EVENTS */
};
diff --git a/include/uapi/linux/perf_event.h b/include/uapi/linux/perf_event.h
index 663be3f..7b4ecfb 100644
--- a/include/uapi/linux/perf_event.h
+++ b/include/uapi/linux/perf_event.h
@@ -324,6 +324,7 @@ struct perf_event_attr {
enum perf_event_ioc_flags {
PERF_IOC_FLAG_GROUP = 1U << 0,
+ PERF_IOC_KEEP_TRACKING = 1U << 1,
};
/*
diff --git a/kernel/events/core.c b/kernel/events/core.c
index 1db3af9..0c1fbe9 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -3495,6 +3495,16 @@ static inline int perf_fget_light(int fd, struct fd *p)
return 0;
}
+static void perf_event_keep_tracking(struct perf_event *event, u32 flags)
+{
+ int keep_tracking = !!(flags & PERF_IOC_KEEP_TRACKING);
+
+ if (flags & PERF_IOC_FLAG_GROUP)
+ event->group_leader->keep_tracking = keep_tracking;
+ else
+ event->keep_tracking = keep_tracking;
+}
+
static int perf_event_set_output(struct perf_event *event,
struct perf_event *output_event);
static int perf_event_set_filter(struct perf_event *event, void __user *arg);
@@ -3510,6 +3520,7 @@ static long perf_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
func = perf_event_enable;
break;
case PERF_EVENT_IOC_DISABLE:
+ perf_event_keep_tracking(event, flags);
func = perf_event_disable;
break;
case PERF_EVENT_IOC_RESET:
@@ -3552,6 +3563,9 @@ static long perf_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
else
perf_event_for_each_child(event, func);
+ if (cmd == PERF_EVENT_IOC_ENABLE)
+ perf_event_keep_tracking(event, flags);
+
return 0;
}
@@ -3572,8 +3586,10 @@ int perf_event_task_disable(void)
struct perf_event *event;
mutex_lock(¤t->perf_event_mutex);
- list_for_each_entry(event, ¤t->perf_event_list, owner_entry)
+ list_for_each_entry(event, ¤t->perf_event_list, owner_entry) {
perf_event_for_each_child(event, perf_event_disable);
+ event->keep_tracking = 0;
+ }
mutex_unlock(¤t->perf_event_mutex);
return 0;
@@ -4670,7 +4686,8 @@ perf_event_aux_ctx(struct perf_event_context *ctx,
struct perf_event *event;
list_for_each_entry_rcu(event, &ctx->event_list, event_entry) {
- if (event->state < PERF_EVENT_STATE_INACTIVE)
+ if (event->state < PERF_EVENT_STATE_INACTIVE &&
+ !event->keep_tracking)
continue;
if (!event_filter_match(event))
continue;
--
1.7.11.7
next prev parent reply other threads:[~2013-06-28 13:17 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-06-28 13:22 [PATCH 0/5] perf: add two new features Adrian Hunter
2013-06-28 13:22 ` [PATCH 1/5] perf: fix broken union in perf_event_mmap_page Adrian Hunter
2013-06-28 15:22 ` Peter Zijlstra
2013-07-16 11:51 ` H. Peter Anvin
2013-07-24 3:56 ` [tip:perf/core] perf: Fix broken union in ' struct perf_event_mmap_page' tip-bot for Adrian Hunter
2013-09-17 20:23 ` Vince Weaver
2013-09-17 20:35 ` Vince Weaver
2013-09-19 8:42 ` Ingo Molnar
2013-09-18 8:57 ` Peter Zijlstra
2013-09-18 14:19 ` Vince Weaver
2013-09-18 15:42 ` Peter Zijlstra
2013-09-18 18:33 ` Stephane Eranian
2013-09-19 8:43 ` Peter Zijlstra
2013-09-19 8:55 ` Stephane Eranian
2013-09-19 9:16 ` Ingo Molnar
2013-09-18 20:07 ` Vince Weaver
2013-09-19 8:16 ` Peter Zijlstra
2013-09-19 9:14 ` [PATCH] perf: Always set bit 0 in the capabilities field of 'struct perf_event_mmap_page' to 0, to maintain the ABI Ingo Molnar
2013-09-19 10:12 ` Peter Zijlstra
2013-09-19 10:28 ` Ingo Molnar
2013-09-19 10:35 ` Peter Zijlstra
2013-09-19 10:40 ` [PATCH, v3] " Ingo Molnar
2013-09-19 11:18 ` Adrian Hunter
2013-09-19 11:42 ` [PATCH, v4] perf: Fix capabilities bitfield compatibility in 'struct perf_event_mmap_page' Ingo Molnar
2013-09-19 17:40 ` Vince Weaver
2013-09-20 7:44 ` Ingo Molnar
2013-09-18 9:13 ` [tip:perf/core] perf: Fix broken union in ' struct perf_event_mmap_page' Adrian Hunter
2013-09-18 14:10 ` Vince Weaver
2013-06-28 13:22 ` [PATCH 2/5] x86: add ability to calculate TSC from perf sample timestamps Adrian Hunter
2013-07-24 3:56 ` [tip:perf/core] perf/x86: Add " tip-bot for Adrian Hunter
2013-06-28 13:22 ` [PATCH 3/5] perf tools: add test for converting perf time to/from TSC Adrian Hunter
2013-07-24 3:56 ` [tip:perf/core] perf tools: Add test for converting perf time to/ from TSC tip-bot for Adrian Hunter
2013-06-28 13:22 ` Adrian Hunter [this message]
2013-06-28 13:22 ` [PATCH 5/5] perf tools: add 'keep tracking' test Adrian Hunter
2013-06-28 15:27 ` [PATCH 0/5] perf: add two new features Peter Zijlstra
2013-06-28 19:22 ` Adrian Hunter
2013-07-16 6:22 ` Adrian Hunter
2013-07-16 14:34 ` Peter Zijlstra
2013-07-17 11:28 ` Adrian Hunter
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=1372425741-1676-5-git-send-email-adrian.hunter@intel.com \
--to=adrian.hunter@intel.com \
--cc=a.p.zijlstra@chello.nl \
--cc=acme@ghostprotocols.net \
--cc=dsahern@gmail.com \
--cc=efault@gmx.de \
--cc=eranian@google.com \
--cc=fweisbec@gmail.com \
--cc=hpa@zytor.com \
--cc=jolsa@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=namhyung@gmail.com \
--cc=paulus@samba.org \
--cc=peterz@infradead.org \
--cc=tglx@linutronix.de \
/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.