|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 1/3] x86/mem_sharing: option to skip populating special pages during fork
On Thu, Mar 24, 2022 at 11:15:08AM -0400, Tamas K Lengyel wrote:
> On Thu, Mar 24, 2022 at 10:50 AM Roger Pau Monné <roger.pau@xxxxxxxxxx> wrote:
> >
> > On Tue, Mar 22, 2022 at 01:41:37PM -0400, Tamas K Lengyel wrote:
> > > Add option to the fork memop to skip populating the fork with special
> > > pages.
> > > These special pages are only necessary when setting up forks to be fully
> > > functional with a toolstack. For short-lived forks where no toolstack is
> > > active
> > > these pages are uneccesary.
> >
> > I'm not sure those are strictly related to having a toolstack. For
> > example the vcpu_info has nothing to do with having a toolstack, and
> > is only used by the guest in order to receive events or fetch time
> > related data. So while a short-lived fork might not make use of those,
> > that has nothing to do with having a toolstack or not.
>
> Fair enough, the point is that the short live fork doesn't use these pages.
>
> > >
> > > Signed-off-by: Tamas K Lengyel <tamas.lengyel@xxxxxxxxx>
> > > ---
> > > xen/arch/x86/include/asm/hvm/domain.h | 4 +++-
> > > xen/arch/x86/mm/mem_sharing.c | 33 +++++++++++++++++----------
> > > xen/include/public/memory.h | 4 ++--
> > > 3 files changed, 26 insertions(+), 15 deletions(-)
> > >
> > > diff --git a/xen/arch/x86/include/asm/hvm/domain.h
> > > b/xen/arch/x86/include/asm/hvm/domain.h
> > > index 698455444e..446cd06411 100644
> > > --- a/xen/arch/x86/include/asm/hvm/domain.h
> > > +++ b/xen/arch/x86/include/asm/hvm/domain.h
> > > @@ -31,7 +31,9 @@
> > > #ifdef CONFIG_MEM_SHARING
> > > struct mem_sharing_domain
> > > {
> > > - bool enabled, block_interrupts;
> > > + bool enabled;
> > > + bool block_interrupts;
> > > + bool skip_special_pages;
> > >
> > > /*
> > > * When releasing shared gfn's in a preemptible manner, recall where
> > > diff --git a/xen/arch/x86/mm/mem_sharing.c b/xen/arch/x86/mm/mem_sharing.c
> > > index 15e6a7ed81..84c04ddfa3 100644
> > > --- a/xen/arch/x86/mm/mem_sharing.c
> > > +++ b/xen/arch/x86/mm/mem_sharing.c
> > > @@ -1643,7 +1643,8 @@ static int bring_up_vcpus(struct domain *cd, struct
> > > domain *d)
> > > return 0;
> > > }
> > >
> > > -static int copy_vcpu_settings(struct domain *cd, const struct domain *d)
> > > +static int copy_vcpu_settings(struct domain *cd, const struct domain *d,
> > > + bool skip_special_pages)
> > > {
> > > unsigned int i;
> > > struct p2m_domain *p2m = p2m_get_hostp2m(cd);
> > > @@ -1660,7 +1661,7 @@ static int copy_vcpu_settings(struct domain *cd,
> > > const struct domain *d)
> > >
> > > /* Copy & map in the vcpu_info page if the guest uses one */
> > > vcpu_info_mfn = d_vcpu->vcpu_info_mfn;
> > > - if ( !mfn_eq(vcpu_info_mfn, INVALID_MFN) )
> > > + if ( !skip_special_pages && !mfn_eq(vcpu_info_mfn, INVALID_MFN) )
> > > {
> > > mfn_t new_vcpu_info_mfn = cd_vcpu->vcpu_info_mfn;
> > >
> > > @@ -1807,17 +1808,18 @@ static int copy_special_pages(struct domain *cd,
> > > struct domain *d)
> > > return 0;
> > > }
> > >
> > > -static int copy_settings(struct domain *cd, struct domain *d)
> > > +static int copy_settings(struct domain *cd, struct domain *d,
> > > + bool skip_special_pages)
> > > {
> > > int rc;
> > >
> > > - if ( (rc = copy_vcpu_settings(cd, d)) )
> > > + if ( (rc = copy_vcpu_settings(cd, d, skip_special_pages)) )
> > > return rc;
> > >
> > > if ( (rc = hvm_copy_context_and_params(cd, d)) )
> > > return rc;
> > >
> > > - if ( (rc = copy_special_pages(cd, d)) )
> > > + if ( !skip_special_pages && (rc = copy_special_pages(cd, d)) )
> > > return rc;
> > >
> > > copy_tsc(cd, d);
> > > @@ -1826,9 +1828,11 @@ static int copy_settings(struct domain *cd, struct
> > > domain *d)
> > > return rc;
> > > }
> > >
> > > -static int fork(struct domain *cd, struct domain *d)
> > > +static int fork(struct domain *cd, struct domain *d, uint16_t flags)
> > > {
> > > int rc = -EBUSY;
> > > + bool block_interrupts = flags & XENMEM_FORK_BLOCK_INTERRUPTS;
> > > + bool skip_special_pages = flags & XENMEM_FORK_SKIP_SPECIAL_PAGES;
> > >
> > > if ( !cd->controller_pause_count )
> > > return rc;
> > > @@ -1856,7 +1860,13 @@ static int fork(struct domain *cd, struct domain
> > > *d)
> > > if ( (rc = bring_up_vcpus(cd, d)) )
> > > goto done;
> > >
> > > - rc = copy_settings(cd, d);
> > > + if ( !(rc = copy_settings(cd, d, skip_special_pages)) )
> >
> > Can you set
> > cd->arch.hvm.mem_sharing.{block_interrupts,skip_special_pages} earlier
> > so that you don't need to pass the options around to copy_settings and
> > copy_vcpu_settings?
>
> Would be possible yes, but then we would have to clear them in case
> the forking failed at any point. Setting them only at the end when the
> fork finished ensures that those fields are only ever valid if the VM
> is a fork. Both are valid approaches and I prefer this over the other.
I think I'm confused, doesn't the fork get destroyed if there's a
failure? In which case the values
cd->arch.hvm.mem_sharing.{block_interrupts,skip_special_pages}
shouldn't really matter?
> >
> > > + {
> > > + 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 */
> > > + cd->creation_finished = skip_special_pages;
> >
> > I think this is dangerous. While it might be true at the moment that
> > the arch_domain_creation_finished only maps the vAPIC page, there's no
> > guarantee it couldn't do other stuff in the future that could be
> > required for the VM to be started.
>
> I understand this domain_creation_finished route could be expanded in
> the future to include other stuff, but IMHO we can evaluate what to do
> about that when and if it becomes necessary. This is all experimental
> to begin with.
Maybe you could check the skip_special_pages field from
domain_creation_finished in order to decide whether the vAPIC page
needs to be mapped?
Thanks, Roger.
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |