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

Re: [Xen-devel] [PATCH 0/4] xen: map foreign pages for shared rings by updating the PTEs directly



On 30/09/11 09:08, Jan Beulich wrote:
>>>> On 29.09.11 at 18:45, David Vrabel <david.vrabel@xxxxxxxxxx> wrote:
>> On 29/09/11 17:07, Jan Beulich wrote:
>>>>>> On 29.09.11 at 17:53, David Vrabel <david.vrabel@xxxxxxxxxx> wrote:
>>>> [Resend as requested by Konrad.]
>>>>
>>>> This series of patches allows the vmalloc_sync_all() to be removed
>>>> from alloc_vm_area() by getting the hypervisor to update the PTEs (in
>>>> init_mm) directly rather than having the hypervisor look in the
>>>> current page tables to find the PTEs.
>>>>
>>>> Once the hypervisor has updated the PTEs, the normal mechanism of
>>>> syncing the page tables after a fault works as expected.
>>>
>>> Did you actually test that, and namely the case where alloc_vm_area()
>>> would result in a new top level page directory entry to get populated?
>>>
>>> I cannot see how this new entry would propagate into other mm-s, and
>>> hence I cannot see how you can do away with calling vmalloc_sync_all()
>>> just by changing how leaf page table entries get populated.
>>
>> I don't think this new behaviour of alloc_vm_area() is any different
>> from how a regular vmalloc() works.
> 
> Of course not. Callers of vmalloc() need to use vmalloc_sync_all() too
> before it is permitted to access the allocated space from an NMI
> handler or pass it into a hypercall.

The virtual addresses of the mapped rings are not accessed in an NMI
handler or a hypercall (before this patch set they were accessed in the
GNTTABOP_map_grant_ref hypercall, but no longer).

In the future, if something did want to pass the virtual address to a
hypercall it wouldn't need the vmalloc_sync() as it could disable
preemption, touch the page (so current->active_mm is updated), do the
hypercall, then disable preemption.

>> vmalloc_fault() copies the page table entries from init_mm into the
>> current MM (on 32-bit it calls vmalloc_sync_one() which makes it
>> obviously correct I think).
> 
> No, vmalloc_fault() copies pmd-s (32-bit) or pgd-s (64-bit), but never
> pte-s. Avoiding this to be done in a fault (precisely for the NMI and
> hypercall cases named above) is what vmalloc_sync_all() was
> introduced for (really, the hypercall aspect didn't matter back then,
> and alloc_vm_area() didn't exist outside of Xenolinux then either).
> 
> So eliminating it from alloc_vm_area() just pushes the need to call it
> to all callers that may have the obtained space accessed in NMI
> context (none at present, as only Xen code appears to call this
> function) or want to pass it to a hypercall without running on init_mm.
> 
> Just to repeat the essence of my first reply: Fiddling with how pte-s
> get populated can not possibly eliminate the need to call a function
> that populates top level page directory entries (pmd-s/pgd-s).
> 
> Jan
> 
>>>> This mechanism doesn't currently work on the ia64 port as that does
>>>> not support the GNTMAP_contains_pte flag.
>>>>
>>>> David


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

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