diff --git a/arch/x86/kernel/syscall.c b/arch/x86/kernel/syscall.c index cf74dcec..af309ba5 100644 --- a/arch/x86/kernel/syscall.c +++ b/arch/x86/kernel/syscall.c @@ -1741,7 +1741,8 @@ int arch_map_vdso(struct process_vm *vm) vrflags = VR_REMOTE; vrflags |= VR_PROT_READ | VR_PROT_EXEC; vrflags |= VRFLAG_PROT_TO_MAXPROT(vrflags); - error = add_process_memory_range(vm, (intptr_t)s, (intptr_t)e, NOPHYS, vrflags, NULL, 0, PAGE_SHIFT); + error = add_process_memory_range(vm, (intptr_t)s, (intptr_t)e, + NOPHYS, vrflags, NULL, 0, PAGE_SHIFT, NULL); if (error) { ekprintf("ERROR: adding memory range for vdso. %d\n", error); goto out; @@ -1772,7 +1773,8 @@ int arch_map_vdso(struct process_vm *vm) vrflags = VR_REMOTE; vrflags |= VR_PROT_READ; vrflags |= VRFLAG_PROT_TO_MAXPROT(vrflags); - error = add_process_memory_range(vm, (intptr_t)s, (intptr_t)e, NOPHYS, vrflags, NULL, 0, PAGE_SHIFT); + error = add_process_memory_range(vm, (intptr_t)s, (intptr_t)e, + NOPHYS, vrflags, NULL, 0, PAGE_SHIFT, NULL); if (error) { ekprintf("ERROR: adding memory range for vvar. %d\n", error); goto out; diff --git a/kernel/host.c b/kernel/host.c index c1092026..f23438c1 100644 --- a/kernel/host.c +++ b/kernel/host.c @@ -125,7 +125,7 @@ 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, - PAGE_SHIFT) != 0) { + PAGE_SHIFT, NULL) != 0) { ihk_mc_free_pages(up_v, range_npages); kprintf("ERROR: adding memory range for ELF section %i\n", i); goto err; @@ -213,7 +213,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, PAGE_SHIFT) != 0){ + flags, NULL, 0, PAGE_SHIFT, NULL) != 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 57acdb27..dad51722 100644 --- a/kernel/include/process.h +++ b/kernel/include/process.h @@ -716,9 +716,10 @@ void free_process_memory_ranges(struct process_vm *vm); 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, int pgshift); + unsigned long start, unsigned long end, + unsigned long phys, unsigned long flag, + struct memobj *memobj, off_t offset, + int pgshift, struct vm_range **rp); 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 49325edc..59ee4aff 100644 --- a/kernel/process.c +++ b/kernel/process.c @@ -1018,21 +1018,18 @@ 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, - int pgshift) + unsigned long start, unsigned long end, + unsigned long phys, unsigned long flag, + struct memobj *memobj, off_t offset, + int pgshift, struct vm_range **rp) { struct vm_range *range; int rc; -#if 0 - extern void __host_update_process_range(struct thread *process, - struct vm_range *range); -#endif if ((start < vm->region.user_start) || (vm->region.user_end < end)) { - kprintf("range(%#lx - %#lx) is not in user avail(%#lx - %#lx)\n", + kprintf("%s: error: range %lx - %lx is not in user available area\n", + __FUNCTION__, start, end, vm->region.user_start, vm->region.user_end); return -EINVAL; @@ -1040,9 +1037,10 @@ int add_process_memory_range(struct process_vm *vm, range = kmalloc(sizeof(struct vm_range), IHK_MC_AP_NOWAIT); if (!range) { - kprintf("ERROR: allocating pages for range\n"); + kprintf("%s: ERROR: allocating pages for range\n", __FUNCTION__); return -ENOMEM; } + INIT_LIST_HEAD(&range->list); range->start = start; range->end = end; @@ -1051,48 +1049,34 @@ int add_process_memory_range(struct process_vm *vm, 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", - range->start, range->end, range->end - range->start, - range->flag); - } else { - dkprintf("range: 0x%lX - 0x%lX (%ld) [%lx]\n", - range->start, range->end, range->end - range->start, - range->flag); - } - - rc = 0; - if (0) { - /* dummy */ - } - else if (phys == NOPHYS) { - /* nothing to map */ - } - else if (flag & VR_REMOTE) { + rc = 0; + if (phys == NOPHYS) { + /* Nothing to map */ + } + else if (flag & VR_REMOTE) { rc = update_process_page_table(vm, range, phys, IHK_PTA_REMOTE); - } else if (flag & VR_IO_NOCACHE) { + } + else if (flag & VR_IO_NOCACHE) { rc = update_process_page_table(vm, range, phys, PTATTR_UNCACHABLE); - } else if(flag & VR_DEMAND_PAGING){ - //demand paging no need to update process table now - dkprintf("demand paging do not update process page table\n"); - rc = 0; - } else if ((range->flag & VR_PROT_MASK) == VR_PROT_NONE) { + } + else if (flag & VR_DEMAND_PAGING) { + dkprintf("%s: range: 0x%lx - 0x%lx is demand paging\n", + __FUNCTION__, range->start, range->end); rc = 0; - } else { + } + else if ((range->flag & VR_PROT_MASK) == VR_PROT_NONE) { + rc = 0; + } + else { rc = update_process_page_table(vm, range, phys, 0); } - if(rc != 0){ - kprintf("ERROR: preparing page tables\n"); + + if (rc != 0) { + kprintf("%s: ERROR: preparing page tables\n", __FUNCTION__); kfree(range); return rc; } -#if 0 // disable __host_update_process_range() in add_process_memory_range(), because it has no effect on the actual mapping on the MICs side. - if (!(flag & VR_REMOTE)) { - __host_update_process_range(process, range); - } -#endif - insert_vm_range_list(vm, range); /* Clear content! */ @@ -1101,6 +1085,11 @@ int add_process_memory_range(struct process_vm *vm, memset((void*)phys_to_virt(phys), 0, end - start); } + /* Return range object if requested */ + if (rp) { + *rp = range; + } + return 0; } @@ -1870,7 +1859,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, PAGE_SHIFT)) != 0) { + vrflag, NULL, 0, PAGE_SHIFT, NULL)) != 0) { return rc; } @@ -1989,7 +1978,7 @@ unsigned long extend_process_region(struct process_vm *vm, } if((rc = add_process_memory_range(vm, old_aligned_end, aligned_end, virt_to_phys(p), flag, - LARGE_PAGE_SHIFT)) != 0){ + LARGE_PAGE_SHIFT, NULL)) != 0){ ihk_mc_free_pages(p, (aligned_end - old_aligned_end) >> PAGE_SHIFT); return end; } @@ -2019,7 +2008,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, LARGE_PAGE_SHIFT)) != 0){ + flag, LARGE_PAGE_SHIFT, NULL)) != 0){ ihk_mc_free_pages(p, (aligned_new_end - aligned_end + LARGE_PAGE_SIZE) >> PAGE_SHIFT); return end; } @@ -2044,9 +2033,9 @@ unsigned long extend_process_region(struct process_vm *vm, return end; } } - if((rc = add_process_memory_range(vm, aligned_end, aligned_new_end, - (p==0?0:virt_to_phys(p)), flag, NULL, 0, - PAGE_SHIFT)) != 0){ + if ((rc = add_process_memory_range(vm, aligned_end, aligned_new_end, + (p == 0 ? 0 : virt_to_phys(p)), flag, NULL, 0, + PAGE_SHIFT, NULL)) != 0) { ihk_mc_free_pages(p, (aligned_new_end - aligned_end) >> PAGE_SHIFT); return end; } diff --git a/kernel/syscall.c b/kernel/syscall.c index 5de03fc0..c219989c 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -1355,7 +1355,7 @@ 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, pgshift); + vrflags, memobj, off, pgshift, NULL); if (error) { kprintf("%s: add_process_memory_range failed for 0x%lx:%lu" " flags: %lx, vrflags: %lx, pgshift: %d, error: %d\n", @@ -4343,7 +4343,7 @@ SYSCALL_DECLARE(shmat) memobj_ref(&obj->memobj); error = add_process_memory_range(vm, addr, addr+len, -1, - vrflags, &obj->memobj, 0, obj->pgshift); + vrflags, &obj->memobj, 0, obj->pgshift, NULL); if (error) { if (!(prot & PROT_WRITE)) { (void)set_host_vma(addr, len, PROT_READ|PROT_WRITE); @@ -7103,7 +7103,7 @@ SYSCALL_DECLARE(mremap) error = add_process_memory_range(thread->vm, newstart, newend, -1, range->flag, range->memobj, range->objoff + (oldstart - range->start), - range->pgshift); + range->pgshift, NULL); if (error) { ekprintf("sys_mremap(%#lx,%#lx,%#lx,%#x,%#lx):" "add failed. %d\n",