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

Re: [Xen-devel] [PATCH v9 3/5] xen/mem_sharing: VM forking



On Mon, Feb 24, 2020 at 08:45:05AM -0700, Tamas K Lengyel wrote:
> On Mon, Feb 24, 2020 at 5:39 AM Roger Pau Monné <roger.pau@xxxxxxxxxx> wrote:
> >
> > On Fri, Feb 21, 2020 at 10:49:21AM -0800, Tamas K Lengyel wrote:
> > > +    }
> > > +
> > > +    /*
> > > +     * If it's a write access (ie. unsharing) or if adding a shared 
> > > entry to
> > > +     * the physmap failed we'll fork the page directly.
> > > +     */
> > > +    p2m = p2m_get_hostp2m(d);
> > > +    parent = d->parent;
> > > +
> > > +    while ( parent )
> > > +    {
> > > +        mfn = get_gfn_query(parent, gfn_l, &p2mt);
> > > +
> > > +        if ( mfn_valid(mfn) && p2m_is_any_ram(p2mt) )
> >
> > This would also cover grants, but I'm not sure how those are handled
> > by forking, as access to those is granted on a per-domain basis. Ie:
> > the parent will have access to the grant, but not the child.
> 
> Good question. Grants are not sharable because their reference count
> will prevent sharing, so here the page content would just get copied
> as a regular page into the fork. I can check that if in the usecase we
> have anything breaks if we just skip grants completely, I don't think
> a regular domain has any grants by default.

Hm, I don't have a good suggestion for this. Since the domain is not
aware of the fork there's no way for it to notice grant maps have
become stale.

Can you add a note in this regard? And maybe crashing the fork when a
grant is found would be fine, until we figure out how to handle them
properly.

> >
> > > +            break;
> > > +
> > > +        put_gfn(parent, gfn_l);
> > > +        parent = parent->parent;
> > > +    }
> > > +
> > > +    if ( !parent )
> > > +        return -ENOENT;
> > > +
> > > +    if ( !(page = alloc_domheap_page(d, 0)) )
> > > +    {
> > > +        put_gfn(parent, gfn_l);
> > > +        return -ENOMEM;
> > > +    }
> > > +
> > > +    new_mfn = page_to_mfn(page);
> > > +    copy_domain_page(new_mfn, mfn);
> > > +    set_gpfn_from_mfn(mfn_x(new_mfn), gfn_l);
> > > +
> > > +    put_gfn(parent, gfn_l);
> > > +
> > > +    return p2m->set_entry(p2m, gfn, new_mfn, PAGE_ORDER_4K, p2m_ram_rw,
> >
> > So the child p2m is going to be populated using 4K pages exclusively?
> > Maybe it would make sense to try to use 2M if the parent domain page
> > is also a 2M page or larger?
> 
> No, memory sharing only works on a 4k granularity so that's what we
> are going with. No reason to copy 2M pages when most of it can just be
> shared when broken up.

Oh, OK. For your use-case it likely doesn't matter that much, but
long-running forks would get better performance if using large pages.

> > > @@ -509,6 +509,14 @@ mfn_t __get_gfn_type_access(struct p2m_domain *p2m, 
> > > unsigned long gfn_l,
> > >
> > >      mfn = p2m->get_entry(p2m, gfn, t, a, q, page_order, NULL);
> > >
> > > +    /* Check if we need to fork the page */
> > > +    if ( (q & P2M_ALLOC) && p2m_is_hole(*t) &&
> > > +         !mem_sharing_fork_page(p2m->domain, gfn, !!(q & P2M_UNSHARE)) )
> > > +    {
> > > +        mfn = p2m->get_entry(p2m, gfn, t, a, q, page_order, NULL);
> > > +    }
> >
> > No need for the braces.
> 
> I would keep them, it helps with readability in this case.

CODING_STYLE mentions that braces should be omitted for blocks with a
single statement, but I'm not sure how strictly we enforce this.

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®.