All of lore.kernel.org
 help / color / mirror / Atom feed
From: Charlie Jenkins <charlie@rivosinc.com>
To: Peter Zijlstra <peterz@infradead.org>,
	Ingo Molnar <mingo@redhat.com>,
	Arnaldo Carvalho de Melo <acme@kernel.org>,
	Namhyung Kim <namhyung@kernel.org>,
	Mark Rutland <mark.rutland@arm.com>,
	Alexander Shishkin <alexander.shishkin@linux.intel.com>,
	Jiri Olsa <jolsa@kernel.org>, Ian Rogers <irogers@google.com>,
	Adrian Hunter <adrian.hunter@intel.com>,
	Atish Patra <atishp@rivosinc.com>
Cc: linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 1/2] perf: Add PERF_EVENT_IOC_INC_EVENT_LIMIT
Date: Fri, 26 Jul 2024 17:20:06 -0700	[thread overview]
Message-ID: <ZqQ9NnEF8oDGhatU@ghost> (raw)
In-Reply-To: <20240724-perf_set_event_limit-v1-1-b8a642a7cb54@rivosinc.com>

On Wed, Jul 24, 2024 at 03:43:25PM -0700, Charlie Jenkins wrote:
> PERF_EVENT_IOC_REFRESH immediately enables after incrementing
> event_limit.  Provide a new ioctl flag that allows programs to increment
> event_limit without enabling the event. A usecase for this is to set an
> event_limit in combination with enable_on_exec.
> 
> Signed-off-by: Charlie Jenkins <charlie@rivosinc.com>
> ---
>  include/linux/perf_event.h            |  4 ++--
>  include/uapi/linux/perf_event.h       |  1 +
>  kernel/events/core.c                  | 17 +++++++++++------
>  tools/include/uapi/linux/perf_event.h |  1 +
>  4 files changed, 15 insertions(+), 8 deletions(-)
> 
> diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h
> index a5304ae8c654..40025a5eb98a 100644
> --- a/include/linux/perf_event.h
> +++ b/include/linux/perf_event.h
> @@ -1103,7 +1103,7 @@ extern int perf_event_task_enable(void);
>  
>  extern void perf_pmu_resched(struct pmu *pmu);
>  
> -extern int perf_event_refresh(struct perf_event *event, int refresh);
> +extern int perf_event_refresh(struct perf_event *event, int refresh, bool enable);
>  extern void perf_event_update_userpage(struct perf_event *event);
>  extern int perf_event_release_kernel(struct perf_event *event);
>  extern struct perf_event *
> @@ -1770,7 +1770,7 @@ static inline int perf_event_read_local(struct perf_event *event, u64 *value,
>  static inline void perf_event_print_debug(void)				{ }
>  static inline int perf_event_task_disable(void)				{ return -EINVAL; }
>  static inline int perf_event_task_enable(void)				{ return -EINVAL; }
> -static inline int perf_event_refresh(struct perf_event *event, int refresh)
> +static inline int perf_event_refresh(struct perf_event *event, int refresh, bool enable)
>  {
>  	return -EINVAL;
>  }
> diff --git a/include/uapi/linux/perf_event.h b/include/uapi/linux/perf_event.h
> index 3a64499b0f5d..992f51effb27 100644
> --- a/include/uapi/linux/perf_event.h
> +++ b/include/uapi/linux/perf_event.h
> @@ -560,6 +560,7 @@ struct perf_event_query_bpf {
>  #define PERF_EVENT_IOC_PAUSE_OUTPUT		_IOW('$', 9, __u32)
>  #define PERF_EVENT_IOC_QUERY_BPF		_IOWR('$', 10, struct perf_event_query_bpf *)
>  #define PERF_EVENT_IOC_MODIFY_ATTRIBUTES	_IOW('$', 11, struct perf_event_attr *)
> +#define PERF_EVENT_IOC_INC_EVENT_LIMIT		_IO ('$', 12)
>  
>  enum perf_event_ioc_flags {
>  	PERF_IOC_FLAG_GROUP		= 1U << 0,
> diff --git a/kernel/events/core.c b/kernel/events/core.c
> index 8f908f077935..b9d009733ace 100644
> --- a/kernel/events/core.c
> +++ b/kernel/events/core.c
> @@ -3142,7 +3142,7 @@ void perf_event_addr_filters_sync(struct perf_event *event)
>  }
>  EXPORT_SYMBOL_GPL(perf_event_addr_filters_sync);
>  
> -static int _perf_event_refresh(struct perf_event *event, int refresh)
> +static int _perf_event_refresh(struct perf_event *event, int refresh, bool enable)
>  {
>  	/*
>  	 * not supported on inherited events
> @@ -3151,7 +3151,8 @@ static int _perf_event_refresh(struct perf_event *event, int refresh)
>  		return -EINVAL;
>  
>  	atomic_add(refresh, &event->event_limit);
> -	_perf_event_enable(event);
> +	if (enable)
> +		_perf_event_enable(event);
>  
>  	return 0;
>  }
> @@ -3159,13 +3160,13 @@ static int _perf_event_refresh(struct perf_event *event, int refresh)
>  /*
>   * See perf_event_disable()
>   */
> -int perf_event_refresh(struct perf_event *event, int refresh)
> +int perf_event_refresh(struct perf_event *event, int refresh, bool enable)
>  {
>  	struct perf_event_context *ctx;
>  	int ret;
>  
>  	ctx = perf_event_ctx_lock(event);
> -	ret = _perf_event_refresh(event, refresh);
> +	ret = _perf_event_refresh(event, refresh, enable);
>  	perf_event_ctx_unlock(event, ctx);
>  
>  	return ret;
> @@ -5920,7 +5921,7 @@ static long _perf_ioctl(struct perf_event *event, unsigned int cmd, unsigned lon
>  		break;
>  
>  	case PERF_EVENT_IOC_REFRESH:
> -		return _perf_event_refresh(event, arg);
> +		return _perf_event_refresh(event, arg, true);
>  
>  	case PERF_EVENT_IOC_PERIOD:
>  	{
> @@ -6006,6 +6007,10 @@ static long _perf_ioctl(struct perf_event *event, unsigned int cmd, unsigned lon
>  
>  		return perf_event_modify_attr(event,  &new_attr);
>  	}
> +
> +	case PERF_EVENT_IOC_INC_EVENT_LIMIT:
> +		return _perf_event_refresh(event, arg, false);
> +
>  	default:
>  		return -ENOTTY;
>  	}
> @@ -6721,7 +6726,7 @@ void perf_event_wakeup(struct perf_event *event)
>  	ring_buffer_wakeup(event);
>  
>  	if (event->pending_kill) {
> -		kill_fasync(perf_event_fasync(event), SIGIO, event->pending_kill);
> +		kill_fasync(perf_event_fasync(event), SIGTRAP, event->pending_kill);

This was a debug change that wasn't supposed to make it into this patch.
In the next version I will remove this.

- Charlie

>  		event->pending_kill = 0;
>  	}
>  }
> diff --git a/tools/include/uapi/linux/perf_event.h b/tools/include/uapi/linux/perf_event.h
> index 3a64499b0f5d..992f51effb27 100644
> --- a/tools/include/uapi/linux/perf_event.h
> +++ b/tools/include/uapi/linux/perf_event.h
> @@ -560,6 +560,7 @@ struct perf_event_query_bpf {
>  #define PERF_EVENT_IOC_PAUSE_OUTPUT		_IOW('$', 9, __u32)
>  #define PERF_EVENT_IOC_QUERY_BPF		_IOWR('$', 10, struct perf_event_query_bpf *)
>  #define PERF_EVENT_IOC_MODIFY_ATTRIBUTES	_IOW('$', 11, struct perf_event_attr *)
> +#define PERF_EVENT_IOC_INC_EVENT_LIMIT		_IO ('$', 12)
>  
>  enum perf_event_ioc_flags {
>  	PERF_IOC_FLAG_GROUP		= 1U << 0,
> 
> -- 
> 2.44.0
> 

       reply	other threads:[~2024-07-27  0:20 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20240724-perf_set_event_limit-v1-0-b8a642a7cb54@rivosinc.com>
     [not found] ` <20240724-perf_set_event_limit-v1-1-b8a642a7cb54@rivosinc.com>
2024-07-27  0:20   ` Charlie Jenkins [this message]
2024-07-24 22:54 [PATCH 0/2] perf: Add PERF_EVENT_IOC_SET_EVENT_LIMIT Charlie Jenkins
2024-07-24 22:54 ` [PATCH 1/2] perf: Add PERF_EVENT_IOC_INC_EVENT_LIMIT Charlie Jenkins

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ZqQ9NnEF8oDGhatU@ghost \
    --to=charlie@rivosinc.com \
    --cc=acme@kernel.org \
    --cc=adrian.hunter@intel.com \
    --cc=alexander.shishkin@linux.intel.com \
    --cc=atishp@rivosinc.com \
    --cc=irogers@google.com \
    --cc=jolsa@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-perf-users@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=mingo@redhat.com \
    --cc=namhyung@kernel.org \
    --cc=peterz@infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.