use madvise() when zap_vma_ptes() fails

This commit is contained in:
NAKAMURA Gou
2014-08-07 12:31:48 +09:00
parent b4910ec33f
commit 8c1c8a40d1
2 changed files with 19 additions and 8 deletions

View File

@ -1138,13 +1138,16 @@ out:
return (IS_ERR_VALUE(map))? (int)map: 0; return (IS_ERR_VALUE(map))? (int)map: 0;
} }
static void clear_pte_range(uintptr_t start, uintptr_t len) static int clear_pte_range(uintptr_t start, uintptr_t len)
{ {
struct mm_struct *mm = current->mm; struct mm_struct *mm = current->mm;
struct vm_area_struct *vma; struct vm_area_struct *vma;
uintptr_t addr; uintptr_t addr;
uintptr_t end; uintptr_t end;
int error;
int ret;
ret = 0;
down_read(&mm->mmap_sem); down_read(&mm->mmap_sem);
addr = start; addr = start;
while (addr < (start + len)) { while (addr < (start + len)) {
@ -1161,14 +1164,15 @@ static void clear_pte_range(uintptr_t start, uintptr_t len)
end = vma->vm_end; end = vma->vm_end;
} }
if (addr < end) { if (addr < end) {
zap_vma_ptes(vma, addr, end-addr); error = zap_vma_ptes(vma, addr, end-addr);
dprintk("clear_pte_range() 0x%lx - 0x%lx OK\n", if (ret == 0) {
vma->vm_start, vma->vm_end); ret = error;
}
} }
addr = end; addr = end;
} }
up_read(&mm->mmap_sem); up_read(&mm->mmap_sem);
return; return ret;
} }
/** /**
@ -1306,8 +1310,11 @@ int __do_in_kernel_syscall(ihk_os_t os, struct mcctrl_channel *c, struct syscall
ppd->pid, ppd->rpgtable); ppd->pid, ppd->rpgtable);
} }
clear_pte_range(sc->args[0], sc->args[1]); error = clear_pte_range(sc->args[0], sc->args[1]);
ret = 0; if (error) {
error = -ENOSYS;
goto out;
}
break; break;
case __NR_mprotect: case __NR_mprotect:

View File

@ -1157,12 +1157,16 @@ int main_loop(int fd, int cpu, pthread_mutex_t *lock)
return w.sr.args[0]; return w.sr.args[0];
case __NR_mmap: case __NR_mmap:
case __NR_munmap:
case __NR_mprotect: case __NR_mprotect:
/* reserved for internal use */ /* reserved for internal use */
do_syscall_return(fd, cpu, -ENOSYS, 0, 0, 0, 0); do_syscall_return(fd, cpu, -ENOSYS, 0, 0, 0, 0);
break; break;
case __NR_munmap:
ret = madvise((void *)w.sr.args[0], w.sr.args[1], MADV_DONTNEED);
do_syscall_return(fd, cpu, ret, 0, 0, 0, 0);
break;
#ifdef USE_SYSCALL_MOD_CALL #ifdef USE_SYSCALL_MOD_CALL
case 303:{ case 303:{
__dprintf("mcexec.c,mod_cal,mod=%ld,cmd=%ld\n", w.sr.args[0], w.sr.args[1]); __dprintf("mcexec.c,mod_cal,mod=%ld,cmd=%ld\n", w.sr.args[0], w.sr.args[1]);