mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
No need to pin/unpin intermediate pagetables in x86/64 xenlinux.
Signed-off-by: Keir Fraser <keir@xensource.com>
This commit is contained in:
1 parent
f48224b208
commit
1e0419bfee
4 files changed
-69
No files matched your search
@@ -201,56 +201,6 @@ void xen_pgd_unpin(unsigned long ptr)
|
||||
BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
|
||||
}
|
||||
|
||||
void xen_pte_pin(unsigned long ptr)
|
||||
{
|
||||
struct mmuext_op op;
|
||||
op.cmd = MMUEXT_PIN_L1_TABLE;
|
||||
op.arg1.mfn = pfn_to_mfn(ptr >> PAGE_SHIFT);
|
||||
BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
|
||||
}
|
||||
|
||||
void xen_pte_unpin(unsigned long ptr)
|
||||
{
|
||||
struct mmuext_op op;
|
||||
op.cmd = MMUEXT_UNPIN_TABLE;
|
||||
op.arg1.mfn = pfn_to_mfn(ptr >> PAGE_SHIFT);
|
||||
BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
void xen_pud_pin(unsigned long ptr)
|
||||
{
|
||||
struct mmuext_op op;
|
||||
op.cmd = MMUEXT_PIN_L3_TABLE;
|
||||
op.arg1.mfn = pfn_to_mfn(ptr >> PAGE_SHIFT);
|
||||
BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
|
||||
}
|
||||
|
||||
void xen_pud_unpin(unsigned long ptr)
|
||||
{
|
||||
struct mmuext_op op;
|
||||
op.cmd = MMUEXT_UNPIN_TABLE;
|
||||
op.arg1.mfn = pfn_to_mfn(ptr >> PAGE_SHIFT);
|
||||
BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
|
||||
}
|
||||
|
||||
void xen_pmd_pin(unsigned long ptr)
|
||||
{
|
||||
struct mmuext_op op;
|
||||
op.cmd = MMUEXT_PIN_L2_TABLE;
|
||||
op.arg1.mfn = pfn_to_mfn(ptr >> PAGE_SHIFT);
|
||||
BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
|
||||
}
|
||||
|
||||
void xen_pmd_unpin(unsigned long ptr)
|
||||
{
|
||||
struct mmuext_op op;
|
||||
op.cmd = MMUEXT_UNPIN_TABLE;
|
||||
op.arg1.mfn = pfn_to_mfn(ptr >> PAGE_SHIFT);
|
||||
BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
|
||||
}
|
||||
#endif /* CONFIG_X86_64 */
|
||||
|
||||
void xen_set_ldt(unsigned long ptr, unsigned long len)
|
||||
{
|
||||
struct mmuext_op op;
|
||||
|
||||
@@ -244,7 +244,6 @@ static void set_pte_phys(unsigned long vaddr,
|
||||
if (pud_none(*pud)) {
|
||||
pmd = (pmd_t *) spp_getpage();
|
||||
make_page_readonly(pmd, XENFEAT_writable_page_tables);
|
||||
xen_pmd_pin(__pa(pmd));
|
||||
set_pud(pud, __pud(__pa(pmd) | _KERNPG_TABLE | _PAGE_USER));
|
||||
if (pmd != pmd_offset(pud, 0)) {
|
||||
printk("PAGETABLE BUG #01! %p <-> %p\n", pmd, pmd_offset(pud,0));
|
||||
@@ -255,7 +254,6 @@ static void set_pte_phys(unsigned long vaddr,
|
||||
if (pmd_none(*pmd)) {
|
||||
pte = (pte_t *) spp_getpage();
|
||||
make_page_readonly(pte, XENFEAT_writable_page_tables);
|
||||
xen_pte_pin(__pa(pte));
|
||||
set_pmd(pmd, __pmd(__pa(pte) | _KERNPG_TABLE | _PAGE_USER));
|
||||
if (pte != pte_offset_kernel(pmd, 0)) {
|
||||
printk("PAGETABLE BUG #02!\n");
|
||||
@@ -297,7 +295,6 @@ static void set_pte_phys_ma(unsigned long vaddr,
|
||||
|
||||
pmd = (pmd_t *) spp_getpage();
|
||||
make_page_readonly(pmd, XENFEAT_writable_page_tables);
|
||||
xen_pmd_pin(__pa(pmd));
|
||||
|
||||
set_pud(pud, __pud(__pa(pmd) | _KERNPG_TABLE | _PAGE_USER));
|
||||
|
||||
@@ -311,7 +308,6 @@ static void set_pte_phys_ma(unsigned long vaddr,
|
||||
if (pmd_none(*pmd)) {
|
||||
pte = (pte_t *) spp_getpage();
|
||||
make_page_readonly(pte, XENFEAT_writable_page_tables);
|
||||
xen_pte_pin(__pa(pte));
|
||||
|
||||
set_pmd(pmd, __pmd(__pa(pte) | _KERNPG_TABLE | _PAGE_USER));
|
||||
if (pte != pte_offset_kernel(pmd, 0)) {
|
||||
@@ -461,7 +457,6 @@ phys_pmd_init(pmd_t *pmd, unsigned long address, unsigned long end)
|
||||
}
|
||||
pte = pte_save;
|
||||
early_make_page_readonly(pte, XENFEAT_writable_page_tables);
|
||||
xen_pte_pin(pte_phys);
|
||||
set_pmd(pmd, __pmd(pte_phys | _KERNPG_TABLE));
|
||||
}
|
||||
}
|
||||
@@ -500,7 +495,6 @@ static void __meminit phys_pud_init(pud_t *pud, unsigned long address, unsigned
|
||||
|
||||
pmd = alloc_static_page(&pmd_phys);
|
||||
early_make_page_readonly(pmd, XENFEAT_writable_page_tables);
|
||||
xen_pmd_pin(pmd_phys);
|
||||
spin_lock(&init_mm.page_table_lock);
|
||||
set_pud(pud, __pud(pmd_phys | _KERNPG_TABLE));
|
||||
phys_pmd_init(pmd, paddr, end);
|
||||
@@ -545,9 +539,6 @@ void __init xen_init_pt(void)
|
||||
|
||||
xen_pgd_pin(__pa_symbol(init_level4_pgt));
|
||||
xen_pgd_pin(__pa_symbol(init_level4_user_pgt));
|
||||
xen_pud_pin(__pa_symbol(level3_kernel_pgt));
|
||||
xen_pud_pin(__pa_symbol(level3_user_pgt));
|
||||
xen_pmd_pin(__pa_symbol(level2_kernel_pgt));
|
||||
|
||||
set_pgd((pgd_t *)(init_level4_user_pgt + 511),
|
||||
mk_kernel_pgd(__pa_symbol(level3_user_pgt)));
|
||||
@@ -581,7 +572,6 @@ void __init extend_init_mapping(void)
|
||||
pte_page = alloc_static_page(&phys);
|
||||
early_make_page_readonly(
|
||||
pte_page, XENFEAT_writable_page_tables);
|
||||
xen_pte_pin(phys);
|
||||
set_pmd(pmd, __pmd(phys | _KERNPG_TABLE | _PAGE_USER));
|
||||
} else {
|
||||
addr = page[pmd_index(va)];
|
||||
@@ -662,7 +652,6 @@ void __meminit init_memory_mapping(unsigned long start, unsigned long end)
|
||||
pud = alloc_static_page(&pud_phys);
|
||||
early_make_page_readonly(pud, XENFEAT_writable_page_tables);
|
||||
}
|
||||
xen_pud_pin(pud_phys);
|
||||
next = start + PGDIR_SIZE;
|
||||
if (next > end)
|
||||
next = end;
|
||||
@@ -943,7 +932,6 @@ void free_initmem(void)
|
||||
ClearPageReserved(virt_to_page(addr));
|
||||
set_page_count(virt_to_page(addr), 1);
|
||||
memset((void *)(addr & ~(PAGE_SIZE-1)), 0xcc, PAGE_SIZE);
|
||||
xen_pte_unpin(__pa(addr));
|
||||
make_page_writable(
|
||||
__va(__pa(addr)), XENFEAT_writable_page_tables);
|
||||
/*
|
||||
|
||||
@@ -79,12 +79,6 @@ void xen_l3_entry_update(pud_t *ptr, pud_t val); /* x86_64/PAE */
|
||||
void xen_l4_entry_update(pgd_t *ptr, pgd_t val); /* x86_64 only */
|
||||
void xen_pgd_pin(unsigned long ptr);
|
||||
void xen_pgd_unpin(unsigned long ptr);
|
||||
void xen_pud_pin(unsigned long ptr); /* x86_64 only */
|
||||
void xen_pud_unpin(unsigned long ptr); /* x86_64 only */
|
||||
void xen_pmd_pin(unsigned long ptr); /* x86_64 only */
|
||||
void xen_pmd_unpin(unsigned long ptr); /* x86_64 only */
|
||||
void xen_pte_pin(unsigned long ptr);
|
||||
void xen_pte_unpin(unsigned long ptr);
|
||||
|
||||
void xen_set_ldt(unsigned long ptr, unsigned long bytes);
|
||||
void xen_machphys_update(unsigned long mfn, unsigned long pfn);
|
||||
|
||||
@@ -181,7 +181,6 @@ static inline struct page *pte_alloc_one(struct mm_struct *mm, unsigned long add
|
||||
static inline void pte_free_kernel(pte_t *pte)
|
||||
{
|
||||
BUG_ON((unsigned long)pte & (PAGE_SIZE-1));
|
||||
xen_pte_unpin(__pa(pte));
|
||||
make_page_writable(pte, XENFEAT_writable_page_tables);
|
||||
free_page((unsigned long)pte);
|
||||
}
|
||||
|
||||