diff options
author | emellor@leeni.uk.xensource.com <emellor@leeni.uk.xensource.com> | 2006-03-29 18:41:30 +0100 |
---|---|---|
committer | emellor@leeni.uk.xensource.com <emellor@leeni.uk.xensource.com> | 2006-03-29 18:41:30 +0100 |
commit | f61bc4e0b8d4ed5e7f65dc17aeb3c8a42755b346 (patch) | |
tree | a2b3b5e978eddaef4dc24cbea62aecf0e9247be3 | |
parent | f9bdf89a1b78397a2b26421ec839f54d38697047 (diff) | |
download | xen-f61bc4e0b8d4ed5e7f65dc17aeb3c8a42755b346.tar.gz xen-f61bc4e0b8d4ed5e7f65dc17aeb3c8a42755b346.tar.bz2 xen-f61bc4e0b8d4ed5e7f65dc17aeb3c8a42755b346.zip |
Merged.
-rw-r--r-- | linux-2.6-xen-sparse/drivers/xen/blkback/xenbus.c | 1 | ||||
-rw-r--r-- | xen/arch/x86/domain.c | 7 | ||||
-rw-r--r-- | xen/arch/x86/smpboot.c | 1 | ||||
-rw-r--r-- | xen/include/asm-x86/shadow.h | 44 |
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. */ |