|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 4/8] x86/mem-sharing: copy GADDR based shared guest areas
On 26.01.2023 16:41, Tamas K Lengyel wrote:
> On Thu, Jan 26, 2023 at 3:14 AM Jan Beulich <jbeulich@xxxxxxxx> wrote:
>>
>> On 25.01.2023 16:34, Tamas K Lengyel wrote:
>>> On Tue, Jan 24, 2023 at 6:19 AM Jan Beulich <jbeulich@xxxxxxxx> wrote:
>>>>
>>>> On 23.01.2023 19:32, Tamas K Lengyel wrote:
>>>>> On Mon, Jan 23, 2023 at 11:24 AM Jan Beulich <jbeulich@xxxxxxxx>
> wrote:
>>>>>> On 23.01.2023 17:09, Tamas K Lengyel wrote:
>>>>>>> On Mon, Jan 23, 2023 at 9:55 AM Jan Beulich <jbeulich@xxxxxxxx>
> wrote:
>>>>>>>> --- a/xen/arch/x86/mm/mem_sharing.c
>>>>>>>> +++ b/xen/arch/x86/mm/mem_sharing.c
>>>>>>>> @@ -1653,6 +1653,65 @@ 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;
>>>>>>>> +
>>>>>>>> + /*
>>>>>>>> + * Simply specify the entire range up to the end of the
>>> page.
>>>>>>> All the
>>>>>>>> + * function uses it for is a check for not crossing page
>>>>>>> boundaries.
>>>>>>>> + */
>>>>>>>> + offset = PAGE_OFFSET(d_area->map);
>>>>>>>> + ret = map_guest_area(cd_vcpu, gfn_to_gaddr(gfn) + offset,
>>>>>>>> + PAGE_SIZE - offset, cd_area, NULL);
>>>>>>>> + if ( ret )
>>>>>>>> + return ret;
>>>>>>>> + }
>>>>>>>> + else
>>>>>>>> + cd_mfn = page_to_mfn(cd_area->pg);
>>>>>>>
>>>>>>> Everything to this point seems to be non mem-sharing/forking
> related.
>>>>> Could
>>>>>>> these live somewhere else? There must be some other place where
>>>>> allocating
>>>>>>> these areas happens already for non-fork VMs so it would make sense
> to
>>>>> just
>>>>>>> refactor that code to be callable from here.
>>>>>>
>>>>>> It is the "copy" aspect with makes this mem-sharing (or really fork)
>>>>>> specific. Plus in the end this is no different from what you have
>>>>>> there right now for copying the vCPU info area. In the final patch
>>>>>> that other code gets removed by re-using the code here.
>>>>>
>>>>> Yes, the copy part is fork-specific. Arguably if there was a way to do
>>> the
>>>>> allocation of the page for vcpu_info I would prefer that being
>>> elsewhere,
>>>>> but while the only requirement is allocate-page and copy from parent
>>> I'm OK
>>>>> with that logic being in here because it's really straight forward.
> But
>>> now
>>>>> you also do extra sanity checks here which are harder to comprehend in
>>> this
>>>>> context alone.
>>>>
>>>> What sanity checks are you talking about (also below, where you claim
>>>> map_guest_area() would be used only to sanity check)?
>>>
>>> Did I misread your comment above "All the function uses it for is a
> check
>>> for not crossing page boundaries"? That sounds to me like a simple
> sanity
>>> check, unclear why it matters though and why only for forks.
>>
>> The comment is about the function's use of the range it is being passed.
>> It doesn't say in any way that the function is doing only sanity checking.
>> If the comment wording is ambiguous or unclear, I'm happy to take
>> improvement suggestions.
>
> Yes, please do, it definitely was confusing while reviewing the patch.
I'm sorry, but what does "please do" mean when I asked for improvement
suggestions? I continue to think the comment is quite clear as is, so
if anything needs adjusting, I'd need to know pretty precisely what it
is that needs adding and/or re-writing. I can't, after all, guess what
your misunderstanding resulted from.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |