* Robert Bragg <robert@xxxxxxxxxxxxx> 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@xxxxxxxxxxxxx> > --- > 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 _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel