mcctrl: use zap_page_range() instead of madvise()
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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]);
|
||||||
|
|||||||
Reference in New Issue
Block a user