@@ -266,6 +266,13 @@ struct pmu {
* flush branch stack on context-switches (needed in cpu-wide mode)
*/
void (*flush_branch_stack) (void);
+
+ /*
+ * Flush buffered samples (E.g. for pmu hardware that writes samples to
+ * some intermediate buffer) userspace may need to explicitly ensure
+ * such samples have been forwarded to perf.
+ */
+ void (*flush) (struct perf_event *event); /*optional */
};
/**
@@ -360,6 +360,7 @@ struct perf_event_attr {
#define PERF_EVENT_IOC_SET_OUTPUT _IO ('$', 5)
#define PERF_EVENT_IOC_SET_FILTER _IOW('$', 6, char *)
#define PERF_EVENT_IOC_ID _IOR('$', 7, __u64 *)
+#define PERF_EVENT_IOC_FLUSH _IO ('$', 8)
enum perf_event_ioc_flags {
PERF_IOC_FLAG_GROUP = 1U << 0,
@@ -3981,6 +3981,11 @@ static long _perf_ioctl(struct perf_event *event, unsigned int cmd, unsigned lon
case PERF_EVENT_IOC_SET_FILTER:
return perf_event_set_filter(event, (void __user *)arg);
+ case PERF_EVENT_IOC_FLUSH:
+ if (event->pmu->flush)
+ event->pmu->flush(event);
+ return 0;
+
default:
return -ENOTTY;
}
To allow for pmus that may have internal buffering (e.g. the hardware itself writes out data to its own circular buffer which is only periodically forwarded to userspace via perf) this ioctl enables userspace to explicitly ensure it has received all samples before a point in time. Signed-off-by: Robert Bragg <robert@sixbynine.org> --- include/linux/perf_event.h | 7 +++++++ include/uapi/linux/perf_event.h | 1 + kernel/events/core.c | 5 +++++ 3 files changed, 13 insertions(+)