Re: [RESEND PATCH V2 3/4] perf/x86/intel: drain PEBS buffer in event read

From: Liang, Kan
Date: Thu Jan 11 2018 - 10:21:33 EST




On 1/11/2018 6:10 AM, Jiri Olsa wrote:
On Wed, Jan 10, 2018 at 09:31:56AM -0500, Liang, Kan wrote:


On 1/10/2018 5:39 AM, Jiri Olsa wrote:
On Mon, Jan 08, 2018 at 07:15:15AM -0800, kan.liang@xxxxxxxxx wrote:
From: Kan Liang <kan.liang@xxxxxxxxxxxxxxx>

When the PEBS interrupt threshold is larger than one, there is no way to
get exact auto-reload times and value needed for event update unless
flush the PEBS buffer.

Drain the PEBS buffer in event read when large PEBS is enabled.

For the threshold is one, even auto-reload is enabled, it doesn't need
to be specially handled. Because auto-reload is only effect when event
overflow. There is no overflow in event read.

Signed-off-by: Kan Liang <kan.liang@xxxxxxxxxxxxxxx>
---
arch/x86/events/intel/core.c | 9 +++++++++
arch/x86/events/intel/ds.c | 10 ++++++++++
arch/x86/events/perf_event.h | 2 ++
3 files changed, 21 insertions(+)

diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c
index 09c26a4..bdc35f8 100644
--- a/arch/x86/events/intel/core.c
+++ b/arch/x86/events/intel/core.c
@@ -2060,6 +2060,14 @@ static void intel_pmu_del_event(struct perf_event *event)
intel_pmu_pebs_del(event);
}
+static void intel_pmu_read_event(struct perf_event *event)
+{
+ if (event->attr.precise_ip)
+ return intel_pmu_pebs_read(event);

check for (event->hw.flags & PERF_X86_EVENT_AUTO_RELOAD)
would be more accurate?


It will narrow down the events.
But considering the readability, I think it would be better to use
precise_ip.The exposed functions in ds.c should be generic functions for all
PEBS events, not specific case.
I think _AUTO_RELOAD looks too specific.

hum, but the PEBS drain is specific just for
PERF_X86_EVENT_AUTO_RELOAD events, right?

Accurately, PEBS drain is specific for PERF_X86_EVENT_FREERUNNING here.
PERF_X86_EVENT_FREERUNNING event must be _AUTO_RELOAD event.
But in some cases, _AUTO_RELOAD event cannot be _FREERUNNING event.

Only the event which is both _FREERUNNING and _AUTO_RELOAD need to do PEBS drain in _read().

So it does the check in intel_pmu_pebs_read()
+ if (pebs_needs_sched_cb(cpuc))
+ return intel_pmu_drain_pebs_buffer();


wrt readability maybe you could add function like:

The existing function pebs_needs_sched_cb() can do the check.
We just need to expose it, and also the intel_pmu_drain_pebs_buffer().

But to be honest, I still cannot see a reason for that.
It could save a call to intel_pmu_pebs_read(), but _read() is not critical path. It doesn't save much.
Also, it has to expose two inline PEBS specific functions. I think exposing one PEBS generic function would be better here.

Thanks,
Kan
bool pebs_drain_before_read(struct perf_event *event)
{
return event->hw.flags & PERF_X86_EVENT_AUTO_RELOAD;
}

thanks,
jirka