# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID 7e9699af7e1296c911a0102693872b59b0508e2c
# Parent 0caf8d9218cca1090f8463ac095ad9eb55becdb2
[XEN] Make per-cpu mm information explicitly PER_CPU.
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
---
xen/arch/x86/mm.c | 84 +++++++++++++++++++++++++++---------------------------
1 files changed, 43 insertions(+), 41 deletions(-)
diff -r 0caf8d9218cc -r 7e9699af7e12 xen/arch/x86/mm.c
--- a/xen/arch/x86/mm.c Tue Aug 08 14:02:14 2006 +0100
+++ b/xen/arch/x86/mm.c Tue Aug 08 14:18:57 2006 +0100
@@ -139,20 +139,21 @@ static int mod_l1_entry(l1_pgentry_t *,
static int mod_l1_entry(l1_pgentry_t *, l1_pgentry_t);
/* Used to defer flushing of memory structures. */
-static struct {
+struct percpu_mm_info {
#define DOP_FLUSH_TLB (1<<0) /* Flush the local TLB. */
#define DOP_FLUSH_ALL_TLBS (1<<1) /* Flush TLBs of all VCPUs of current dom. */
#define DOP_RELOAD_LDT (1<<2) /* Reload the LDT shadow mapping. */
unsigned int deferred_ops;
/* If non-NULL, specifies a foreign subject domain for some operations. */
struct domain *foreign;
-} __cacheline_aligned percpu_info[NR_CPUS];
+};
+static DEFINE_PER_CPU(struct percpu_mm_info, percpu_mm_info);
/*
* Returns the current foreign domain; defaults to the currently-executing
* domain if a foreign override hasn't been specified.
*/
-#define FOREIGNDOM (percpu_info[smp_processor_id()].foreign ?: current->domain)
+#define FOREIGNDOM (this_cpu(percpu_mm_info).foreign ?: current->domain)
/* Private domain structs for DOMID_XEN and DOMID_IO. */
static struct domain *dom_xen, *dom_io;
@@ -189,8 +190,6 @@ void arch_init_memory(void)
extern void subarch_init_memory(void);
unsigned long i, pfn, rstart_pfn, rend_pfn;
-
- memset(percpu_info, 0, sizeof(percpu_info));
/*
* Initialise our DOMID_XEN domain.
@@ -378,7 +377,8 @@ void invalidate_shadow_ldt(struct vcpu *
}
/* Dispose of the (now possibly invalid) mappings from the TLB. */
- percpu_info[v->processor].deferred_ops |= DOP_FLUSH_TLB | DOP_RELOAD_LDT;
+ ASSERT(v->processor == smp_processor_id());
+ this_cpu(percpu_mm_info).deferred_ops |= DOP_FLUSH_TLB | DOP_RELOAD_LDT;
}
@@ -1503,7 +1503,7 @@ void free_page_type(struct page_info *pa
* (e.g., update_va_mapping()) or we could end up modifying a page
* that is no longer a page table (and hence screw up ref counts).
*/
- percpu_info[smp_processor_id()].deferred_ops |= DOP_FLUSH_ALL_TLBS;
+ this_cpu(percpu_mm_info).deferred_ops |= DOP_FLUSH_ALL_TLBS;
if ( unlikely(shadow_mode_enabled(owner)) )
{
@@ -1781,7 +1781,8 @@ int new_guest_cr3(unsigned long mfn)
/* Failure here is unrecoverable: the VCPU has no pagetable! */
MEM_LOG("Fatal error while installing new baseptr %lx", mfn);
domain_crash(d);
- percpu_info[v->processor].deferred_ops = 0;
+ ASSERT(v->processor == smp_processor_id());
+ this_cpu(percpu_mm_info).deferred_ops = 0;
return 0;
}
}
@@ -1817,13 +1818,14 @@ int new_guest_cr3(unsigned long mfn)
return 1;
}
-static void process_deferred_ops(unsigned int cpu)
+static void process_deferred_ops(void)
{
unsigned int deferred_ops;
struct domain *d = current->domain;
-
- deferred_ops = percpu_info[cpu].deferred_ops;
- percpu_info[cpu].deferred_ops = 0;
+ struct percpu_mm_info *info = &this_cpu(percpu_mm_info);
+
+ deferred_ops = info->deferred_ops;
+ info->deferred_ops = 0;
if ( deferred_ops & (DOP_FLUSH_ALL_TLBS|DOP_FLUSH_TLB) )
{
@@ -1838,19 +1840,20 @@ static void process_deferred_ops(unsigne
if ( deferred_ops & DOP_RELOAD_LDT )
(void)map_ldt_shadow_page(0);
- if ( unlikely(percpu_info[cpu].foreign != NULL) )
- {
- put_domain(percpu_info[cpu].foreign);
- percpu_info[cpu].foreign = NULL;
- }
-}
-
-static int set_foreigndom(unsigned int cpu, domid_t domid)
+ if ( unlikely(info->foreign != NULL) )
+ {
+ put_domain(info->foreign);
+ info->foreign = NULL;
+ }
+}
+
+static int set_foreigndom(domid_t domid)
{
struct domain *e, *d = current->domain;
+ struct percpu_mm_info *info = &this_cpu(percpu_mm_info);
int okay = 1;
- ASSERT(percpu_info[cpu].foreign == NULL);
+ ASSERT(info->foreign == NULL);
if ( likely(domid == DOMID_SELF) )
goto out;
@@ -1867,7 +1870,7 @@ static int set_foreigndom(unsigned int c
{
case DOMID_IO:
get_knownalive_domain(dom_io);
- percpu_info[cpu].foreign = dom_io;
+ info->foreign = dom_io;
break;
default:
MEM_LOG("Dom %u cannot set foreign dom", d->domain_id);
@@ -1877,18 +1880,18 @@ static int set_foreigndom(unsigned int c
}
else
{
- percpu_info[cpu].foreign = e = find_domain_by_id(domid);
+ info->foreign = e = find_domain_by_id(domid);
if ( e == NULL )
{
switch ( domid )
{
case DOMID_XEN:
get_knownalive_domain(dom_xen);
- percpu_info[cpu].foreign = dom_xen;
+ info->foreign = dom_xen;
break;
case DOMID_IO:
get_knownalive_domain(dom_io);
- percpu_info[cpu].foreign = dom_io;
+ info->foreign = dom_io;
break;
default:
MEM_LOG("Unknown domain '%u'", domid);
@@ -1928,7 +1931,7 @@ int do_mmuext_op(
unsigned int foreigndom)
{
struct mmuext_op op;
- int rc = 0, i = 0, okay, cpu = smp_processor_id();
+ int rc = 0, i = 0, okay;
unsigned long mfn, type;
unsigned int done = 0;
struct page_info *page;
@@ -1946,7 +1949,7 @@ int do_mmuext_op(
(void)copy_from_guest(&done, pdone, 1);
}
- if ( !set_foreigndom(cpu, foreigndom) )
+ if ( !set_foreigndom(foreigndom) )
{
rc = -ESRCH;
goto out;
@@ -2042,7 +2045,7 @@ int do_mmuext_op(
case MMUEXT_NEW_BASEPTR:
mfn = gmfn_to_mfn(current->domain, mfn);
okay = new_guest_cr3(mfn);
- percpu_info[cpu].deferred_ops &= ~DOP_FLUSH_TLB;
+ this_cpu(percpu_mm_info).deferred_ops &= ~DOP_FLUSH_TLB;
break;
#ifdef __x86_64__
@@ -2065,7 +2068,7 @@ int do_mmuext_op(
#endif
case MMUEXT_TLB_FLUSH_LOCAL:
- percpu_info[cpu].deferred_ops |= DOP_FLUSH_TLB;
+ this_cpu(percpu_mm_info).deferred_ops |= DOP_FLUSH_TLB;
break;
case MMUEXT_INVLPG_LOCAL:
@@ -2137,9 +2140,9 @@ int do_mmuext_op(
v->arch.guest_context.ldt_base = ptr;
v->arch.guest_context.ldt_ents = ents;
load_LDT(v);
- percpu_info[cpu].deferred_ops &= ~DOP_RELOAD_LDT;
+ this_cpu(percpu_mm_info).deferred_ops &= ~DOP_RELOAD_LDT;
if ( ents != 0 )
- percpu_info[cpu].deferred_ops |= DOP_RELOAD_LDT;
+ this_cpu(percpu_mm_info).deferred_ops |= DOP_RELOAD_LDT;
}
break;
}
@@ -2160,7 +2163,7 @@ int do_mmuext_op(
}
out:
- process_deferred_ops(cpu);
+ process_deferred_ops();
/* Add incremental work we have done to the @done output parameter. */
done += i;
@@ -2181,7 +2184,7 @@ int do_mmu_update(
void *va;
unsigned long gpfn, gmfn, mfn;
struct page_info *page;
- int rc = 0, okay = 1, i = 0, cpu = smp_processor_id();
+ int rc = 0, okay = 1, i = 0;
unsigned int cmd, done = 0;
struct vcpu *v = current;
struct domain *d = v->domain;
@@ -2205,7 +2208,7 @@ int do_mmu_update(
domain_mmap_cache_init(&mapcache);
domain_mmap_cache_init(&sh_mapcache);
- if ( !set_foreigndom(cpu, foreigndom) )
+ if ( !set_foreigndom(foreigndom) )
{
rc = -ESRCH;
goto out;
@@ -2396,7 +2399,7 @@ int do_mmu_update(
domain_mmap_cache_destroy(&mapcache);
domain_mmap_cache_destroy(&sh_mapcache);
- process_deferred_ops(cpu);
+ process_deferred_ops();
/* Add incremental work we have done to the @done output parameter. */
done += i;
@@ -2690,7 +2693,6 @@ int do_update_va_mapping(unsigned long v
l1_pgentry_t val = l1e_from_intpte(val64);
struct vcpu *v = current;
struct domain *d = v->domain;
- unsigned int cpu = smp_processor_id();
unsigned long vmask, bmap_ptr;
cpumask_t pmask;
int rc = 0;
@@ -2713,9 +2715,10 @@ int do_update_va_mapping(unsigned long v
if ( likely(rc == 0) && unlikely(shadow_mode_enabled(d)) )
{
- if ( unlikely(percpu_info[cpu].foreign &&
+ if ( unlikely(this_cpu(percpu_mm_info).foreign &&
(shadow_mode_translate(d) ||
- shadow_mode_translate(percpu_info[cpu].foreign))) )
+ shadow_mode_translate(
+ this_cpu(percpu_mm_info).foreign))) )
{
/*
* The foreign domain's pfn's are in a different namespace. There's
@@ -2773,7 +2776,7 @@ int do_update_va_mapping(unsigned long v
break;
}
- process_deferred_ops(cpu);
+ process_deferred_ops();
UNLOCK_BIGLOCK(d);
@@ -2784,13 +2787,12 @@ int do_update_va_mapping_otherdomain(uns
unsigned long flags,
domid_t domid)
{
- unsigned int cpu = smp_processor_id();
int rc;
if ( unlikely(!IS_PRIV(current->domain)) )
return -EPERM;
- if ( !set_foreigndom(cpu, domid) )
+ if ( !set_foreigndom(domid) )
return -ESRCH;
rc = do_update_va_mapping(va, val64, flags);
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|