From 4ac9dcdccdcd5664514867bd897ba61b77a204e4 Mon Sep 17 00:00:00 2001 From: Yoshihisa Morizumi Date: Fri, 8 Jan 2021 17:04:43 +0900 Subject: [PATCH] xpmem: Use correct process_vm in xpmem functions This reverts commit 29d27b7c8db6b91dd9c387cbcac8b4ace27c9843. Change-Id: I1863cddcffa67c60e5f93d874447db9919e519dc --- kernel/xpmem.c | 20 ++- test/issues/1259/aarch64_result.log | 184 ++++++++++++++++++++++++++++ test/issues/1259/x86_64_result.log | 178 +++++++++++++++++++++++++++ 3 files changed, 370 insertions(+), 12 deletions(-) create mode 100644 test/issues/1259/aarch64_result.log create mode 100644 test/issues/1259/x86_64_result.log diff --git a/kernel/xpmem.c b/kernel/xpmem.c index 4bde18d3..af17341a 100644 --- a/kernel/xpmem.c +++ b/kernel/xpmem.c @@ -1421,10 +1421,9 @@ static void xpmem_detach_att( XPMEM_DEBUG("call: apid=0x%lx, att=0x%p", ap->apid, att); - XPMEM_DEBUG("detaching current->vm=0x%p, att->vm=0x%p", - (void *)cpu_local_var(current)->vm, (void *)att->vm); + XPMEM_DEBUG("detaching att->vm=0x%p", (void *)att->vm); - vm = cpu_local_var(current)->vm ? cpu_local_var(current)->vm : att->vm; + vm = att->vm; ihk_rwspinlock_read_lock_noirq(&vm->memory_range_lock); @@ -1438,7 +1437,7 @@ static void xpmem_detach_att( } att->flags |= XPMEM_FLAG_DESTROYING; - range = lookup_process_memory_range(cpu_local_var(current)->vm, + range = lookup_process_memory_range(vm, att->at_vaddr, att->at_vaddr + 1); if (!range || range->start > att->at_vaddr) { @@ -1475,8 +1474,7 @@ static void xpmem_detach_att( XPMEM_DEBUG("xpmem_vm_munmap(): start=0x%lx, len=0x%lx", range->start, att->at_size); - ret = xpmem_vm_munmap(cpu_local_var(current)->vm, (void *)range->start, - att->at_size); + ret = xpmem_vm_munmap(vm, (void *)range->start, att->at_size); if (ret) { ekprintf("%s: ERROR: xpmem_vm_munmap() failed %d\n", __FUNCTION__, ret); @@ -1673,8 +1671,7 @@ int xpmem_remove_process_memory_range( xpmem_att_ref(att); - ihk_rwspinlock_read_lock_noirq( - &cpu_local_var(current)->vm->memory_range_lock); + ihk_rwspinlock_read_lock_noirq(&vm->memory_range_lock); mcs_rwlock_writer_lock(&att->at_lock, &at_lock); @@ -1711,7 +1708,7 @@ int xpmem_remove_process_memory_range( else { remaining_vaddr = vmr->end; remaining_vmr = lookup_process_memory_range( - cpu_local_var(current)->vm, remaining_vaddr - 1, + vm, remaining_vaddr - 1, remaining_vaddr); if (!remaining_vmr) { ekprintf("%s: ERROR: vm_range is NULL\n", __FUNCTION__); @@ -1732,7 +1729,7 @@ int xpmem_remove_process_memory_range( } remaining_vmr = lookup_process_memory_range( - cpu_local_var(current)->vm, remaining_vaddr, + vm, remaining_vaddr, remaining_vaddr + 1); if (!remaining_vmr) { ekprintf("%s: ERROR: vm_range is NULL\n", __FUNCTION__); @@ -1756,8 +1753,7 @@ int xpmem_remove_process_memory_range( out: mcs_rwlock_writer_unlock(&att->at_lock, &at_lock); - ihk_rwspinlock_read_unlock_noirq( - &cpu_local_var(current)->vm->memory_range_lock); + ihk_rwspinlock_read_unlock_noirq(&vm->memory_range_lock); xpmem_att_deref(att); diff --git a/test/issues/1259/aarch64_result.log b/test/issues/1259/aarch64_result.log new file mode 100644 index 00000000..adbca9a7 --- /dev/null +++ b/test/issues/1259/aarch64_result.log @@ -0,0 +1,184 @@ +*** C1259T01 start ******************************* +** xpmem_attach to Huge mapped memory range +** end of range is aligned with Large page size +pageshift: 21 +** [ OK ] seg_addr (100000400000) is allocated until xpmem_attach +** [ OK ] xpmem_addr (100000400000) is allocated using large pages +pageshift: 29 +** [ OK ] seg_addr (100020000000) is allocated until xpmem_attach +** [ OK ] xpmem_addr (100020000000) is allocated using large pages +pageshift: 34 +** [ OK ] seg_addr (100400000000) is allocated until xpmem_attach +** [ OK ] xpmem_addr (100400000000) is allocated using large pages +*** C1259T01: PASSED + +*** C1259T02 start ******************************* +** xpmem_attach to Huge mapped memory range +** end of range is NOT aligned with Large page size +pageshift: 21 +** [ OK ] seg_addr (100000400000) is allocated until xpmem_attach +** [ OK ] xpmem_addr (100000400000) is allocated using large pages +pageshift: 29 +** [ OK ] seg_addr (100020000000) is allocated until xpmem_attach +** [ OK ] xpmem_addr (100020000000) is allocated using large pages +pageshift: 34 +** [ OK ] seg_addr (100400000000) is allocated until xpmem_attach +** [ OK ] xpmem_addr (100400000000) is allocated using large pages +*** C1259T02: PASSED + +*** C1259T03 start ******************************* +** xpmem_attach to small mapped memory range +pageshift: small page +** [ OK ] xpmem_addr (100000210000) is allocated using small pages +*** C1259T03: PASSED + +*** C1259T04 start ******************************* +** xpmem_attach to multi pagesize range +pageshift: 21 +** [ OK ] xpmem_addr (100000600000) is allocated using large pages +*** C1259T04: PASSED + +*** C1259T05 start ******************************* +** xpmem testsuite +XPMEM version = 26003 + +==== test_base STARTS ==== +xpmem_proc1: mypid = 38514 +xpmem_proc1: sharing 262144 bytes +xpmem_proc1: segid = 200009672 at 0x100000210000 + +xpmem_proc2: mypid = 38711 +xpmem_proc2: segid = 200009672 +xpmem_proc2: attached at 0x100000210000 +xpmem_proc2: adding 1 to all elems + +xpmem_proc1: verifying data...done +==== test_base PASSED ==== + +==== test_two_attach STARTS ==== +xpmem_proc1: mypid = 39028 +xpmem_proc1: sharing 262144 bytes +xpmem_proc1: segid = 200009874 at 0x100000210000 + +xpmem_proc2: mypid = 39233 +xpmem_proc2: segid = 200009874 +xpmem_proc2: attached at 0x100000210000 +xpmem_proc2: attached at 0x100000250000 +xpmem_proc2: adding 1 to all elems using 0x100000210000 +xpmem_proc2: adding 1 to all elems using 0x100000250000 + +xpmem_proc1: verifying data...done +==== test_two_attach PASSED ==== + +==== test_two_shares STARTS ==== +xpmem_proc1: mypid = 39429 +xpmem_proc1: sharing 2 segments, 262144 bytes each +xpmem_proc1: segid[0] = 200009a05 at 0x100000210000 +xpmem_proc1: segid[1] = 400009a05 at 0x100000250000 + +xpmem_proc2: mypid = 39625 +xpmem_proc2: segid[0] = 200009a05 +xpmem_proc2: segid[1] = 400009a05 +xpmem_proc2: data[0] attached at 0x100000210000 +xpmem_proc2: data[1] attached at 0x100000250000 +xpmem_proc2: adding 1 to all elems using 0x100000210000 +xpmem_proc2: adding 1 to all elems using 0x100000250000 + +xpmem_proc1: verifying data...done +==== test_two_shares PASSED ==== + +==== test_fork STARTS ==== +xpmem_proc1: mypid = 39831 +xpmem_proc1: sharing 262144 bytes +xpmem_proc1: segid = 200009b97 at 0x100000210000 + +xpmem_proc2: mypid = 40027 +xpmem_proc2: segid = 200009b97 +xpmem_proc2: attached at 0x100000220000 +xpmem_proc2: reading to pin pages +xpmem_proc2: waiting for COW... + +xpmem_proc1: forking a child +xpmem_proc1: adding 1 to all elems to induce COW + +xpmem_child: hello from pid 40224 + +xpmem_proc1: give control back to xpmem_proc2 + +xpmem_proc2: adding 1 to all elems + +xpmem_proc1: verifying data...done +==== test_fork PASSED ==== + +*** XTP_001 start *** + [OK] xpmem_make + [OK] xpmem_get + [OK] xpmem_attach + [OK] xpmem_detach + [OK] xpmem_remove +*** XTP_001 PASSED + +*** XTP_002 start *** + [OK] xpmem_make in child + [OK] xpmem_get in child + [OK] xpmem_attach in child + [OK] xpmem_detach in child + [OK] xpmem_remove in child +*** XTP_002 PASSED + +*** XTP_003 start *** + [OK] xpmem_make + [OK] xpmem_get in child + [OK] xpmem_attach in child + [OK] xpmem_detach in child + [OK] validate TEST_VAL + [OK] xpmem_remove +*** XTP_003 PASSED + +*** XTP_004 start *** + [OK] xpmem_make + [OK] xpmem_get in child + [OK] xpmem_attach in child + [OK] xpmem_detach in child + [OK] validate TEST_VAL + [OK] xpmem_remove +*** XTP_004 PASSED + +*** XTP_005 start *** + [OK] xpmem_make + [OK] xpmem_get in child + [OK] xpmem_attach in child + [OK] validate TEST_VAL + [OK] xpmem_remove +*** XTP_005 PASSED + +*** XTP_006 start *** + [OK] xpmem_make + [OK] xpmem_get in child failed (parent process exited already +*** XTP_006 PASSED + +*** XTP_007 start *** + [OK] xpmem_make failed (invalid address) + [OK] xpmem_make succeed(do twice to same address) +*** XTP_007 PASSED + +*** XTP_008 start *** + [OK] xpmem_get in child failed (invalid segid) + [OK] xpmem_get in child (do twice to same segid +*** XTP_008 PASSED + +*** XTP_009 start *** + [OK] xpmem_attach in childi failed (invalid apid) + [OK] xpmem_attach in child succeed (do twice to same apid) +*** XTP_009 PASSED + +*** XTP_010 start *** + [OK] xpmem_detach in child succeed (invalid address) + [OK] xpmem_detach in child succeed (do twice to same address) +*** XTP_010 PASSED + +*** XTP_011 start *** + [OK] xpmem_remove failed (invalid segid) + [OK] xpmem_remove failed (do twice to same segid) +*** XTP_011 PASSED + diff --git a/test/issues/1259/x86_64_result.log b/test/issues/1259/x86_64_result.log new file mode 100644 index 00000000..2308bd3d --- /dev/null +++ b/test/issues/1259/x86_64_result.log @@ -0,0 +1,178 @@ +*** C1259T01 start ******************************* +** xpmem_attach to Huge mapped memory range +** end of range is aligned with Large page size +pageshift: 21 +** [ OK ] seg_addr (2aaaab000000) is allocated until xpmem_attach +** [ OK ] xpmem_addr (2aaaab000000) is allocated using large pages +pageshift: 30 +** [ OK ] seg_addr (2aaac0000000) is allocated until xpmem_attach +** [ OK ] xpmem_addr (2aaac0000000) is allocated using large pages +*** C1259T01: PASSED + +*** C1259T02 start ******************************* +** xpmem_attach to Huge mapped memory range +** end of range is NOT aligned with Large page size +pageshift: 21 +** [ OK ] seg_addr (2aaaab000000) is allocated until xpmem_attach +** [ OK ] xpmem_addr (2aaaab000000) is allocated using large pages +pageshift: 30 +** [ OK ] seg_addr (2aaac0000000) is allocated until xpmem_attach +** [ OK ] xpmem_addr (2aaac0000000) is allocated using large pages +*** C1259T02: PASSED + +*** C1259T03 start ******************************* +** xpmem_attach to small mapped memory range +pageshift: small page +** [ OK ] xpmem_addr (2aaaaafee000) is allocated using small pages +*** C1259T03: PASSED + +*** C1259T04 start ******************************* +** xpmem_attach to multi pagesize range +pageshift: 21 +** [ OK ] xpmem_addr (2aaaab200000) is allocated using large pages +*** C1259T04: PASSED + +*** C1259T05 start ******************************* +** xpmem testsuite +XPMEM version = 26003 + +==== test_base STARTS ==== +xpmem_proc1: mypid = 20070 +xpmem_proc1: sharing 16384 bytes +xpmem_proc1: segid = 200004e66 at 0x2aaaaafee000 + +xpmem_proc2: mypid = 20490 +xpmem_proc2: segid = 200004e66 +xpmem_proc2: attached at 0x2aaaaafee000 +xpmem_proc2: adding 1 to all elems + +xpmem_proc1: verifying data...done +==== test_base PASSED ==== + +==== test_two_attach STARTS ==== +xpmem_proc1: mypid = 20913 +xpmem_proc1: sharing 16384 bytes +xpmem_proc1: segid = 2000051b1 at 0x2aaaaafee000 + +xpmem_proc2: mypid = 21336 +xpmem_proc2: segid = 2000051b1 +xpmem_proc2: attached at 0x2aaaaafee000 +xpmem_proc2: attached at 0x2aaaaaff2000 +xpmem_proc2: adding 1 to all elems using 0x2aaaaafee000 +xpmem_proc2: adding 1 to all elems using 0x2aaaaaff2000 + +xpmem_proc1: verifying data...done +==== test_two_attach PASSED ==== + +==== test_two_shares STARTS ==== +xpmem_proc1: mypid = 21758 +xpmem_proc1: sharing 2 segments, 16384 bytes each +xpmem_proc1: segid[0] = 2000054fe at 0x2aaaaafee000 +xpmem_proc1: segid[1] = 4000054fe at 0x2aaaaaff2000 + +xpmem_proc2: mypid = 22179 +xpmem_proc2: segid[0] = 2000054fe +xpmem_proc2: segid[1] = 4000054fe +xpmem_proc2: data[0] attached at 0x2aaaaafee000 +xpmem_proc2: data[1] attached at 0x2aaaaaff2000 +xpmem_proc2: adding 1 to all elems using 0x2aaaaafee000 +xpmem_proc2: adding 1 to all elems using 0x2aaaaaff2000 + +xpmem_proc1: verifying data...done +==== test_two_shares PASSED ==== + +==== test_fork STARTS ==== +xpmem_proc1: mypid = 22599 +xpmem_proc1: sharing 16384 bytes +xpmem_proc1: segid = 200005847 at 0x2aaaaafee000 + +xpmem_proc2: mypid = 23022 +xpmem_proc2: segid = 200005847 +xpmem_proc2: attached at 0x2aaaaafef000 +xpmem_proc2: reading to pin pages +xpmem_proc2: waiting for COW... + +xpmem_proc1: forking a child +xpmem_proc1: adding 1 to all elems to induce COW + +xpmem_proc1: give control back to xpmem_proc2 +xpmem_child: hello from pid 23443 + + +xpmem_proc2: adding 1 to all elems + +xpmem_proc1: verifying data...done +==== test_fork PASSED ==== + +*** XTP_001 start *** + [OK] xpmem_make + [OK] xpmem_get + [OK] xpmem_attach + [OK] xpmem_detach + [OK] xpmem_remove +*** XTP_001 PASSED + +*** XTP_002 start *** + [OK] xpmem_make in child + [OK] xpmem_get in child + [OK] xpmem_attach in child + [OK] xpmem_detach in child + [OK] xpmem_remove in child +*** XTP_002 PASSED + +*** XTP_003 start *** + [OK] xpmem_make + [OK] xpmem_get in child + [OK] xpmem_attach in child + [OK] xpmem_detach in child + [OK] validate TEST_VAL + [OK] xpmem_remove +*** XTP_003 PASSED + +*** XTP_004 start *** + [OK] xpmem_make + [OK] xpmem_get in child + [OK] xpmem_attach in child + [OK] xpmem_detach in child + [OK] validate TEST_VAL + [OK] xpmem_remove +*** XTP_004 PASSED + +*** XTP_005 start *** + [OK] xpmem_make + [OK] xpmem_get in child + [OK] xpmem_attach in child + [OK] validate TEST_VAL + [OK] xpmem_remove +*** XTP_005 PASSED + +*** XTP_006 start *** + [OK] xpmem_make + [OK] xpmem_get in child failed (parent process exited already +*** XTP_006 PASSED + +*** XTP_007 start *** + [OK] xpmem_make failed (invalid address) + [OK] xpmem_make succeed(do twice to same address) +*** XTP_007 PASSED + +*** XTP_008 start *** + [OK] xpmem_get in child failed (invalid segid) + [OK] xpmem_get in child (do twice to same segid +*** XTP_008 PASSED + +*** XTP_009 start *** + [OK] xpmem_attach in childi failed (invalid apid) + [OK] xpmem_attach in child succeed (do twice to same apid) +*** XTP_009 PASSED + +*** XTP_010 start *** + [OK] xpmem_detach in child succeed (invalid address) + [OK] xpmem_detach in child succeed (do twice to same address) +*** XTP_010 PASSED + +*** XTP_011 start *** + [OK] xpmem_remove failed (invalid segid) + [OK] xpmem_remove failed (do twice to same segid) +*** XTP_011 PASSED +