From a1490da1123367dd41b6d566f3530201f7d4707a Mon Sep 17 00:00:00 2001 From: "Masamichi Takagi m-takagi@ab.jp.nec.com" Date: Mon, 26 Nov 2012 13:38:07 +0900 Subject: [PATCH] Revert "make munmap free physical pages, and one correction for aligned mmap in syscall.c (extend_process_region is called with memory-region start-address which is aligned (map_end_aligned), instead of tail-address of current-region (region->map_end)) for aligned mmap (in syscall.c)" This reverts commit e7317cca98d74c63456b4a72eba896ef42e25413. --- kernel/include/page.h | 1 - kernel/include/process.h | 4 ++-- kernel/mem.c | 6 ------ kernel/process.c | 19 ++++++------------- kernel/syscall.c | 14 +++++--------- 5 files changed, 13 insertions(+), 31 deletions(-) diff --git a/kernel/include/page.h b/kernel/include/page.h index b7b6354c..41b456d7 100644 --- a/kernel/include/page.h +++ b/kernel/include/page.h @@ -2,7 +2,6 @@ #define __HEADER_PAGE_H void *allocate_pages(int npages, enum aal_mc_ap_flag flag); -void free_pages_pa(unsigned long pa, int npages); void free_pages(void *va, int npages); #endif diff --git a/kernel/include/process.h b/kernel/include/process.h index 4bd14ed8..f1bbf217 100644 --- a/kernel/include/process.h +++ b/kernel/include/process.h @@ -92,8 +92,8 @@ int add_process_memory_range(struct process *process, int add_process_large_range(struct process *process, unsigned long start, unsigned long end, unsigned long flag, unsigned long *phys); -int remove_process_region(struct process *proc, unsigned long va_start, unsigned long va_end, unsigned long pa); - +int remove_process_region(struct process *proc, + unsigned long start, unsigned long end); struct program_load_desc; void init_process_stack(struct process *process, struct program_load_desc *pn, int argc, char **argv, diff --git a/kernel/mem.c b/kernel/mem.c index e4863117..44487d81 100644 --- a/kernel/mem.c +++ b/kernel/mem.c @@ -40,12 +40,6 @@ void *allocate_pages(int npages, enum aal_mc_ap_flag flag) return pa ? phys_to_virt(pa) : 0; } -void free_pages_pa(unsigned long pa, int npages) -{ - kprintf("mem.c,free_pages_pa,pa=%lx\n", pa); - aal_pagealloc_free(pa_allocator, pa, npages); -} - void free_pages(void *va, int npages) { aal_pagealloc_free(pa_allocator, virt_to_phys(va), npages); diff --git a/kernel/process.c b/kernel/process.c index a3efedce..f283bb6d 100644 --- a/kernel/process.c +++ b/kernel/process.c @@ -286,29 +286,22 @@ unsigned long extend_process_region(struct process *proc, return address; } -int remove_process_region(struct process *proc, unsigned long va_start, unsigned long va_end, unsigned long pa) +int remove_process_region(struct process *proc, + unsigned long start, unsigned long end) { unsigned long flags; - if ((va_start & (PAGE_SIZE - 1)) || (va_end & (PAGE_SIZE - 1))) { + if ((start & (PAGE_SIZE - 1)) || (end & (PAGE_SIZE - 1))) { return -EINVAL; } flags = aal_mc_spinlock_lock(&proc->vm->page_table_lock); /* We defer freeing to the time of exit */ - unsigned long va = va_start; - while (va < va_end) { - aal_mc_pt_clear_page(proc->vm->page_table, (void *)va); - va += PAGE_SIZE; + while (start < end) { + aal_mc_pt_clear_page(proc->vm->page_table, (void *)start); + start += PAGE_SIZE; } aal_mc_spinlock_unlock(&proc->vm->page_table_lock, flags); - // we skip freeing "range" - -#if 1 - kprintf("process.c,free_pages,pa=%lx,start=%lx,end=%lx\n", pa, va_start, va_end); - free_pages_pa(pa, (va_end - va_start) / PAGE_SIZE); -#endif - return 0; } diff --git a/kernel/syscall.c b/kernel/syscall.c index b89582d8..c472a30c 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -411,7 +411,7 @@ SYSCALL_DECLARE(mmap) region->map_end = extend_process_region(cpu_local_var(current), region->map_start, - map_end_aligned, + region->map_end, s + len); aal_mc_spinlock_unlock(&cpu_local_var(current)->vm->memory_range_lock, flags); // kprintf("syscall.c,mmap,map_end=%lx,s+len=%lx\n", region->map_end, s+len); @@ -457,17 +457,13 @@ SYSCALL_DECLARE(mmap) SYSCALL_DECLARE(munmap) { - unsigned long va, pa, len; - int r; + unsigned long address, len; - va = aal_mc_syscall_arg0(ctx); + address = aal_mc_syscall_arg0(ctx); len = aal_mc_syscall_arg1(ctx); - if(aal_mc_pt_virt_to_phys(cpu_local_var(current)->vm->page_table, (void *)va, &pa)) { - return -EFAULT; - } - r = remove_process_region(cpu_local_var(current), va, va + len, pa); - return r; + return remove_process_region(cpu_local_var(current), address, + address + len); } SYSCALL_DECLARE(mprotect)