|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH RFC 18/55] x86/mm: switch to new APIs in modify_xen_mappings
On Thu, 2019-02-07 at 16:44 +0000, Wei Liu wrote:
> Page tables allocated in that function should be mapped and unmapped
> now.
>
> Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx>
> ---
> xen/arch/x86/mm.c | 31 ++++++++++++++++++++++---------
> 1 file changed, 22 insertions(+), 9 deletions(-)
>
> diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
> index 1ea2974c1f..18c7b43705 100644
> --- a/xen/arch/x86/mm.c
> +++ b/xen/arch/x86/mm.c
> @@ -5436,6 +5436,7 @@ int modify_xen_mappings(unsigned long s,
> unsigned long e, unsigned int nf)
> if ( l3e_get_flags(*pl3e) & _PAGE_PSE )
> {
> l2_pgentry_t *l2t;
> + mfn_t mfn;
nit: I wouldn't mind if these scoped mfns were caled l2t_mfn / l1t_mfn
in this patch, too.
>
> if ( l2_table_offset(v) == 0 &&
> l1_table_offset(v) == 0 &&
> @@ -5452,13 +5453,15 @@ int modify_xen_mappings(unsigned long s,
> unsigned long e, unsigned int nf)
> }
>
> /* PAGE1GB: shatter the superpage and fall through. */
> - l2t = alloc_xen_pagetable();
> - if ( !l2t )
> + mfn = alloc_xen_pagetable_new();
> + if ( mfn_eq(mfn, INVALID_MFN) )
> {
> ASSERT(rc == -ENOMEM);
> goto out;
> }
>
> + l2t = map_xen_pagetable_new(mfn);
Is map_xen_pagetable always guaranteed to succeed on a valid mfn (also
in the future)? Otherwise the validity check should be done on l2t as
before instead of mfn. But it looks like map_xen_pagetable{_new} does
not deal with invalid mfns.
> +
> for ( i = 0; i < L2_PAGETABLE_ENTRIES; i++ )
> l2e_write(l2t + i,
> l2e_from_pfn(l3e_get_pfn(*pl3e) +
> @@ -5469,14 +5472,17 @@ int modify_xen_mappings(unsigned long s,
> unsigned long e, unsigned int nf)
> if ( (l3e_get_flags(*pl3e) & _PAGE_PRESENT) &&
> (l3e_get_flags(*pl3e) & _PAGE_PSE) )
> {
> - l3e_write_atomic(pl3e,
> l3e_from_mfn(virt_to_mfn(l2t),
> - __PAGE_HYPERVISO
> R));
> + l3e_write_atomic(pl3e, l3e_from_mfn(mfn,
> __PAGE_HYPERVISOR));
> + UNMAP_XEN_PAGETABLE_NEW(l2t);
> l2t = NULL;
That NULL assignment is redundant now. It's done by the UNMAP macro.
> }
> if ( locking )
> spin_unlock(&map_pgdir_lock);
> if ( l2t )
> - free_xen_pagetable(l2t);
> + {
> + UNMAP_XEN_PAGETABLE_NEW(l2t);
> + free_xen_pagetable_new(mfn);
> + }
> }
>
> /*
> @@ -5511,15 +5517,18 @@ int modify_xen_mappings(unsigned long s,
> unsigned long e, unsigned int nf)
> else
> {
> l1_pgentry_t *l1t;
> + mfn_t mfn;
>
> /* PSE: shatter the superpage and try again. */
> - l1t = alloc_xen_pagetable();
> - if ( !l1t )
> + mfn = alloc_xen_pagetable_new();
> + if ( mfn_eq(mfn, INVALID_MFN) )
> {
> ASSERT(rc == -ENOMEM);
> goto out;
> }
>
> + l1t = map_xen_pagetable_new(mfn);
> +
> for ( i = 0; i < L1_PAGETABLE_ENTRIES; i++ )
> l1e_write(&l1t[i],
> l1e_from_pfn(l2e_get_pfn(*pl2e) + i,
> @@ -5529,14 +5538,18 @@ int modify_xen_mappings(unsigned long s,
> unsigned long e, unsigned int nf)
> if ( (l2e_get_flags(*pl2e) & _PAGE_PRESENT) &&
> (l2e_get_flags(*pl2e) & _PAGE_PSE) )
> {
> - l2e_write_atomic(pl2e,
> l2e_from_mfn(virt_to_mfn(l1t),
> + l2e_write_atomic(pl2e, l2e_from_mfn(mfn,
> __PAGE_HYPER
> VISOR));
> + UNMAP_XEN_PAGETABLE_NEW(l1t);
> l1t = NULL;
> }
> if ( locking )
> spin_unlock(&map_pgdir_lock);
> if ( l1t )
> - free_xen_pagetable(l1t);
> + {
> + UNMAP_XEN_PAGETABLE_NEW(l1t);
> + free_xen_pagetable_new(mfn);
> + }
> }
> }
> else
Amazon Development Center Germany GmbH
Krausenstr. 38
10117 Berlin
Geschaeftsfuehrer: Christian Schlaeger, Ralf Herbrich
Ust-ID: DE 289 237 879
Eingetragen am Amtsgericht Charlottenburg HRB 149173 B
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |