diff --git a/kernel/host.c b/kernel/host.c index c84cbeae..e78c5295 100644 --- a/kernel/host.c +++ b/kernel/host.c @@ -132,7 +132,8 @@ int prepare_process_ranges_args_envs(struct thread *thread, } up = virt_to_phys(up_v); - if (add_process_memory_range(vm, s, e, up, flags, NULL, 0) != 0) { + if (add_process_memory_range(vm, s, e, up, flags, NULL, 0, + PAGE_SHIFT) != 0) { ihk_mc_free_pages(up_v, range_npages); kprintf("ERROR: adding memory range for ELF section %i\n", i); goto err; @@ -211,7 +212,7 @@ int prepare_process_ranges_args_envs(struct thread *thread, args_envs_p = virt_to_phys(args_envs); if(add_process_memory_range(vm, addr, e, args_envs_p, - flags, NULL, 0) != 0){ + flags, NULL, 0, PAGE_SHIFT) != 0){ ihk_mc_free_pages(args_envs, ARGENV_PAGE_COUNT); kprintf("ERROR: adding memory range for args/envs\n"); goto err; diff --git a/kernel/include/process.h b/kernel/include/process.h index 8a4cb5a5..d5b170ab 100644 --- a/kernel/include/process.h +++ b/kernel/include/process.h @@ -298,6 +298,8 @@ struct vm_range { unsigned long flag; struct memobj *memobj; off_t objoff; + int pgshift; /* page size. 0 means THP */ + int padding; }; struct vm_regions { @@ -588,7 +590,7 @@ int populate_process_memory(struct process_vm *vm, void *start, size_t len); int add_process_memory_range(struct process_vm *vm, unsigned long start, unsigned long end, unsigned long phys, unsigned long flag, - struct memobj *memobj, off_t objoff); + struct memobj *memobj, off_t objoff, int pgshift); int remove_process_memory_range(struct process_vm *vm, unsigned long start, unsigned long end, int *ro_freedp); int split_process_memory_range(struct process_vm *vm, diff --git a/kernel/process.c b/kernel/process.c index e5818657..70f9d3d1 100644 --- a/kernel/process.c +++ b/kernel/process.c @@ -983,7 +983,8 @@ enum ihk_mc_pt_attribute common_vrflag_to_ptattr(unsigned long flag, uint64_t fa int add_process_memory_range(struct process_vm *vm, unsigned long start, unsigned long end, unsigned long phys, unsigned long flag, - struct memobj *memobj, off_t offset) + struct memobj *memobj, off_t offset, + int pgshift) { struct vm_range *range; int rc; @@ -1011,6 +1012,7 @@ int add_process_memory_range(struct process_vm *vm, range->flag = flag; range->memobj = memobj; range->objoff = offset; + range->pgshift = pgshift; if(range->flag & VR_DEMAND_PAGING) { dkprintf("range: 0x%lX - 0x%lX => physicall memory area is allocated on demand (%ld) [%lx]\n", @@ -1756,7 +1758,7 @@ int init_process_stack(struct thread *thread, struct program_load_desc *pn, vrflag |= VR_MAXPROT_READ | VR_MAXPROT_WRITE | VR_MAXPROT_EXEC; #define NOPHYS ((uintptr_t)-1) if ((rc = add_process_memory_range(thread->vm, start, end, NOPHYS, - vrflag, NULL, 0)) != 0) { + vrflag, NULL, 0, PAGE_SHIFT)) != 0) { return rc; } @@ -1869,7 +1871,8 @@ unsigned long extend_process_region(struct process_vm *vm, return end; } if((rc = add_process_memory_range(vm, old_aligned_end, - aligned_end, virt_to_phys(p), flag)) != 0){ + aligned_end, virt_to_phys(p), flag, + LARGE_PAGE_SHIFT)) != 0){ free_pages(p, (aligned_end - old_aligned_end) >> PAGE_SHIFT); return end; } @@ -1899,7 +1902,7 @@ unsigned long extend_process_region(struct process_vm *vm, if((rc = add_process_memory_range(vm, aligned_end, aligned_new_end, virt_to_phys((void *)p_aligned), - flag)) != 0){ + flag, LARGE_PAGE_SHIFT)) != 0){ free_pages(p, (aligned_new_end - aligned_end + LARGE_PAGE_SIZE) >> PAGE_SHIFT); return end; } @@ -1925,7 +1928,8 @@ unsigned long extend_process_region(struct process_vm *vm, } } if((rc = add_process_memory_range(vm, aligned_end, aligned_new_end, - (p==0?0:virt_to_phys(p)), flag, NULL, 0)) != 0){ + (p==0?0:virt_to_phys(p)), flag, NULL, 0, + PAGE_SHIFT)) != 0){ free_pages(p, (aligned_new_end - aligned_end) >> PAGE_SHIFT); return end; } diff --git a/kernel/syscall.c b/kernel/syscall.c index efbc0dbf..ae328363 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -1117,7 +1117,8 @@ do_mmap(const intptr_t addr0, const size_t len0, const int prot, } vrflags |= VRFLAG_PROT_TO_MAXPROT(PROT_TO_VR_FLAG(maxprot)); - error = add_process_memory_range(thread->vm, addr, addr+len, phys, vrflags, memobj, off); + error = add_process_memory_range(thread->vm, addr, addr+len, phys, + vrflags, memobj, off, PAGE_SHIFT); if (error) { ekprintf("do_mmap:add_process_memory_range" "(%p,%lx,%lx,%lx,%lx) failed %d\n", @@ -3756,7 +3757,8 @@ SYSCALL_DECLARE(shmat) memobj_ref(&obj->memobj); - error = add_process_memory_range(thread->vm, addr, addr+len, -1, vrflags, &obj->memobj, 0); + error = add_process_memory_range(thread->vm, addr, addr+len, -1, + vrflags, &obj->memobj, 0, PAGE_SHIFT); if (error) { if (!(prot & PROT_WRITE)) { (void)set_host_vma(addr, len, PROT_READ|PROT_WRITE); @@ -6457,7 +6459,8 @@ SYSCALL_DECLARE(mremap) } error = add_process_memory_range(thread->vm, newstart, newend, -1, range->flag, range->memobj, - range->objoff + (oldstart - range->start)); + range->objoff + (oldstart - range->start), + range->pgshift); if (error) { ekprintf("sys_mremap(%#lx,%#lx,%#lx,%#x,%#lx):" "add failed. %d\n",