use madvise() when zap_vma_ptes() fails
This commit is contained in:
@ -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:
|
||||||
|
|||||||
@ -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]);
|
||||||
|
|||||||
Reference in New Issue
Block a user