xpmem: fault stack area of remote process if VM range doesn't yet exist
Change-Id: I2bbb745cc9b79ab4f9ea81b242f35f1b88ad531e
This commit is contained in:
committed by
Masamichi Takagi
parent
a82d161be8
commit
c7145c4b38
@ -2056,6 +2056,7 @@ static int xpmem_pin_page(
|
|||||||
|
|
||||||
XPMEM_DEBUG("call: tgid=%d, vaddr=0x%lx", tg->tgid, vaddr);
|
XPMEM_DEBUG("call: tgid=%d, vaddr=0x%lx", tg->tgid, vaddr);
|
||||||
|
|
||||||
|
retry:
|
||||||
ihk_rwspinlock_read_lock_noirq(&src_vm->memory_range_lock);
|
ihk_rwspinlock_read_lock_noirq(&src_vm->memory_range_lock);
|
||||||
|
|
||||||
range = lookup_process_memory_range(src_vm, vaddr, vaddr + 1);
|
range = lookup_process_memory_range(src_vm, vaddr, vaddr + 1);
|
||||||
@ -2063,6 +2064,20 @@ static int xpmem_pin_page(
|
|||||||
ihk_rwspinlock_read_unlock_noirq(&src_vm->memory_range_lock);
|
ihk_rwspinlock_read_unlock_noirq(&src_vm->memory_range_lock);
|
||||||
|
|
||||||
if (!range || range->start > vaddr) {
|
if (!range || range->start > vaddr) {
|
||||||
|
/*
|
||||||
|
* Grow the stack if address falls into stack region
|
||||||
|
* so that we can lookup range successfully.
|
||||||
|
*/
|
||||||
|
if (src_vm->region.stack_start <= vaddr &&
|
||||||
|
src_vm->region.stack_end > vaddr) {
|
||||||
|
if (page_fault_process_vm(src_vm, (void *)vaddr,
|
||||||
|
PF_POPULATE | PF_WRITE | PF_USER) < 0) {
|
||||||
|
return -ENOENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
goto retry;
|
||||||
|
}
|
||||||
|
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user