|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v6 09/15] efi: use new page table APIs in copy_mapping
On 24.04.2020 16:09, Hongyan Xia wrote:
> --- a/xen/common/efi/boot.c
> +++ b/xen/common/efi/boot.c
> @@ -1454,16 +1454,20 @@ static __init void copy_mapping(unsigned long mfn,
> unsigned long end,
> continue;
> if ( !(l4e_get_flags(l4e) & _PAGE_PRESENT) )
> {
> - l3dst = alloc_xen_pagetable();
> - BUG_ON(!l3dst);
> + mfn_t l3mfn = alloc_xen_pagetable_new();
> +
> + BUG_ON(mfn_eq(l3mfn, INVALID_MFN));
> + l3dst = map_domain_page(l3mfn);
> clear_page(l3dst);
> efi_l4_pgtable[l4_table_offset(mfn << PAGE_SHIFT)] =
> - l4e_from_paddr(virt_to_maddr(l3dst), __PAGE_HYPERVISOR);
> + l4e_from_mfn(l3mfn, __PAGE_HYPERVISOR);
> }
> else
> - l3dst = l4e_to_l3e(l4e);
> - l3src = l4e_to_l3e(idle_pg_table[l4_table_offset(va)]);
> + l3dst = map_l3t_from_l4e(l4e);
> + l3src = map_l3t_from_l4e(idle_pg_table[l4_table_offset(va)]);
> l3dst[l3_table_offset(mfn << PAGE_SHIFT)] =
> l3src[l3_table_offset(va)];
> + unmap_domain_page(l3src);
> + unmap_domain_page(l3dst);
> }
> }
This looks very inefficient - you establish and tear down two mappings
per loop iteration, when really you may end up copying all 512 slots
between the same pair of L3 tables.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |