[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v3 4/8] x86/mem-sharing: copy GADDR based shared guest areas
On Wed, Sep 27, 2023 at 07:43:26AM -0400, Tamas K Lengyel wrote: > On Wed, Sep 27, 2023 at 7:08 AM Roger Pau Monné <roger.pau@xxxxxxxxxx> wrote: > > > > On Wed, May 03, 2023 at 05:56:46PM +0200, Jan Beulich wrote: > > > In preparation of the introduction of new vCPU operations allowing to > > > register the respective areas (one of the two is x86-specific) by > > > guest-physical address, add the necessary fork handling (with the > > > backing function yet to be filled in). > > > > > > Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> > > > > Given the very limited and specific usage of the current Xen forking > > code, do we really need to bother about copying such areas? > > > > IOW: I doubt that not updating the runstate/time areas will make any > > difference to the forking code ATM. > > The current implementation of forking allows for fully functional VM > forks to be setup, including launching the dm for them. The toolstack > side hasn't been merged for that into Xen but that doesn't mean it's > not available or used already. So any internal changes to Xen that > create guest-states that could potentially be interacted with and > relied on by a guest should get properly wired in for forking. So I'm > happy Jan took the initiative here for wiring this up, even if the > use-case seems niche. But there are still some bits missing in Xen, seeing the comment in copy_vcpu_settings(). If we don't copy the timers already then I'm unsure whether copying the runstate/time shared areas is very relevant. > > > > > --- > > > v3: Extend comment. > > > > > > --- a/xen/arch/x86/mm/mem_sharing.c > > > +++ b/xen/arch/x86/mm/mem_sharing.c > > > @@ -1641,6 +1641,68 @@ static void copy_vcpu_nonreg_state(struc > > > hvm_set_nonreg_state(cd_vcpu, &nrs); > > > } > > > > > > +static int copy_guest_area(struct guest_area *cd_area, > > > + const struct guest_area *d_area, > > > + struct vcpu *cd_vcpu, > > > + const struct domain *d) > > > +{ > > > + mfn_t d_mfn, cd_mfn; > > > + > > > + if ( !d_area->pg ) > > > + return 0; > > > + > > > + d_mfn = page_to_mfn(d_area->pg); > > > + > > > + /* Allocate & map a page for the area if it hasn't been already. */ > > > + if ( !cd_area->pg ) > > > + { > > > + gfn_t gfn = mfn_to_gfn(d, d_mfn); > > > + struct p2m_domain *p2m = p2m_get_hostp2m(cd_vcpu->domain); > > > + p2m_type_t p2mt; > > > + p2m_access_t p2ma; > > > + unsigned int offset; > > > + int ret; > > > + > > > + cd_mfn = p2m->get_entry(p2m, gfn, &p2mt, &p2ma, 0, NULL, NULL); > > > + if ( mfn_eq(cd_mfn, INVALID_MFN) ) > > > + { > > > + struct page_info *pg = alloc_domheap_page(cd_vcpu->domain, > > > 0); > > > + > > > + if ( !pg ) > > > + return -ENOMEM; > > > + > > > + cd_mfn = page_to_mfn(pg); > > > + set_gpfn_from_mfn(mfn_x(cd_mfn), gfn_x(gfn)); > > > + > > > + ret = p2m->set_entry(p2m, gfn, cd_mfn, PAGE_ORDER_4K, > > > p2m_ram_rw, > > > + p2m->default_access, -1); > > > + if ( ret ) > > > + return ret; > > > + } > > > + else if ( p2mt != p2m_ram_rw ) > > > + return -EBUSY; > > > > Shouldn't the populate of the underlying gfn in the fork case > > be done by map_guest_area itself? > > Would seem more logical, I agree, but then the call should be > map_guest_area first, which conditionally calls down into a > mem_sharing_copy_guest_area if the domain is a fork. > > > > > What if a forked guest attempts to register a new runstate/time info > > against an address not yet populated? > > Unpopulated memory will get forked from the parent for all access > paths currently in existence, including access to a forked VMs memory > from dom0/dm and the various internal Xen access paths. If the memory > range is not mapped in the parent registering on that range ought to > fail by I assume existing checks that validate that the memory is > present during registration. What I'm trying to say is that map_guest_area() already has to deal with forked guests, and hence the populating of the gfn shouldn't be needed as map_guest_area() must know how to deal with such guest anyway. Thanks, Roger.
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |