[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v9 4/5] x86/mem_sharing: reset a fork



On Mon, Feb 24, 2020 at 08:35:09AM -0700, Tamas K Lengyel wrote:
> On Mon, Feb 24, 2020 at 8:13 AM Roger Pau Monné <roger.pau@xxxxxxxxxx> wrote:
> >
> > On Fri, Feb 21, 2020 at 10:49:22AM -0800, Tamas K Lengyel wrote:
> > > Implement hypercall that allows a fork to shed all memory that got 
> > > allocated
> > > for it during its execution and re-load its vCPU context from the parent 
> > > VM.
> > > This allows the forked VM to reset into the same state the parent VM is 
> > > in a
> > > faster way then creating a new fork would be. Measurements show about a 2x
> > > speedup during normal fuzzing operations. Performance may vary depending 
> > > how
> >                                                                           ^ 
> > on
> > > much memory got allocated for the forked VM. If it has been completely
> > > deduplicated from the parent VM then creating a new fork would likely be 
> > > more
> > > performant.
> > >
> > > Signed-off-by: Tamas K Lengyel <tamas.lengyel@xxxxxxxxx>
> > > ---
> > >  xen/arch/x86/mm/mem_sharing.c | 76 +++++++++++++++++++++++++++++++++++
> > >  xen/include/public/memory.h   |  1 +
> > >  2 files changed, 77 insertions(+)
> > >
> > > diff --git a/xen/arch/x86/mm/mem_sharing.c b/xen/arch/x86/mm/mem_sharing.c
> > > index ad5db9d8d5..fb6892aaa6 100644
> > > --- a/xen/arch/x86/mm/mem_sharing.c
> > > +++ b/xen/arch/x86/mm/mem_sharing.c
> > > @@ -1636,6 +1636,59 @@ static int mem_sharing_fork(struct domain *d, 
> > > struct domain *cd)
> > >      return rc;
> > >  }
> > >
> > > +/*
> > > + * The fork reset operation is intended to be used on short-lived forks 
> > > only.
> > > + * There is no hypercall continuation operation implemented for this 
> > > reason.
> > > + * For forks that obtain a larger memory footprint it is likely going to 
> > > be
> > > + * more performant to create a new fork instead of resetting an existing 
> > > one.
> > > + *
> > > + * TODO: In case this hypercall would become useful on forks with larger 
> > > memory
> > > + * footprints the hypercall continuation should be implemented.
> >
> > I'm afraid this is not safe, as users don't have an easy way to know
> > whether a fork will have a large memory footprint or not.
> 
> They do, getdomaininfo tells a user exactly how much memory has been
> allocated for a domain.
> 
> >
> > IMO you either need some kind of check that prevents this function
> > from being executed when the domain as too much memory assigned, or
> > you need to implement continuations.
> 
> I really don't think we need continuation here with the usecase we
> have for this function but I'm also tired of arguing about it, so I'll
> just add it even if its going to be dead code.
> 
> >
> > Or else this is very likely to trip over the watchdog.
> 
> The watchdog?

Yes, Xen has a watchdog and this loop is likely to trigger it if it
takes > 5s to complete. The watchdog triggering is a fatal event and
leads to host crash.

Note that watchdog is not enabled by default, you need to enable it on
the Xen command line.

> > > +    {
> > > +        p2m_type_t p2mt;
> > > +        p2m_access_t p2ma;
> > > +        gfn_t gfn;
> > > +        mfn_t mfn = page_to_mfn(page);
> > > +
> > > +        if ( !mfn_valid(mfn) )
> > > +            continue;
> > > +
> > > +        gfn = mfn_to_gfn(cd, mfn);
> > > +        mfn = __get_gfn_type_access(p2m, gfn_x(gfn), &p2mt, &p2ma,
> > > +                                    0, NULL, false);
> > > +
> > > +        if ( !p2m_is_ram(p2mt) || p2m_is_shared(p2mt) )
> > > +            continue;
> > > +
> > > +        /* take an extra reference */
> > > +        if ( !get_page(page, cd) )
> > > +            continue;
> > > +
> > > +        rc = p2m->set_entry(p2m, gfn, INVALID_MFN, PAGE_ORDER_4K,
> > > +                            p2m_invalid, p2m_access_rwx, -1);
> > > +        ASSERT(!rc);
> >
> > Can you handle this gracefully?
> 
> Nope. This should never happen, so if it does, something is very wrong
> in some other part of Xen.

OK, please switch it to BUG_ON then instead of ASSERT. It's better to
crash here than to misbehave later.

Thanks, Roger.

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.