|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v6 03/15] x86/mm: rewrite virt_to_xen_l*e
On 24.04.2020 16:08, Hongyan Xia wrote:
> @@ -4998,31 +5005,40 @@ static l2_pgentry_t *virt_to_xen_l2e(unsigned long v)
> if ( !(l3e_get_flags(*pl3e) & _PAGE_PRESENT) )
> {
> bool locking = system_state > SYS_STATE_boot;
> - l2_pgentry_t *l2t = alloc_xen_pagetable();
> + l2_pgentry_t *l2t;
> + mfn_t l2mfn = alloc_xen_pagetable_new();
>
> - if ( !l2t )
> + if ( mfn_eq(l2mfn, INVALID_MFN) )
> + {
> + UNMAP_DOMAIN_PAGE(pl3e);
> return NULL;
> + }
> + l2t = map_domain_page(l2mfn);
> clear_page(l2t);
> + UNMAP_DOMAIN_PAGE(l2t);
> if ( locking )
> spin_lock(&map_pgdir_lock);
> if ( !(l3e_get_flags(*pl3e) & _PAGE_PRESENT) )
> {
> - l3e_write(pl3e, l3e_from_paddr(__pa(l2t), __PAGE_HYPERVISOR));
> - l2t = NULL;
> + l3e_write(pl3e, l3e_from_mfn(l2mfn, __PAGE_HYPERVISOR));
> + l2mfn = INVALID_MFN;
> }
> if ( locking )
> spin_unlock(&map_pgdir_lock);
> - if ( l2t )
> - free_xen_pagetable(l2t);
> + free_xen_pagetable_new(l2mfn);
> }
>
> BUG_ON(l3e_get_flags(*pl3e) & _PAGE_PSE);
> - return l3e_to_l2e(*pl3e) + l2_table_offset(v);
> + pl2e = map_l2t_from_l3e(*pl3e) + l2_table_offset(v);
> + unmap_domain_page(pl3e);
To avoid undue pressure on the number of active mappings I'd like
to ask that you unmap first, then establish the new mapping.
> @@ -5095,6 +5119,10 @@ int map_pages_to_xen(
>
> while ( nr_mfns != 0 )
> {
> + /* Clean up mappings mapped in the previous iteration. */
> + UNMAP_DOMAIN_PAGE(pl3e);
> + UNMAP_DOMAIN_PAGE(pl2e);
> +
> pl3e = virt_to_xen_l3e(virt);
As you don't add a comment here (and at other call sites of
virt_to_xen_l<N>e()), ...
> @@ -5260,9 +5288,12 @@ int map_pages_to_xen(
> /* Normal page mapping. */
> if ( !(l2e_get_flags(*pl2e) & _PAGE_PRESENT) )
> {
> + /* This forces the mapping to be populated. */
> pl1e = virt_to_xen_l1e(virt);
... I don't see why one needs adding here.
> --- a/xen/include/asm-x86/page.h
> +++ b/xen/include/asm-x86/page.h
> @@ -291,7 +291,13 @@ void copy_page_sse2(void *, const void *);
> #define pfn_to_paddr(pfn) __pfn_to_paddr(pfn)
> #define paddr_to_pfn(pa) __paddr_to_pfn(pa)
> #define paddr_to_pdx(pa) pfn_to_pdx(paddr_to_pfn(pa))
> -#define vmap_to_mfn(va) _mfn(l1e_get_pfn(*virt_to_xen_l1e((unsigned
> long)(va))))
> +
> +#define vmap_to_mfn(va) ({ \
> + const l1_pgentry_t *pl1e_ = virt_to_xen_l1e((unsigned long)(va)); \
> + unsigned long pfn_ = l1e_get_pfn(*pl1e_); \
l1e_get_mfn()?
> + unmap_domain_page(pl1e_); \
> + _mfn(pfn_); })
> +
> #define vmap_to_page(va) mfn_to_page(vmap_to_mfn(va))
>
> #endif /* !defined(__ASSEMBLY__) */
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |