|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH 2/2] x86: replace this_cpu() uses in mapcache_current_vcpu()
We have accumulated three of them, plus a hidden similar 4th construct
from smp_processor_id(). Latch the result of the latter into a local
variable and use the slightly more efficient per_cpu() instead.
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
---
A 5th such construct is "current", yet to replace that we'd need to open-
code both it (i.e. get_current()) and then also smp_processor_id(). I
wasn't quite sure whether that would be deemed acceptable.
Like indicated in the earlier patch, this similarly leads to the function
actually being inlined (and hence generated code size actually growing) in
gcc16 debug builds. In release builds (with older gcc) the function is
being inlined no matter what. Overall, having looked at generated code
differences, I'm not quite sure anymore whether the earlier observed
inefficiency with repeated this_cpu() really is much of an issue (here or
maybe even more generally).
--- a/xen/arch/x86/domain_page.c
+++ b/xen/arch/x86/domain_page.c
@@ -20,7 +20,8 @@
static inline struct vcpu *mapcache_current_vcpu(void)
{
- const struct vcpu *v = this_cpu(pgtable_vcpu);
+ unsigned int cpu = smp_processor_id();
+ const struct vcpu *v = per_cpu(pgtable_vcpu, cpu);
const struct vcpu *curr = current;
/*
@@ -37,9 +38,9 @@ static inline struct vcpu *mapcache_curr
* change the page tables under our feet an invalidate any in-use mapcache
* entries.
*/
- if ( unlikely(this_cpu(curr_vcpu) != curr) )
+ if ( unlikely(per_cpu(curr_vcpu, cpu) != curr) )
{
- ASSERT(curr == idle_vcpu[smp_processor_id()]);
+ ASSERT(curr == idle_vcpu[cpu]);
sync_local_execstate();
/* We must now be running on the idle page table. */
ASSERT(cr3_pa(read_cr3()) == __pa(idle_pg_table));
@@ -51,7 +52,7 @@ static inline struct vcpu *mapcache_curr
* FLUSH_VCPU_STATE IPI has done so behind our back. Use ACCESS_ONCE to
* ensure the compiler never returns the locally cached pgtable_vcpu value.
*/
- return ACCESS_ONCE(this_cpu(pgtable_vcpu));
+ return ACCESS_ONCE(per_cpu(pgtable_vcpu, cpu));
}
#define mapcache_l2_entry(e) ((e) >> PAGETABLE_ORDER)
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |