uti: Clear user space PTEs after first fork in create_tracer()
Change-Id: I60755f0cb5e84c3a5a5cd91515411a30f0995822
This commit is contained in:
@ -2517,14 +2517,19 @@ err:
|
||||
return 0;
|
||||
}
|
||||
|
||||
long mcexec_unmap_pseudo_filemap(ihk_os_t os, struct file *file)
|
||||
static long mcexec_release_user_space(struct release_user_space_desc *__user arg)
|
||||
{
|
||||
long rc = -1;
|
||||
struct mcos_handler_info *info;
|
||||
info = ihk_os_get_mcos_private_data(file);
|
||||
dprintk("%s: clear_pte_range %p-%p\n", __FUNCTION__, (void*)info->user_start, (void*)info->user_end);
|
||||
rc = clear_pte_range(info->user_start, info->user_end - info->user_start);
|
||||
return rc;
|
||||
struct release_user_space_desc desc;
|
||||
|
||||
if (copy_from_user(&desc, arg, sizeof(desc))) {
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
#if 1
|
||||
return clear_pte_range(desc.user_start, desc.user_end - desc.user_start);
|
||||
#else
|
||||
return release_user_space(desc.user_start, desc.user_end - desc.user_start);
|
||||
#endif
|
||||
}
|
||||
|
||||
static long (*mckernel_do_futex)(int n, unsigned long arg0, unsigned long arg1,
|
||||
@ -3017,8 +3022,8 @@ long __mcctrl_control(ihk_os_t os, unsigned int req, unsigned long arg,
|
||||
case MCEXEC_UP_TERMINATE_THREAD:
|
||||
return mcexec_terminate_thread(os, (unsigned long *)arg, file);
|
||||
|
||||
case MCEXEC_UP_UNMAP_PSEUDO_FILEMAP:
|
||||
return mcexec_unmap_pseudo_filemap(os, file);
|
||||
case MCEXEC_UP_RELEASE_USER_SPACE:
|
||||
return mcexec_release_user_space((struct release_user_space_desc *)arg);
|
||||
|
||||
case MCEXEC_UP_GET_NUM_POOL_THREADS:
|
||||
return mcctrl_get_num_pool_threads(os);
|
||||
|
||||
@ -90,7 +90,7 @@ static struct ihk_os_user_call_handler mcctrl_uchs[] = {
|
||||
{ .request = MCEXEC_UP_TERMINATE_THREAD, .func = mcctrl_ioctl },
|
||||
{ .request = MCEXEC_UP_GET_NUM_POOL_THREADS, .func = mcctrl_ioctl },
|
||||
{ .request = MCEXEC_UP_UTI_ATTR, .func = mcctrl_ioctl },
|
||||
{ .request = MCEXEC_UP_UNMAP_PSEUDO_FILEMAP, .func = mcctrl_ioctl },
|
||||
{ .request = MCEXEC_UP_RELEASE_USER_SPACE, .func = mcctrl_ioctl },
|
||||
{ .request = MCEXEC_UP_DEBUG_LOG, .func = mcctrl_ioctl },
|
||||
{ .request = IHK_OS_AUX_PERF_NUM, .func = mcctrl_ioctl },
|
||||
{ .request = IHK_OS_AUX_PERF_SET, .func = mcctrl_ioctl },
|
||||
|
||||
@ -539,6 +539,7 @@ struct vdso {
|
||||
|
||||
int reserve_user_space(struct mcctrl_usrdata *usrdata, unsigned long *startp,
|
||||
unsigned long *endp);
|
||||
int release_user_space(uintptr_t start, uintptr_t len);
|
||||
void get_vdso_info(ihk_os_t os, long vdso_pa);
|
||||
int arch_symbols_init(void);
|
||||
|
||||
|
||||
@ -2028,6 +2028,43 @@ int clear_pte_range(uintptr_t start, uintptr_t len)
|
||||
return ret;
|
||||
}
|
||||
|
||||
int release_user_space(uintptr_t start, uintptr_t len)
|
||||
{
|
||||
struct mm_struct *mm = current->mm;
|
||||
struct vm_area_struct *vma;
|
||||
uintptr_t addr;
|
||||
uintptr_t end;
|
||||
int error;
|
||||
int ret;
|
||||
|
||||
ret = 0;
|
||||
//down_read(&mm->mmap_sem);
|
||||
addr = start;
|
||||
while (addr < (start + len)) {
|
||||
vma = find_vma(mm, addr);
|
||||
if (!vma) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (addr < vma->vm_start) {
|
||||
addr = vma->vm_start;
|
||||
}
|
||||
|
||||
end = vma->vm_end;
|
||||
if (addr < end) {
|
||||
if ((error = vm_munmap(addr, end - addr))) {
|
||||
printk("%s: ERROR: vm_munmap failed (%d)\n", __func__, error);
|
||||
}
|
||||
if (ret == 0) {
|
||||
ret = error;
|
||||
}
|
||||
}
|
||||
addr = vma->vm_end;
|
||||
}
|
||||
//up_read(&mm->mmap_sem);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Write out the core file image to a core file.
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user