Re: [PATCH 2/4] perf/x86/intel: fix event update for auto-reload

From: Liang, Kan
Date: Tue Dec 19 2017 - 18:25:56 EST

On 12/19/2017 5:07 PM, Peter Zijlstra wrote:
On Tue, Dec 19, 2017 at 03:08:58PM -0500, Liang, Kan wrote:
This all looks very wrong... In auto reload we should never call
intel_pmu_save_and_restore() in the first place I think.

Things like x86_perf_event_update() and x86_perf_event_set_period()
simply _cannot_ do the right thing when we auto reload the counter.

I think it should be OK to call it in first place.
For x86_perf_event_update(), the reload_times will tell if it's auto reload.
Both period_left and event->count are carefully recalculated for auto

How does prev_count make sense when we've already reloaded a bunch of

Same as non-auto-reload, it's the 'left' (unfinished) period from last time.
The period for the first record should always be the 'left' period no matter on which case.
For auto-reload, it doesn't need to increase the prev_count with the reload. Because for later records, the period should be exactly the same as the reload value.

To calculate the event->count,
For auto-reload, the event->count = prev_count + (reload times - 1) * reload value + gap between PMI trigger and PMI handler.

For non-auto-reload, the event->count = prev_count + gap between PMI trigger and PMI handler.

The 'prev_count' is same for both auto-reload and non-auto-reload.

The gap is a little bit tricky for auto-reload. Because it starts from -reload_value. But for non-auto-reload, it starts from 0.
"delta += (reload_val << shift);" is used to correct it.

For x86_perf_event_set_period(), there is nothing special needed for auto
reload. The period is fixed. The period_left from x86_perf_event_update() is
already handled.

Hurm.. I see. But rather than make an ever bigger trainwreck of things,
I'd rather you just write a special purpose intel_pmu_save_and_restart()
just for AUTO_RELOAD.

OK. I will do it in V2.