ContiguousPTE[3/12] modify move_pte_range

Change-Id: I20878c97bea768d1f09ab0580d744a58c070be2c
This commit is contained in:
TOIDA,Suguru
2018-11-30 09:18:01 +09:00
committed by Masamichi Takagi
parent b6de164e9a
commit 639d0e496b

View File

@ -2601,7 +2601,7 @@ static int move_one_page(void *arg0, page_table_t pt, pte_t *ptep,
{
int error;
struct move_args *args = arg0;
const size_t pgsize = (size_t)1 << pgshift;
size_t pgsize = (size_t)1 << pgshift;
uintptr_t dest;
pte_t apte;
uintptr_t phys;
@ -2621,6 +2621,20 @@ static int move_one_page(void *arg0, page_table_t pt, pte_t *ptep,
apte = PTE_NULL;
pte_xchg(ptep, &apte);
// check attributes before clearing to PTE_NULL
if (pte_is_contiguous(&apte)) {
// check if ptep is an entry of contiguous pte head
if (page_is_contiguous_head(ptep, pgsize)) {
int level = pgsize_to_tbllv(pgsize);
pgsize = tbllv_to_contpgsize(level);
pgshift = tbllv_to_contpgshift(level);
} else {
error = 0;
goto out;
}
}
phys = apte & PT_PHYSMASK;
attr = apte & ~PT_PHYSMASK;
@ -2645,6 +2659,8 @@ int move_pte_range(page_table_t pt, struct process_vm *vm,
{
int error;
struct move_args args;
pte_t *ptep;
size_t pgsize;
dkprintf("move_pte_range(%p,%p,%p,%#lx)\n", pt, src, dest, size);
args.src = (uintptr_t)src;
@ -2652,6 +2668,28 @@ int move_pte_range(page_table_t pt, struct process_vm *vm,
args.vm = vm;
args.range = range;
ptep = ihk_mc_pt_lookup_pte(pt, src, 0, NULL, &pgsize, NULL);
if (ptep && pte_is_contiguous(ptep)) {
if (!page_is_contiguous_head(ptep, pgsize)) {
// start pte is not contiguous head
error = split_contiguous_pages(ptep, pgsize);
if (error) {
goto out;
}
}
}
ptep = ihk_mc_pt_lookup_pte(pt, src + size - 1, 0, NULL, &pgsize, NULL);
if (ptep && pte_is_contiguous(ptep)) {
if (!page_is_contiguous_tail(ptep, pgsize)) {
// end pte is not contiguous tail
error = split_contiguous_pages(ptep, pgsize);
if (error) {
goto out;
}
}
}
error = visit_pte_range(pt, src, src+size, 0, VPTEF_SKIP_NULL,
&move_one_page, &args);
flush_tlb(); /* XXX: TLB flush */