diff --git a/configure.ac b/configure.ac index f5cce81e..cc9b2431 100644 --- a/configure.ac +++ b/configure.ac @@ -202,6 +202,7 @@ AC_DEFUN([MCCTRL_FIND_KSYM],[ MCCTRL_FIND_KSYM([sys_mount]) MCCTRL_FIND_KSYM([sys_unshare]) +MCCTRL_FIND_KSYM([zap_page_range]) AC_SUBST(CC) AC_SUBST(XCC) diff --git a/executer/kernel/mcctrl/syscall.c b/executer/kernel/mcctrl/syscall.c index 598840a3..631b635d 100644 --- a/executer/kernel/mcctrl/syscall.c +++ b/executer/kernel/mcctrl/syscall.c @@ -44,6 +44,7 @@ #include #include #include +#include "config.h" #include "mcctrl.h" #include @@ -57,6 +58,17 @@ #define dprintk(...) #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); #ifdef SC_DEBUG @@ -1516,6 +1528,10 @@ static int clear_pte_range(uintptr_t start, uintptr_t len) } if (addr < end) { error = zap_vma_ptes(vma, addr, end-addr); + if (error) { + mcctrl_zap_page_range(vma, addr, end-addr, NULL); + error = 0; + } if (ret == 0) { 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); } - error = clear_pte_range(sc->args[0], sc->args[1]); - if (error) { - error = -ENOSYS; - goto out; - } - ret = 0; + ret = clear_pte_range(sc->args[0], sc->args[1]); break; case __NR_mprotect: diff --git a/executer/user/mcexec.c b/executer/user/mcexec.c index b2ce1e1e..fb8f0a2d 100644 --- a/executer/user/mcexec.c +++ b/executer/user/mcexec.c @@ -1842,17 +1842,12 @@ int main_loop(int fd, int cpu, pthread_mutex_t *lock) return w.sr.args[0]; case __NR_mmap: + case __NR_munmap: case __NR_mprotect: /* reserved for internal use */ do_syscall_return(fd, cpu, -ENOSYS, 0, 0, 0, 0); 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 case 303:{ __dprintf("mcexec.c,mod_cal,mod=%ld,cmd=%ld\n", w.sr.args[0], w.sr.args[1]);