From: stephane eranian <eranian@googlemail.com>
To: Peter Zijlstra <peterz@infradead.org>
Cc: linux-kernel@vger.kernel.org, mingo@elte.hu, paulus@samba.org,
perfmon2-devel@lists.sf.net,
"David S. Miller" <davem@davemloft.net>,
eranian@google.com
Subject: Re: [PATCH] perf_events: improve Intel event scheduling
Date: Fri, 11 Dec 2009 12:59:16 +0100 [thread overview]
Message-ID: <7c86c4470912110359i5a4416c2t9075eaa47d25865a@mail.gmail.com> (raw)
In-Reply-To: <7c86c4470912110300n44650d98ke52ec56cf4d925c1@mail.gmail.com>
>
>>> @@ -1120,9 +1136,15 @@ static void amd_pmu_disable_all(void)
>>>
>>> void hw_perf_disable(void)
>>> {
>>> + struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events);
>>> +
>>> if (!x86_pmu_initialized())
>>> return;
>>> - return x86_pmu.disable_all();
>>> +
>>> + if (cpuc->enabled)
>>> + cpuc->n_events = 0;
>>> +
>>> + x86_pmu.disable_all();
>>> }
>>
>> Right, so I cannot directly see the above being correct. You fully erase
>> the PMU state when we disable it, but things like single counter
>> add/remove doesn't reprogram the full PMU afaict.
>>
>>> +int hw_perf_group_sched_in(struct perf_event *leader,
>>> + struct perf_cpu_context *cpuctx,
>>> + struct perf_event_context *ctx, int cpu)
>>> +{
>>> + struct cpu_hw_events *cpuhw = &per_cpu(cpu_hw_events, cpu);
>>> + int n, ret;
>>> +
>>> + n = collect_events(cpuhw, leader);
>>> + if (n < 0)
>>> + return n;
>>> +
>>> + ret = schedule_events(cpuhw, n, true);
>>> + if (ret)
>>> + return ret;
>>> +
>>> + /* 0 means successful and enable each event in caller */
>>> + return 0;
>>> +}
>>
>> This is where powerpc does n_added += n, and it delays the
>> schedule_events() bit to hw_perf_enable() conditional on n_added > 0.
>> When you remove events it simply keeps the current layout and disables
>> the one.
>>
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().
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 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.
next prev parent reply other threads:[~2009-12-11 11:59 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-10-19 15:03 Stephane Eranian
2009-11-18 16:32 ` Peter Zijlstra
2009-12-11 11:00 ` stephane eranian
2009-12-11 11:59 ` stephane eranian [this message]
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
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=7c86c4470912110359i5a4416c2t9075eaa47d25865a@mail.gmail.com \
--to=eranian@googlemail.com \
--cc=davem@davemloft.net \
--cc=eranian@gmail.com \
--cc=eranian@google.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=paulus@samba.org \
--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
all inboxes | Powered by JetHome®