public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Paul Mackerras <paulus@samba.org>
To: eranian@gmail.com
Cc: Peter Zijlstra <peterz@infradead.org>,
	linux-kernel@vger.kernel.org, mingo@elte.hu,
	perfmon2-devel@lists.sf.net,
	"David S. Miller" <davem@davemloft.net>,
	eranian@google.com
Subject: Re: [PATCH] perf_events: improve Intel event scheduling
Date: Tue, 22 Dec 2009 11:57:39 +1100	[thread overview]
Message-ID: <20091222005739.GA31264@drongo> (raw)
In-Reply-To: <7c86c4470912110359i5a4416c2t9075eaa47d25865a@mail.gmail.com>

On Fri, Dec 11, 2009 at 12:59:16PM +0100, stephane eranian wrote:

> There is a major difference between PPC and X86 here. PPC has a centralized
> register to control start/stop. This register  uses bitmask  to enable
> or disable counters. Thus, in hw_perf_enable(), if n_added=0, then you
> just need to
> use the pre-computed bitmask. Otherwise, you need to recompute the bitmask to
> include the new registers. The assignment of events and validation is done in
> hw_group_sched_in().

That's not entirely accurate.  Yes there is a global start/stop bit,
but there isn't a bitmask to enable or disable counters.  There is a
selector bitfield for each counter (except the limited-function
counters) and you can set the selector to the 'count nothing' value if
you don't want a particular counter to count.

Validation is done in hw_group_sched_in() but not the assignment of
events to counters.  That's done in hw_perf_enable(), via the
model-specific ppmu->compute_mmcr() call.

> In X86, assignment and validation is done in hw_group_sched_in(). Activation is
> done individually for each counter. There is no centralized register
> used here, thus
> no bitmask to update.
> 
> Disabling a counter does not trigger a complete reschedule of events.
> This happens
> only when hw_group_sched_in() is called.
> 
> The n_events = 0 in hw_perf_disable() is used to signal that something
> is changing.
> It should not be here but here.

The meaning of "It should not be here but here" is quite unclear to me.

> The problem is that
> hw_group_sched_in() needs a way
> to know that it is called for a completely new series of group
> scheduling so it can
> discard any previous assignment. This goes back to the issue I raised
> in my previous
> email. You could add a parameter to hw_group_sched_in() that would
> indicate this is
> the first group. that would cause n_events =0 and the function would
> start accumulating
> events for the new scheduling period.

I don't think hw_group_sched_in is ever called for a completely new
series of group scheduling.  If you have per-cpu counters active, they
don't get scheduled out and in again with each task switch.  So you
will tend to get a hw_pmu_disable call, then a series of disable calls
for the per-task events for the old task, then a series of
hw_group_sched_in calls for the per-task events for the new task, then
a hw_pmu_enable call.

On powerpc we maintain an array with pointers to all the currently
active events.  That makes it easy to know at hw_pmu_enable() time
what events need to be put on the PMU.  Also it means that at
hw_group_sched_in time you can look at the whole set of events,
including the ones just added, to see if it's feasible to put them all
on.  At that point we just check feasibility, which is quite quick and
easy using the bit-vector encoding of constraints.  The bit-vector
encoding lets us represent multiple constraints of various forms in
one pair of 64-bit values per event.  We can express constraints such
as "you can have at most N events in a class X" or "you can't have
events in all of classes A, B, C and D" or "control register bitfield
X must be set to Y", and then check that a set of events satisfies all
the constraints with some simple integer arithmetic.  I don't know
exactly what constraints you have on x86 but I would be surprised if
you couldn't handle them the same way.

Paul.

  parent reply	other threads:[~2009-12-22  1:10 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-10-19 15:03 [PATCH] perf_events: improve Intel event scheduling Stephane Eranian
2009-11-18 16:32 ` Peter Zijlstra
2009-12-11 11:00   ` stephane eranian
2009-12-11 11:59     ` stephane eranian
2009-12-21 15:40       ` Peter Zijlstra
2009-12-21 19:00         ` Stephane Eranian
2009-12-21 19:31           ` Peter Zijlstra
2009-12-21 20:59             ` Stephane Eranian
2009-12-21 21:18               ` Peter Zijlstra
2009-12-22  1:09               ` Paul Mackerras
2009-12-22  1:02         ` Paul Mackerras
2009-12-29 14:47           ` Stephane Eranian
2010-01-07  4:13             ` Paul Mackerras
2010-01-07  8:54               ` Peter Zijlstra
2010-01-07  9:00               ` Peter Zijlstra
2010-01-07  9:54                 ` Stephane Eranian
2010-01-07 10:01                   ` Peter Zijlstra
2009-12-22  0:57       ` Paul Mackerras [this message]
2009-12-11 14:38     ` Stephane Eranian

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=20091222005739.GA31264@drongo \
    --to=paulus@samba.org \
    --cc=davem@davemloft.net \
    --cc=eranian@gmail.com \
    --cc=eranian@google.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=perfmon2-devel@lists.sf.net \
    --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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox