On Tue, Jun 11, 2013 at 06:42:28PM +0200, Robert Richter wrote:
> From: Borislav Petkov <b...@alien8.de>
> 
> Add the needed pieces for persistent events which makes them
> process-agnostic. Also, make their buffers read-only when mmaping them
> from userspace.
> 
> While at it, do not return a void function, as caught by Fengguang's
> build robot.
> 
> Changes made by Robert Richter <robert.rich...@linaro.org>:
> 
> * mmap should return EACCES error if fd can not be opened writable.
>   This error code also helps userland to map buffers readonly on
>   failure.
> 
> Signed-off-by: Borislav Petkov <b...@suse.de>
> [ Return -EACCES if mapped buffers must be readonly ]
> Signed-off-by: Robert Richter <robert.rich...@linaro.org>
> Signed-off-by: Robert Richter <r...@kernel.org>
> ---
>  include/uapi/linux/perf_event.h |  3 ++-
>  kernel/events/core.c            | 10 +++++++++-
>  2 files changed, 11 insertions(+), 2 deletions(-)
> 
> diff --git a/include/uapi/linux/perf_event.h b/include/uapi/linux/perf_event.h
> index fb104e5..6032361 100644
> --- a/include/uapi/linux/perf_event.h
> +++ b/include/uapi/linux/perf_event.h
> @@ -272,8 +272,9 @@ struct perf_event_attr {
>  
>                               exclude_callchain_kernel : 1, /* exclude kernel 
> callchains */
>                               exclude_callchain_user   : 1, /* exclude user 
> callchains */
> +                             persistent     :  1, /* always-on event */
>  
> -                             __reserved_1   : 41;
> +                             __reserved_1   : 40;
>  
>       union {
>               __u32           wakeup_events;    /* wakeup every n events */
> diff --git a/kernel/events/core.c b/kernel/events/core.c
> index b790ab6..a13e457 100644
> --- a/kernel/events/core.c
> +++ b/kernel/events/core.c
> @@ -3713,6 +3713,11 @@ static void perf_mmap_close(struct vm_area_struct *vma)
>  {
>       struct perf_event *event = vma->vm_file->private_data;
>  
> +     if (event->attr.persistent) {
> +             atomic_dec(&event->mmap_count);
> +             return;
> +     }
> +
>       if (atomic_dec_and_mutex_lock(&event->mmap_count, &event->mmap_mutex)) {
>               unsigned long size = perf_data_size(event->rb);
>               struct user_struct *user = event->mmap_user;
> @@ -3756,9 +3761,12 @@ static int perf_mmap(struct file *file, struct 
> vm_area_struct *vma)
>       if (event->cpu == -1 && event->attr.inherit)
>               return -EINVAL;
>  
> -     if (!(vma->vm_flags & VM_SHARED))
> +     if (!(vma->vm_flags & VM_SHARED) && !event->attr.persistent)
>               return -EINVAL;
>  
> +     if (event->attr.persistent && (vma->vm_flags & VM_WRITE))
> +             return -EACCES;
> +
>       vma_size = vma->vm_end - vma->vm_start;
>       nr_pages = (vma_size / PAGE_SIZE) - 1;


I find this patch incomplete for its asymmetric; there a dec, but not an
implied inc.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to