All of lore.kernel.org
 help / color / mirror / Atom feed
From: Will Deacon <will.deacon@arm.com>
To: Mark Rutland <mark.rutland@arm.com>
Cc: "linux-arm-kernel@lists.infradead.org" 
	<linux-arm-kernel@lists.infradead.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"acme@kernel.org" <acme@kernel.org>,
	Liviu Dudau <Liviu.Dudau@arm.com>,
	Lorenzo Pieralisi <Lorenzo.Pieralisi@arm.com>,
	"mingo@redhat.com" <mingo@redhat.com>,
	"paulus@samba.org" <paulus@samba.org>,
	"peterz@infradead.org" <peterz@infradead.org>,
	Sudeep Holla <Sudeep.Holla@arm.com>,
	Drew Richardson <Drew.Richardson@arm.com>
Subject: Re: [PATCH 1/7] perf: allow for PMU-specific event filtering
Date: Fri, 22 May 2015 15:08:44 +0100	[thread overview]
Message-ID: <20150522140844.GA1619@arm.com> (raw)
In-Reply-To: <1431533549-27715-2-git-send-email-mark.rutland@arm.com>

Hi Mark,

On Wed, May 13, 2015 at 05:12:23PM +0100, Mark Rutland wrote:
> In certain circumstances it may not be possible to schedule particular
> events due to constraints other than a lack of hardware counters (e.g.
> on big.LITTLE systems where CPUs support different events). The core
> perf event code does not distinguish these cases and pessimistically
> assumes that any failure to schedule an event means that it is not worth
> attempting to schedule later events, even if some hardware counters are
> still unused.
> 
> When an event a pmu cannot schedule exists in a flexible group list it
> can unnecessarily prevent event groups following it in the list from
> being scheduled (until it is rotated to the end of the list). This means
> some events are scheduled for only a portion of the time they could be,
> and for short running programs no events may be scheduled if the list is
> initially sorted in an unfortunate order.
> 
> This patch adds a new (optional) filter_match function pointer to struct
> pmu which a pmu driver can use to tell perf core when an event matches
> pmu-specific scheduling requirements. This plugs into the existing
> event_filter_match logic, and makes it possible to avoid the scheduling
> problem described above. When no filter is provided by the PMU, the
> existing behaviour is retained.
> 
> Signed-off-by: Mark Rutland <mark.rutland@arm.com>
> Acked-by: Will Deacon <will.deacon@arm.com>
> Cc: Peter Zijlstra <peterz@infradead.org>
> Cc: Paul Mackerras <paulus@samba.org>
> Cc: Ingo Molnar <mingo@redhat.com>
> Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
> ---
>  include/linux/perf_event.h | 5 +++++
>  kernel/events/core.c       | 8 +++++++-
>  2 files changed, 12 insertions(+), 1 deletion(-)

Whilst I'm really keen to merge the architecture-specific parts of this
series, I'm going to need an Ack from one of the perf core maintainers
on this patch.

Peter, can you take a look please? (and I assume this is self-contained
enough not to conflict heavily with the current perf queue?).

Cheers,

Will

> diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h
> index 61992cf..67c719c 100644
> --- a/include/linux/perf_event.h
> +++ b/include/linux/perf_event.h
> @@ -304,6 +304,11 @@ struct pmu {
>  	 * Free pmu-private AUX data structures
>  	 */
>  	void (*free_aux)		(void *aux); /* optional */
> +
> +	/*
> +	 * Filter events for PMU-specific reasons.
> +	 */
> +	int (*filter_match)		(struct perf_event *event); /* optional */
>  };
>  
>  /**
> diff --git a/kernel/events/core.c b/kernel/events/core.c
> index 81aa3a4..aaeb449 100644
> --- a/kernel/events/core.c
> +++ b/kernel/events/core.c
> @@ -1506,11 +1506,17 @@ static int __init perf_workqueue_init(void)
>  
>  core_initcall(perf_workqueue_init);
>  
> +static inline int pmu_filter_match(struct perf_event *event)
> +{
> +	struct pmu *pmu = event->pmu;
> +	return pmu->filter_match ? pmu->filter_match(event) : 1;
> +}
> +
>  static inline int
>  event_filter_match(struct perf_event *event)
>  {
>  	return (event->cpu == -1 || event->cpu == smp_processor_id())
> -	    && perf_cgroup_match(event);
> +	    && perf_cgroup_match(event) && pmu_filter_match(event);
>  }
>  
>  static void
> -- 
> 1.9.1
> 

WARNING: multiple messages have this Message-ID (diff)
From: will.deacon@arm.com (Will Deacon)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 1/7] perf: allow for PMU-specific event filtering
Date: Fri, 22 May 2015 15:08:44 +0100	[thread overview]
Message-ID: <20150522140844.GA1619@arm.com> (raw)
In-Reply-To: <1431533549-27715-2-git-send-email-mark.rutland@arm.com>

Hi Mark,

On Wed, May 13, 2015 at 05:12:23PM +0100, Mark Rutland wrote:
> In certain circumstances it may not be possible to schedule particular
> events due to constraints other than a lack of hardware counters (e.g.
> on big.LITTLE systems where CPUs support different events). The core
> perf event code does not distinguish these cases and pessimistically
> assumes that any failure to schedule an event means that it is not worth
> attempting to schedule later events, even if some hardware counters are
> still unused.
> 
> When an event a pmu cannot schedule exists in a flexible group list it
> can unnecessarily prevent event groups following it in the list from
> being scheduled (until it is rotated to the end of the list). This means
> some events are scheduled for only a portion of the time they could be,
> and for short running programs no events may be scheduled if the list is
> initially sorted in an unfortunate order.
> 
> This patch adds a new (optional) filter_match function pointer to struct
> pmu which a pmu driver can use to tell perf core when an event matches
> pmu-specific scheduling requirements. This plugs into the existing
> event_filter_match logic, and makes it possible to avoid the scheduling
> problem described above. When no filter is provided by the PMU, the
> existing behaviour is retained.
> 
> Signed-off-by: Mark Rutland <mark.rutland@arm.com>
> Acked-by: Will Deacon <will.deacon@arm.com>
> Cc: Peter Zijlstra <peterz@infradead.org>
> Cc: Paul Mackerras <paulus@samba.org>
> Cc: Ingo Molnar <mingo@redhat.com>
> Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
> ---
>  include/linux/perf_event.h | 5 +++++
>  kernel/events/core.c       | 8 +++++++-
>  2 files changed, 12 insertions(+), 1 deletion(-)

Whilst I'm really keen to merge the architecture-specific parts of this
series, I'm going to need an Ack from one of the perf core maintainers
on this patch.

Peter, can you take a look please? (and I assume this is self-contained
enough not to conflict heavily with the current perf queue?).

Cheers,

Will

> diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h
> index 61992cf..67c719c 100644
> --- a/include/linux/perf_event.h
> +++ b/include/linux/perf_event.h
> @@ -304,6 +304,11 @@ struct pmu {
>  	 * Free pmu-private AUX data structures
>  	 */
>  	void (*free_aux)		(void *aux); /* optional */
> +
> +	/*
> +	 * Filter events for PMU-specific reasons.
> +	 */
> +	int (*filter_match)		(struct perf_event *event); /* optional */
>  };
>  
>  /**
> diff --git a/kernel/events/core.c b/kernel/events/core.c
> index 81aa3a4..aaeb449 100644
> --- a/kernel/events/core.c
> +++ b/kernel/events/core.c
> @@ -1506,11 +1506,17 @@ static int __init perf_workqueue_init(void)
>  
>  core_initcall(perf_workqueue_init);
>  
> +static inline int pmu_filter_match(struct perf_event *event)
> +{
> +	struct pmu *pmu = event->pmu;
> +	return pmu->filter_match ? pmu->filter_match(event) : 1;
> +}
> +
>  static inline int
>  event_filter_match(struct perf_event *event)
>  {
>  	return (event->cpu == -1 || event->cpu == smp_processor_id())
> -	    && perf_cgroup_match(event);
> +	    && perf_cgroup_match(event) && pmu_filter_match(event);
>  }
>  
>  static void
> -- 
> 1.9.1
> 

  reply	other threads:[~2015-05-22 14:08 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-05-13 16:12 [PATCH 0/7] ARM: perf: heterogeneous PMU support Mark Rutland
2015-05-13 16:12 ` Mark Rutland
2015-05-13 16:12 ` [PATCH 1/7] perf: allow for PMU-specific event filtering Mark Rutland
2015-05-13 16:12   ` Mark Rutland
2015-05-22 14:08   ` Will Deacon [this message]
2015-05-22 14:08     ` Will Deacon
2015-05-27  8:51     ` Peter Zijlstra
2015-05-27  8:51       ` Peter Zijlstra
2015-05-13 16:12 ` [PATCH 2/7] arm: perf: make of_pmu_irq_cfg take arm_pmu Mark Rutland
2015-05-13 16:12   ` Mark Rutland
2015-05-13 16:12 ` [PATCH 3/7] arm: perf: treat PMUs as CPU affine Mark Rutland
2015-05-13 16:12   ` Mark Rutland
2015-05-13 16:12 ` [PATCH 4/7] arm: perf: filter unschedulable events Mark Rutland
2015-05-13 16:12   ` Mark Rutland
2015-05-13 16:12 ` [PATCH 5/7] arm: perf: probe number of counters on affine CPUs Mark Rutland
2015-05-13 16:12   ` Mark Rutland
2015-05-13 16:12 ` [PATCH 6/7] arm: perf: remove singleton PMU restriction Mark Rutland
2015-05-13 16:12   ` Mark Rutland
2015-05-13 16:12 ` [PATCH 7/7] arm: dts: vexpress: describe all PMUs in TC2 dts Mark Rutland
2015-05-13 16:12   ` Mark Rutland

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=20150522140844.GA1619@arm.com \
    --to=will.deacon@arm.com \
    --cc=Drew.Richardson@arm.com \
    --cc=Liviu.Dudau@arm.com \
    --cc=Lorenzo.Pieralisi@arm.com \
    --cc=Sudeep.Holla@arm.com \
    --cc=acme@kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=mingo@redhat.com \
    --cc=paulus@samba.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.