From: Peter Zijlstra <peterz@infradead.org>
To: Stephane Eranian <eranian@google.com>
Cc: Lin Ming <ming.m.lin@intel.com>, Andi Kleen <andi@firstfloor.org>,
Ingo Molnar <mingo@elte.hu>,
Frederic Weisbecker <fweisbec@gmail.com>,
Arjan van de Ven <arjan@infradead.org>,
lkml <linux-kernel@vger.kernel.org>,
Cyrill Gorcunov <gorcunov@gmail.com>
Subject: Re: [RFC PATCH 2/3 v3] perf: Implement Nehalem uncore pmu
Date: Fri, 10 Dec 2010 11:52:15 +0100 [thread overview]
Message-ID: <1291978335.6803.97.camel@twins> (raw)
In-Reply-To: <1291978036.6803.95.camel@twins>
On Fri, 2010-12-10 at 11:47 +0100, Peter Zijlstra wrote:
> On Fri, 2010-12-10 at 00:46 +0100, Stephane Eranian wrote:
> > Hi,
> >
> > So I have tested this patch a bit on WSM and as I expected there
> > are issues with sampling.
> >
> > When HT is on, both siblings CPUs get the interrupt. The HW does not
> > allow you to only point interrupts to a single HT thread (CPU).
>
> Egads, how ugly :/
>
> > I did verify that indeed both threads get the interrupt and that you have a
> > race condition. Both sibling CPUs stop uncore, get the status. They may get
> > the same overflow status. Both will pass the uncore->active_mask because
> > it's shared among siblings cores. Thus, you have a race for the whole
> > interrupt handler execution.
> >
> > You need some serialization in there. But the patch does not address this.
> > The problem is different from the back-to-back interrupt issue that
> > Don worked on.
> > The per-cpu marked/handled trick cannot work to avoid this problem.
> >
> > You cannot simply say "the lowest indexed" CPU of a sibling pair
> > handles the interrupt
> > because you don't know if this in an uncore intr, core interrupt or
> > something else. You
> > need to check. That means each HT thread needs to check uncore
> > ovfl_status. IF the
> > status is zero, then return. Otherwise, you need to do a 2nd level
> > check before you can
> > execute the handler. You need to know if the sibling CPU has already
> > "consumed" that
> > interrupt.
> >
> > I think you need some sort of generation counter per physical core and
> > per HT thread.
> > On interrupt, you could do something along the line of:
> > if (mycpu->intr_count == mysibling->intr_count) {
> > then mycpu->intr_count++
> > execute intr_handler()
> > } else {
> > mycpu->intr_count++
> > return;
> > }
> > Of course, the above needs some atomicity and ad locking
>
> Does that guarantee that the same sibling handles all interrupts? Since
> a lot of the infrastructure uses local*_t we're not good with cross-cpu
> stuff.
>
> Damn what a mess.. we need to serialize enough for both cpus to at least
> see the overflow bit.. maybe something like:
>
>
> struct intel_percore {
> ...
> atomic_t uncore_barrier;
> };
>
> void uncore_barrier(void)
> {
> struct intel_percore *percore = this_cpu_ptr(cpu_hw_events)->percore;
> int armed;
>
> armed = atomic_cmpxchg(&percore->uncore_barrier, 0, 1) == 0;
> if (armed) {
> /* we armed, it, now wait for completion */
> while (atomic_read(&percore->uncore_barrier))
> cpu_relax();
> } else {
> /* our sibling must have, decrement it */
> if (atomic_cmpxchg(&percore->uncore_barrier, 1, 0) != 1)
> BUG();
> }
> }
>
> Then have something like:
>
> handle_uncore_interrupt()
> {
> u64 overflow = rdmsrl(MSR_UNCORE_PERF_GLOBAL_OVF_STATUS);
> int cpu;
>
> if (!overflow)
> return 0; /* not our interrupt to handle */
>
> uncore_barrier(); /* wait so our sibling will also observe the overflow */
>
> cpu = smp_processor_id();
> if (cpu != cpumask_first(topology_thread_cpumask(cpu)))
> return 1; /* our sibling will handle it, eat the NMI */
>
> /* OK, we've got an overflow and we're the first CPU in the thread mask */
>
> ... do fancy stuff ...
>
> return 1; /* we handled it, eat the NMI */
> }
That would of course need to also grow some smarts to detect if there is
only 1 sibling online.
CC'ed Cyrill as P4 might have something similar.
next prev parent reply other threads:[~2010-12-10 10:52 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-12-02 5:20 [RFC PATCH 2/3 v3] perf: Implement Nehalem uncore pmu Lin Ming
2010-12-02 5:57 ` Lin Ming
2010-12-07 6:15 ` Lin Ming
2010-12-09 19:17 ` Peter Zijlstra
2010-12-09 19:21 ` Peter Zijlstra
2010-12-09 20:15 ` Stephane Eranian
2010-12-09 20:19 ` Peter Zijlstra
2010-12-09 20:27 ` Stephane Eranian
2010-12-09 23:46 ` Stephane Eranian
2010-12-10 8:31 ` Lin Ming
2010-12-10 10:47 ` Peter Zijlstra
2010-12-10 10:52 ` Peter Zijlstra [this message]
2010-12-10 15:11 ` Cyrill Gorcunov
2010-12-11 5:49 ` Stephane Eranian
2010-12-13 8:27 ` Lin Ming
2010-12-13 16:42 ` Stephane Eranian
2010-12-13 16:51 ` Andi Kleen
2010-12-13 19:04 ` Stephane Eranian
2010-12-10 8:28 ` Lin Ming
2010-12-09 19:24 ` Peter Zijlstra
2010-12-10 8:28 ` Lin Ming
2011-01-13 17:14 ` Stephane Eranian
2011-01-17 1:29 ` Lin Ming
2011-01-17 8:44 ` Stephane Eranian
2011-01-17 10:51 ` Lin Ming
2011-01-17 10:56 ` 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=1291978335.6803.97.camel@twins \
--to=peterz@infradead.org \
--cc=andi@firstfloor.org \
--cc=arjan@infradead.org \
--cc=eranian@google.com \
--cc=fweisbec@gmail.com \
--cc=gorcunov@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=ming.m.lin@intel.com \
--cc=mingo@elte.hu \
/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.