mcctrl: use zap_page_range() instead of madvise()

This commit is contained in:
NAKAMURA Gou
2016-02-24 21:14:48 +09:00
parent a713c2fcaa
commit 2601d8a36f
3 changed files with 19 additions and 12 deletions

View File

@@ -202,6 +202,7 @@ AC_DEFUN([MCCTRL_FIND_KSYM],[
MCCTRL_FIND_KSYM([sys_mount]) MCCTRL_FIND_KSYM([sys_mount])
MCCTRL_FIND_KSYM([sys_unshare]) MCCTRL_FIND_KSYM([sys_unshare])
MCCTRL_FIND_KSYM([zap_page_range])
AC_SUBST(CC) AC_SUBST(CC)
AC_SUBST(XCC) AC_SUBST(XCC)

View File

@@ -44,6 +44,7 @@
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/delay.h> #include <asm/delay.h>
#include <asm/io.h> #include <asm/io.h>
#include "config.h"
#include "mcctrl.h" #include "mcctrl.h"
#include <linux/version.h> #include <linux/version.h>
@@ -57,6 +58,17 @@
#define dprintk(...) #define dprintk(...)
#endif #endif
#ifdef MCCTRL_KSYM_zap_page_range
static void
(*mcctrl_zap_page_range)(struct vm_area_struct *vma, unsigned long start,
unsigned long size, struct zap_details *details)
#if MCCTRL_KSYM_zap_page_range
= (void *)MCCTRL_KSYM_zap_page_range;
#else
= &zap_page_range;
#endif
#endif
static long pager_call(ihk_os_t os, struct syscall_request *req); static long pager_call(ihk_os_t os, struct syscall_request *req);
#ifdef SC_DEBUG #ifdef SC_DEBUG
@@ -1516,6 +1528,10 @@ static int clear_pte_range(uintptr_t start, uintptr_t len)
} }
if (addr < end) { if (addr < end) {
error = zap_vma_ptes(vma, addr, end-addr); error = zap_vma_ptes(vma, addr, end-addr);
if (error) {
mcctrl_zap_page_range(vma, addr, end-addr, NULL);
error = 0;
}
if (ret == 0) { if (ret == 0) {
ret = error; ret = error;
} }
@@ -1663,12 +1679,7 @@ int __do_in_kernel_syscall(ihk_os_t os, struct mcctrl_channel *c, struct syscall
ppd->pid, ppd->rpgtable); ppd->pid, ppd->rpgtable);
} }
error = clear_pte_range(sc->args[0], sc->args[1]); ret = clear_pte_range(sc->args[0], sc->args[1]);
if (error) {
error = -ENOSYS;
goto out;
}
ret = 0;
break; break;
case __NR_mprotect: case __NR_mprotect:

View File

@@ -1842,17 +1842,12 @@ 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);
SET_ERR(ret);
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]);