From c7145c4b38e09de4d1fa8086c98323e64ba42028 Mon Sep 17 00:00:00 2001 From: Balazs Gerofi Date: Sun, 14 Feb 2021 20:42:18 +0900 Subject: [PATCH] xpmem: fault stack area of remote process if VM range doesn't yet exist Change-Id: I2bbb745cc9b79ab4f9ea81b242f35f1b88ad531e --- kernel/xpmem.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/kernel/xpmem.c b/kernel/xpmem.c index b50e7c7b..3a3525b0 100644 --- a/kernel/xpmem.c +++ b/kernel/xpmem.c @@ -2056,6 +2056,7 @@ static int xpmem_pin_page( XPMEM_DEBUG("call: tgid=%d, vaddr=0x%lx", tg->tgid, vaddr); +retry: ihk_rwspinlock_read_lock_noirq(&src_vm->memory_range_lock); 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); 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; }