Message ID | 1431969919-32233-1-git-send-email-robert@sixbynine.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
* Robert Bragg <robert@sixbynine.org> wrote: > 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. > > v2: return int error status > > 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(+) > > diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h > index cf1d096..0c591eb 100644 > --- a/include/linux/perf_event.h > +++ b/include/linux/perf_event.h > @@ -305,6 +305,13 @@ struct pmu { > * Free pmu-private AUX data structures > */ > void (*free_aux) (void *aux); /* optional */ > + > + /* > + * 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. > + */ > + int (*flush) (struct perf_event *event); /*optional */ > }; > > /** > diff --git a/include/uapi/linux/perf_event.h b/include/uapi/linux/perf_event.h > index 309211b..cbf1b80 100644 > --- a/include/uapi/linux/perf_event.h > +++ b/include/uapi/linux/perf_event.h > @@ -389,6 +389,7 @@ struct perf_event_attr { > #define PERF_EVENT_IOC_SET_FILTER _IOW('$', 6, char *) > #define PERF_EVENT_IOC_ID _IOR('$', 7, __u64 *) > #define PERF_EVENT_IOC_SET_BPF _IOW('$', 8, __u32) > +#define PERF_EVENT_IOC_FLUSH _IO ('$', 9) > > enum perf_event_ioc_flags { > PERF_IOC_FLAG_GROUP = 1U << 0, > diff --git a/kernel/events/core.c b/kernel/events/core.c > index 3fe532a..72daee6 100644 > --- a/kernel/events/core.c > +++ b/kernel/events/core.c > @@ -4079,6 +4079,11 @@ static long _perf_ioctl(struct perf_event *event, unsigned int cmd, unsigned lon > case PERF_EVENT_IOC_SET_BPF: > return perf_event_set_bpf_prog(event, arg); > > + case PERF_EVENT_IOC_FLUSH: > + if (event->pmu->flush) > + return event->pmu->flush(event); > + return 0; > + > default: > return -ENOTTY; > } So 'struct file_operations' has a callback for: int (*fsync) (struct file *, loff_t, loff_t, int datasync); Could we use that perhaps, instead of an ioctl()? Not sure how it all integrates with the VFS though. Thanks, Ingo
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index cf1d096..0c591eb 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h @@ -305,6 +305,13 @@ struct pmu { * Free pmu-private AUX data structures */ void (*free_aux) (void *aux); /* optional */ + + /* + * 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. + */ + int (*flush) (struct perf_event *event); /*optional */ }; /** diff --git a/include/uapi/linux/perf_event.h b/include/uapi/linux/perf_event.h index 309211b..cbf1b80 100644 --- a/include/uapi/linux/perf_event.h +++ b/include/uapi/linux/perf_event.h @@ -389,6 +389,7 @@ struct perf_event_attr { #define PERF_EVENT_IOC_SET_FILTER _IOW('$', 6, char *) #define PERF_EVENT_IOC_ID _IOR('$', 7, __u64 *) #define PERF_EVENT_IOC_SET_BPF _IOW('$', 8, __u32) +#define PERF_EVENT_IOC_FLUSH _IO ('$', 9) enum perf_event_ioc_flags { PERF_IOC_FLAG_GROUP = 1U << 0, diff --git a/kernel/events/core.c b/kernel/events/core.c index 3fe532a..72daee6 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -4079,6 +4079,11 @@ static long _perf_ioctl(struct perf_event *event, unsigned int cmd, unsigned lon case PERF_EVENT_IOC_SET_BPF: return perf_event_set_bpf_prog(event, arg); + case PERF_EVENT_IOC_FLUSH: + if (event->pmu->flush) + return 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. v2: return int error status 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(+)