From: Reinette Chatre <reinette.chatre@intel.com>
To: Peter Zijlstra <peterz@infradead.org>
Cc: tglx@linutronix.de, fenghua.yu@intel.com, tony.luck@intel.com,
mingo@redhat.com, acme@kernel.org,
vikas.shivappa@linux.intel.com, gavin.hindman@intel.com,
jithu.joseph@intel.com, dave.hansen@intel.com, hpa@zytor.com,
x86@kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH V2 5/6] x86/intel_rdt: Use perf infrastructure for measurements
Date: Thu, 6 Sep 2018 12:21:59 -0700 [thread overview]
Message-ID: <40894b6f-c421-32fb-39c3-3dddbed5aa91@intel.com> (raw)
In-Reply-To: <20180906141524.GF24106@hirez.programming.kicks-ass.net>
Hi Peter,
On 9/6/2018 7:15 AM, Peter Zijlstra wrote:
> On Thu, Aug 16, 2018 at 01:16:08PM -0700, Reinette Chatre wrote:
>> + l2_miss_event = perf_event_create_kernel_counter(&perf_miss_attr,
>> + plr->cpu,
>> + NULL, NULL, NULL);
>> + if (IS_ERR(l2_miss_event))
>> + goto out;
>> +
>> + l2_hit_event = perf_event_create_kernel_counter(&perf_hit_attr,
>> + plr->cpu,
>> + NULL, NULL, NULL);
>> + if (IS_ERR(l2_hit_event))
>> + goto out_l2_miss;
>> +
>> + local_irq_disable();
>> + /*
>> + * Check any possible error state of events used by performing
>> + * one local read.
>> + */
>> + if (perf_event_read_local(l2_miss_event, &tmp, NULL, NULL)) {
>> + local_irq_enable();
>> + goto out_l2_hit;
>> + }
>> + if (perf_event_read_local(l2_hit_event, &tmp, NULL, NULL)) {
>> + local_irq_enable();
>> + goto out_l2_hit;
>> + }
>> +
>> + /*
>> + * Disable hardware prefetchers.
>> *
>> + * Call wrmsr direcly to avoid the local register variables from
>> + * being overwritten due to reordering of their assignment with
>> + * the wrmsr calls.
>> + */
>> + __wrmsr(MSR_MISC_FEATURE_CONTROL, prefetch_disable_bits, 0x0);
>> +
>> + /* Initialize rest of local variables */
>> + /*
>> + * Performance event has been validated right before this with
>> + * interrupts disabled - it is thus safe to read the counter index.
>> + */
>> + l2_miss_pmcnum = x86_perf_rdpmc_ctr_get(l2_miss_event);
>> + l2_hit_pmcnum = x86_perf_rdpmc_ctr_get(l2_hit_event);
>> + line_size = plr->line_size;
>> + mem_r = plr->kmem;
>> + size = plr->size;
>> +
>> + /*
>> + * Read counter variables twice - first to load the instructions
>> + * used in L1 cache, second to capture accurate value that does not
>> + * include cache misses incurred because of instruction loads.
>> + */
>> + rdpmcl(l2_hit_pmcnum, l2_hits_before);
>> + rdpmcl(l2_miss_pmcnum, l2_miss_before);
>> + /*
>> + * From SDM: Performing back-to-back fast reads are not guaranteed
>> + * to be monotonic. To guarantee monotonicity on back-toback reads,
>> + * a serializing instruction must be placed between the two
>> + * RDPMC instructions
>> + */
>> + rmb();
>> + rdpmcl(l2_hit_pmcnum, l2_hits_before);
>> + rdpmcl(l2_miss_pmcnum, l2_miss_before);
>> + /*
>> + * rdpmc is not a serializing instruction. Add barrier to prevent
>> + * instructions that follow to begin executing before reading the
>> + * counter value.
>> + */
>> + rmb();
>> + for (i = 0; i < size; i += line_size) {
>> + /*
>> + * Add a barrier to prevent speculative execution of this
>> + * loop reading beyond the end of the buffer.
>> + */
>> + rmb();
>> + asm volatile("mov (%0,%1,1), %%eax\n\t"
>> + :
>> + : "r" (mem_r), "r" (i)
>> + : "%eax", "memory");
>> + }
>> + rdpmcl(l2_hit_pmcnum, l2_hits_after);
>> + rdpmcl(l2_miss_pmcnum, l2_miss_after);
>> + /*
>> + * rdpmc is not a serializing instruction. Add barrier to ensure
>> + * events measured have completed and prevent instructions that
>> + * follow to begin executing before reading the counter value.
>> + */
>> + rmb();
>> + /* Re-enable hardware prefetchers */
>> + wrmsr(MSR_MISC_FEATURE_CONTROL, 0x0, 0x0);
>> + local_irq_enable();
>> + trace_pseudo_lock_l2(l2_hits_after - l2_hits_before,
>> + l2_miss_after - l2_miss_before);
>> +
>> +out_l2_hit:
>> + perf_event_release_kernel(l2_hit_event);
>> +out_l2_miss:
>> + perf_event_release_kernel(l2_miss_event);
>> +out:
>> + plr->thread_done = 1;
>> + wake_up_interruptible(&plr->lock_thread_wq);
>> + return 0;
>> +}
>> +
>
> The above, looks a _LOT_ like the below. And while C does suck a little,
> I'm sure there's something we can do about this.
You are correct, the L2 and L3 cache measurements are very similar.
Indeed, the current implementation does have them together in one
function but I was not able to obtain the same accuracy in measurements
as presented in my previous emails that only did L2 measurements. When
combining the L2 and L3 measurements in one function it is required to
do something like:
if (need_l2) {
rdpmcl(l2_hit_pmcnum, l2_hits_before);
rdpmcl(l2_miss_pmcnum, l2_miss_before);
}
if (need_l3) {
rdpmcl(l3_hit_pmcnum, l3_hits_before);
rdpmcl(l3_miss_pmcnum, l3_miss_before);
}
rmb();
if (need_l2) {
rdpmcl(l2_hit_pmcnum, l2_hits_before);
rdpmcl(l2_miss_pmcnum, l2_miss_before);
}
if (need _l3) {
rdpmcl(l3_hit_pmcnum, l3_hits_before);
rdpmcl(l3_miss_pmcnum, l3_miss_before);
}
rmb();
/* Test */
if (need_l2) {
rdpmcl(l2_hit_pmcnum, l2_hits_after);
rdpmcl(l2_miss_pmcnum, l2_miss_after);
}
if (need_l3) {
rdpmcl(l3_hit_pmcnum, l3_hits_after);
rdpmcl(l3_miss_pmcnum, l3_miss_after);
}
I have found that the additional branches required to support L2 and L3
measurements in one function introduces more cache misses in the
measurements than if I separate the measurements into two functions.
If you do have suggestions on how I can improve the implementation while
maintaining (or improving) the accuracy of the measurements I would
greatly appreciate it.
Reinette
next prev parent reply other threads:[~2018-09-06 19:22 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-08-16 20:16 [PATCH V2 0/6] perf/core and x86/intel_rdt: Fix lack of coordination with perf Reinette Chatre
2018-08-16 20:16 ` [PATCH V2 1/6] perf/core: Add sanity check to deal with pinned event failure Reinette Chatre
2018-08-16 20:16 ` [PATCH V2 2/6] x86/intel_rdt: Remove local register variables Reinette Chatre
2018-08-16 20:16 ` [PATCH V2 3/6] x86/intel_rdt: Create required perf event attributes Reinette Chatre
2018-08-16 20:16 ` [PATCH V2 4/6] x86/intel_rdt: Add helper to obtain performance counter index Reinette Chatre
2018-09-06 14:47 ` Peter Zijlstra
2018-09-06 23:26 ` Reinette Chatre
2018-08-16 20:16 ` [PATCH V2 5/6] x86/intel_rdt: Use perf infrastructure for measurements Reinette Chatre
2018-09-06 14:15 ` Peter Zijlstra
2018-09-06 19:21 ` Reinette Chatre [this message]
2018-09-06 19:44 ` Peter Zijlstra
2018-09-06 20:05 ` Reinette Chatre
2018-09-06 20:29 ` Peter Zijlstra
2018-09-06 20:37 ` Reinette Chatre
2018-09-06 21:38 ` Peter Zijlstra
2018-09-06 14:38 ` Peter Zijlstra
2018-08-16 20:16 ` [PATCH V2 6/6] x86/intel_rdt: Re-enable pseudo-lock measurements Reinette Chatre
2018-09-04 16:50 ` [PATCH V2 0/6] perf/core and x86/intel_rdt: Fix lack of coordination with perf Reinette Chatre
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=40894b6f-c421-32fb-39c3-3dddbed5aa91@intel.com \
--to=reinette.chatre@intel.com \
--cc=acme@kernel.org \
--cc=dave.hansen@intel.com \
--cc=fenghua.yu@intel.com \
--cc=gavin.hindman@intel.com \
--cc=hpa@zytor.com \
--cc=jithu.joseph@intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=peterz@infradead.org \
--cc=tglx@linutronix.de \
--cc=tony.luck@intel.com \
--cc=vikas.shivappa@linux.intel.com \
--cc=x86@kernel.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
Powered by JetHome