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

Re: [PATCH 2/2] x86/mem_sharing: Add extra variable to track fork progress





On Wed, Feb 15, 2023 at 6:03 AM Jan Beulich <jbeulich@xxxxxxxx> wrote:
>
> On 14.02.2023 06:07, Tamas K Lengyel wrote:
> > When VM forking is initiated a VM is not supposed to try to perform mem_sharing
> > yet as the fork process hasn't completed all required steps. However, the vCPU
> > bring-up paths trigger guest memory accesses that can lead to such premature
> > sharing ops. However, the gating check to see whether a VM is a fork is set
> > already (ie. the domain has a parent).
>
> I find this confusing, and I had to read the patch to understand what's
> meant. Since there are a total of three VMs involved here (the one
> driving the fork, the one being forked, and the new clone), "a VM" is
> insufficient. The sentence further reads as if that VM is performing
> sharing operations on itself, which according to my understanding is
> impossible.
>
> Furthermore "the vCPU bringup paths" is also not specific enough imo.
> The forked VM as well as the new clone are both paused if I'm not
> mistaken, so neither can be in the process of bringing up any vCPU-s.
> I assume you refer to bring_up_vcpus(), but I'm afraid I view this
> function as misnamed. vCPU-s are being _created_ there, not brought up.
> Furthermore there are no guest memory accesses from underneath
> bring_up_vcpus(), so with those accesses you may be referring to
> copy_settings() instead? Which in turn - I'm sorry for my ignorance -
> raises the question why (implicit) hypervisor side accesses to guest
> memory might trigger sharing: So far I was working from the assumption
> that it's only control tool requests which do. Otoh you talk of
> "sharing ops", which suggests it may indeed be requests coming from
> the control tool. Yet that's also what invoked the request to fork,
> so shouldn't it coordinate with itself and avoid issuing sharing ops
> prematurely?

I went back to double-check and here is the memory access during vcpu_create:

(XEN) Xen call trace:
(XEN)    [<ffff82d0402ebf38>] R mem_sharing.c#mem_sharing_gfn_alloc+0x5c/0x5e
(XEN)    [<ffff82d0402ecb12>] F mem_sharing.c#add_to_physmap+0x175/0x233
(XEN)    [<ffff82d0402ee81d>] F mem_sharing_fork_page+0x4ee/0x51e
(XEN)    [<ffff82d0402f244f>] F p2m_get_gfn_type_access+0x119/0x1a7
(XEN)    [<ffff82d0402e67ef>] F hap.c#hap_update_paging_modes+0xbe/0x2ee
(XEN)    [<ffff82d0402942a0>] F vmx_create_vmcs+0x981/0xb71
(XEN)    [<ffff82d040298884>] F vmx.c#vmx_vcpu_initialise+0x64/0x1a0
(XEN)    [<ffff82d0402acc59>] F hvm_vcpu_initialise+0x97/0x19e
(XEN)    [<ffff82d0403168db>] F arch_vcpu_create+0xf3/0x1db
(XEN)    [<ffff82d040206c69>] F vcpu_create+0x211/0x35d
(XEN)    [<ffff82d0402f00b7>] F mem_sharing_memop+0x16a9/0x1869
(XEN)    [<ffff82d0403317c5>] F subarch_memory_op+0x298/0x2c4
(XEN)    [<ffff82d04032ca26>] F arch_memory_op+0xa9f/0xaa4
(XEN)    [<ffff82d040221e66>] F do_memory_op+0x2150/0x2297
(XEN)    [<ffff82d04030bcfb>] F pv_do_multicall_call+0x22c/0x4c7
(XEN)    [<ffff82d040319727>] F arch_do_multicall_call+0x23/0x2c
(XEN)    [<ffff82d04022231f>] F do_multicall+0xd3/0x417
(XEN)    [<ffff82d04030c0e4>] F pv_hypercall+0xea/0x3a0
(XEN)    [<ffff82d040201292>] F lstar_enter+0x122/0x130

Any time any page is requested in a fork that's not present it gets populated from the parent (if the parent has it). What I was worried about is nominate_page being called on the fork but I was mistaken, it was called on the parent before add_to_physmap is called on the fork - which is fine and the expected behavior.

We can drop this patch, sorry for the noise.

Tamas

 


Rackspace

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