[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH 2/3] x86/mem_sharing: use dom_cow as placeholder parent until fork is complete
For the duration of the fork memop set dom_cow as a placeholder parent. This gets updated to the real parent when the fork operation completes, or to NULL in case the fork failed. Doing this allows us to skip populating the physmap with any entries until the fork operation successfully completes. Currently bringing up vCPUs may inadvertantly map in some pages that can turn out to be unecessary, like the CR3 gfn when paging is disabled. Signed-off-by: Tamas K Lengyel <tamas.lengyel@xxxxxxxxx> --- xen/arch/x86/include/asm/mem_sharing.h | 2 +- xen/arch/x86/mm/mem_sharing.c | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/xen/arch/x86/include/asm/mem_sharing.h b/xen/arch/x86/include/asm/mem_sharing.h index cf7a12f4d2..b4a8e8795a 100644 --- a/xen/arch/x86/include/asm/mem_sharing.h +++ b/xen/arch/x86/include/asm/mem_sharing.h @@ -79,7 +79,7 @@ static inline int mem_sharing_unshare_page(struct domain *d, static inline bool mem_sharing_is_fork(const struct domain *d) { - return d->parent; + return d->parent && d->parent != dom_cow; } int mem_sharing_fork_page(struct domain *d, gfn_t gfn, diff --git a/xen/arch/x86/mm/mem_sharing.c b/xen/arch/x86/mm/mem_sharing.c index 84c04ddfa3..a21c781452 100644 --- a/xen/arch/x86/mm/mem_sharing.c +++ b/xen/arch/x86/mm/mem_sharing.c @@ -1850,7 +1850,9 @@ static int fork(struct domain *cd, struct domain *d, uint16_t flags) *cd->arch.cpuid = *d->arch.cpuid; *cd->arch.msr = *d->arch.msr; cd->vmtrace_size = d->vmtrace_size; - cd->parent = d; + + /* use dom_cow as a placeholder until we are all done */ + cd->parent = dom_cow; } /* This is preemptible so it's the first to get done */ @@ -1862,6 +1864,7 @@ static int fork(struct domain *cd, struct domain *d, uint16_t flags) if ( !(rc = copy_settings(cd, d, skip_special_pages)) ) { + cd->parent = d; cd->arch.hvm.mem_sharing.block_interrupts = block_interrupts; cd->arch.hvm.mem_sharing.skip_special_pages = skip_special_pages; /* skip mapping the vAPIC page on unpause if skipping special pages */ -- 2.25.1
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |