shmobj: Support large page

Mixing page sizes is allowed by shmobj.

Change-Id: Ic48b71da2db6ce3f68fa3dbc8ad5ae96347d6018
Refs: #1381
Refs: #1458
This commit is contained in:
Ken Sato
2020-01-15 15:45:17 +09:00
committed by Masamichi Takagi
parent 4b66373813
commit 9a60997ea0
32 changed files with 2212 additions and 75 deletions

View File

@ -884,7 +884,7 @@ static int split_large_page(pte_t *ptep, size_t pgsize)
}
for (i = 0; i < PT_ENTRIES; ++i) {
if (phys_base != NOPHYS) {
if (phys_base != NOPHYS && pgsize != PTL2_SIZE) {
phys = phys_base + (i * pgsize / PT_ENTRIES);
page = phys_to_page(phys);
if (page) {
@ -2219,7 +2219,8 @@ out:
return error;
}
int ihk_mc_pt_split(page_table_t pt, struct process_vm *vm, void *addr)
int ihk_mc_pt_split(page_table_t pt, struct process_vm *vm,
struct vm_range *range, void *addr)
{
int error;
pte_t *ptep;
@ -2228,7 +2229,6 @@ int ihk_mc_pt_split(page_table_t pt, struct process_vm *vm, void *addr)
intptr_t phys;
struct page *page;
retry:
ptep = ihk_mc_pt_lookup_pte(pt, addr, 0, &pgaddr, &pgsize, NULL);
if (ptep && !pte_is_null(ptep) && (pgaddr != addr)) {
@ -2237,8 +2237,8 @@ retry:
phys = pte_get_phys(ptep);
page = phys_to_page(phys);
}
if (page && (page_is_in_memobj(page)
|| page_is_multi_mapped(page))) {
if (!is_splitable(page, range->memobj ?
range->memobj->flags : 0)) {
error = -EINVAL;
kprintf("ihk_mc_pt_split:NYI:page break down\n");
goto out;
@ -3001,3 +3001,10 @@ int patch_process_vm(struct process_vm *vm, void *udst, const void *ksrc, size_t
dkprintf("patch_process_vm(%p,%p,%p,%lx):%d\n", vm, udst, ksrc, siz, 0);
return 0;
} /* patch_process_vm() */
int split_contiguous_pages(pte_t *ptep, size_t pgsize,
uint32_t memobj_flags)
{
return 0;
}