lkml.org 
[lkml]   [2015]   [Jun]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
From
SubjectRe: [PATCH 4/8] ARCv2: perf: Support sampling events using overflow interrupts
Date
Hi Peter,

On Mon, 2015-06-15 at 17:48 +0200, Peter Zijlstra wrote:
> On Tue, Jun 09, 2015 at 05:49:28PM +0530, Vineet Gupta wrote:
> > From: Alexey Brodkin <abrodkin@synopsys.com>
>
> -ENOCHANGELOG
>
> > Cc: Peter Zijlstra <peterz@infradead.org>
> > Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
> > Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com>
> > Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
> > ---
>
> > struct arc_pmu {
> > struct pmu pmu;
> > + int has_interrupts;
>
> we have pmu::flags & PERF_PMU_CAP_NO_INTERRUPT

Ah... if we set that flag perf_event_open() won't allow user to use
sampling events anyways so we may drop "arc_pmu.has_interrupts"
completely, right?

>
> > @@ -186,7 +189,8 @@ static int arc_pmu_event_init(struct perf_event
> > *event)
> > hwc->last_period = hwc->sample_period;
> > local64_set(&hwc->period_left, hwc
> > ->sample_period);
> > } else
> > - return -ENOENT;
> > + if (!arc_pmu->has_interrupts)
> > + return -ENOENT;
>
> Same as before, first determine if the event is yours, then return a
> fatal error.

Indeed with my note above that check makes no sense - perf framework
will do that same check instead.

> > @@ -307,6 +311,17 @@ static void arc_pmu_stop(struct perf_event
> > *event, int flags)
> > struct hw_perf_event *hwc = &event->hw;
> > int idx = hwc->idx;
> >
> > + /* Disable interrupt for this counter */
> > + if (is_sampling_event(event)) {
>
> but but but, a sampling event needs the interrupt enabled?

Indeed sampling event needs the interrupt enabled. What's wrong with
that fact? Or I'm missing something?

> > + /*
> > + * Reset interrupt flag by writing of 1. This is
> > required
> > + * to make sure pending interrupt was not left.
> > + */
>
> Would not typically the interrupt latch be a property of the
> interrupt
> controller, not the device generating it?
>
> That is, how can the device programming affect pending interrupts?

The point here is our hardware counters are built in CPU core and
interrupt line from PMU block is wired directly to the top-level INTC.

Moreover that one IRQ line from PMU (or HW event counters how we call
them) is a logical OR of interrupts from each even counter (we may have
from 1 to 32 counters built-in). That means to clear a pending
interrupt from PMU block we need to clear states of individual
interrupts (per counter) in PMU.

> > + write_aux_reg(ARC_REG_PCT_INT_ACT, 1 << idx);
> > + write_aux_reg(ARC_REG_PCT_INT_CTRL,
> > +
> > read_aux_reg(ARC_REG_PCT_INT_CTRL) & ~(1 << idx));
> > + }
> > +
>
> > + if (is_sampling_event(event)) {
> > + /* Mimic full counter overflow as other arches do
> > */
>
> With this you mean the pretending we have 63bit of overflow counter?

Correct. In more details it is covered in my comments in [PATCH 3/8].

> > + write_aux_reg(ARC_REG_PCT_INT_CNTL, arc_pmu
> > ->max_period &
> > + 0xffffffff);
>
> Would not (u32)arc_pmu->max_period, be clearer?

True, makes sense.

> > + write_aux_reg(ARC_REG_PCT_INT_CNTH,
> > + (arc_pmu->max_period >> 32));
>
> But should you not program: min(period, max_period) instead? If the
> requested period is shorter than your max period you do not want to
> program the max. Or are you missing a negative somewhere?

Here we just program the limit which is used for triggering an
interrupt. We don't care about "period" being > than "max_period"
because in arc_pmu_start()->arc_pmu_event_set_period() we do that check
when actually setting start value of a counter.

> That is, program the max_period for !sampling events to deal with
> overflow folding.

Once again we deal with overflow folding in arc_pmu_event_set_period()
even for !sampling events. But there's no need to program max_period in
PMU registers because hardware doesn't care about it - we just use that
value in software. Moreover if HW lacks PMU IRQ support then attempt to
access missing registers (for example ARC_REG_PCT_INT_CNT) will
inevitably lead to instruction error exception.

-Alexey--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
Please read the FAQ at http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2015-06-22 18:21    [W:0.229 / U:0.784 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site