* Robert Bragg <robert at 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 at 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

Reply via email to