|
[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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |