aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoremellor@leeni.uk.xensource.com <emellor@leeni.uk.xensource.com>2006-03-29 18:41:30 +0100
committeremellor@leeni.uk.xensource.com <emellor@leeni.uk.xensource.com>2006-03-29 18:41:30 +0100
commitf61bc4e0b8d4ed5e7f65dc17aeb3c8a42755b346 (patch)
treea2b3b5e978eddaef4dc24cbea62aecf0e9247be3
parentf9bdf89a1b78397a2b26421ec839f54d38697047 (diff)
downloadxen-f61bc4e0b8d4ed5e7f65dc17aeb3c8a42755b346.tar.gz
xen-f61bc4e0b8d4ed5e7f65dc17aeb3c8a42755b346.tar.bz2
xen-f61bc4e0b8d4ed5e7f65dc17aeb3c8a42755b346.zip
Merged.
-rw-r--r--linux-2.6-xen-sparse/drivers/xen/blkback/xenbus.c1
-rw-r--r--xen/arch/x86/domain.c7
-rw-r--r--xen/arch/x86/smpboot.c1
-rw-r--r--xen/include/asm-x86/shadow.h44
4 files changed, 53 insertions, 0 deletions
diff --git a/linux-2.6-xen-sparse/drivers/xen/blkback/xenbus.c b/linux-2.6-xen-sparse/drivers/xen/blkback/xenbus.c
index 23fe51a362..c1b63752a1 100644
--- a/linux-2.6-xen-sparse/drivers/xen/blkback/xenbus.c
+++ b/linux-2.6-xen-sparse/drivers/xen/blkback/xenbus.c
@@ -253,6 +253,7 @@ static void frontend_changed(struct xenbus_device *dev,
switch (frontend_state) {
case XenbusStateInitialising:
+ case XenbusStateConnected:
break;
case XenbusStateInitialised:
diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c
index b8e6ce9708..0a48ba6053 100644
--- a/xen/arch/x86/domain.c
+++ b/xen/arch/x86/domain.c
@@ -226,6 +226,13 @@ struct vcpu *alloc_vcpu_struct(struct domain *d, unsigned int vcpu_id)
v->arch.schedule_tail = is_idle_domain(d) ?
continue_idle_domain : continue_nonidle_domain;
+ percpu_ctxt[vcpu_id].curr_vcpu = v;
+ v->arch.schedule_tail = continue_idle_domain;
+ }
+ else
+ {
+ v->arch.schedule_tail = continue_nonidle_domain;
+ }
v->arch.ctxt_switch_from = paravirt_ctxt_switch_from;
v->arch.ctxt_switch_to = paravirt_ctxt_switch_to;
diff --git a/xen/arch/x86/smpboot.c b/xen/arch/x86/smpboot.c
index 3a35ca339e..f908af1c79 100644
--- a/xen/arch/x86/smpboot.c
+++ b/xen/arch/x86/smpboot.c
@@ -881,6 +881,7 @@ static int __devinit do_boot_cpu(int apicid, int cpu)
* Returns zero if CPU booted OK, else error code from wakeup_secondary_cpu.
*/
{
+ struct vcpu *v;
unsigned long boot_error;
int timeout;
unsigned long start_eip;
diff --git a/xen/include/asm-x86/shadow.h b/xen/include/asm-x86/shadow.h
index 28d50466ea..989768daa4 100644
--- a/xen/include/asm-x86/shadow.h
+++ b/xen/include/asm-x86/shadow.h
@@ -662,10 +662,14 @@ static inline void shadow_sync_and_drop_references(
if ( likely(!shadow_mode_refcounts(d)) )
return;
+ shadow_lock(d);
+
if ( page_out_of_sync(page) )
__shadow_sync_mfn(d, page_to_mfn(page));
shadow_remove_all_access(d, page_to_mfn(page));
+
+ shadow_unlock(d);
}
#endif
@@ -699,6 +703,46 @@ get_shadow_ref(unsigned long smfn)
return 1;
}
+ shadow_sync_and_drop_references(d, mfn_to_page(mfn));
+ set_p2m_entry(d, gpfn, -1, &c1, &c2);
+ set_gpfn_from_mfn(mfn, INVALID_M2P_ENTRY);
+ shadow_unlock(d);
+ domain_mmap_cache_destroy(&c1);
+ domain_mmap_cache_destroy(&c2);
+}
+
+/************************************************************************/
+
+/*
+ * Add another shadow reference to smfn.
+ */
+static inline int
+get_shadow_ref(unsigned long smfn)
+{
+ u32 x, nx;
+
+ ASSERT(mfn_valid(smfn));
+
+ x = mfn_to_page(smfn)->count_info;
+ nx = x + 1;
+
+ if ( unlikely(nx == 0) )
+ {
+ printk("get_shadow_ref overflow, gmfn=%" PRtype_info " smfn=%lx\n",
+ mfn_to_page(smfn)->u.inuse.type_info & PGT_mfn_mask,
+ smfn);
+ BUG();
+ }
+
+ // Guarded by the shadow lock...
+ //
+ mfn_to_page(smfn)->count_info = nx;
+
+ return 1;
+}
+
+extern void free_shadow_page(unsigned long smfn);
+
/*
* Drop a shadow reference to smfn.
*/