add host PTE cleaning to execve(). refs #377
This removes a cause of LTP gethostid01's wrong behavior.
This commit is contained in:
@@ -1672,6 +1672,34 @@ found:
|
|||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void munmap_all(void)
|
||||||
|
{
|
||||||
|
struct process *proc = cpu_local_var(current);
|
||||||
|
struct process_vm *vm = proc->vm;
|
||||||
|
struct vm_range *range;
|
||||||
|
struct vm_range *next;
|
||||||
|
void *addr;
|
||||||
|
size_t size;
|
||||||
|
int error;
|
||||||
|
|
||||||
|
ihk_mc_spinlock_lock_noirq(&vm->memory_range_lock);
|
||||||
|
list_for_each_entry_safe(range, next, &vm->vm_range_list, list) {
|
||||||
|
addr = (void *)range->start;
|
||||||
|
size = range->end - range->start;
|
||||||
|
error = do_munmap(addr, size);
|
||||||
|
if (error) {
|
||||||
|
kprintf("munmap_all():do_munmap(%p,%lx) failed. %d\n",
|
||||||
|
addr, size, error);
|
||||||
|
/* through */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ihk_mc_spinlock_unlock_noirq(&vm->memory_range_lock);
|
||||||
|
|
||||||
|
/* free vm_ranges which do_munmap() failed to remove. */
|
||||||
|
free_process_memory_ranges(proc);
|
||||||
|
return;
|
||||||
|
} /* munmap_all() */
|
||||||
|
|
||||||
SYSCALL_DECLARE(execve)
|
SYSCALL_DECLARE(execve)
|
||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
@@ -1749,7 +1777,7 @@ SYSCALL_DECLARE(execve)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Unmap all memory areas of the process, userspace will be gone */
|
/* Unmap all memory areas of the process, userspace will be gone */
|
||||||
free_process_memory_ranges(cpu_local_var(current));
|
munmap_all();
|
||||||
|
|
||||||
ihk_mc_init_user_process(&cpu_local_var(current)->ctx,
|
ihk_mc_init_user_process(&cpu_local_var(current)->ctx,
|
||||||
&cpu_local_var(current)->uctx,
|
&cpu_local_var(current)->uctx,
|
||||||
|
|||||||
Reference in New Issue
Block a user