From d052acab1dbbfb4c2f1180f0248ce935b86aa47b Mon Sep 17 00:00:00 2001 From: Ken Sato Date: Tue, 12 Nov 2019 15:18:52 +0900 Subject: [PATCH] xpmem: Fix deadlock in xpmem_remove_process_memory_range() Refs: #1330 Change-Id: Ib62e3a7fe2811577ba8cabf174f64827e65c422c --- kernel/xpmem.c | 4 - test/issues/1330/README | 22 ++++ test/issues/1330/aarch64_result.log | 151 ++++++++++++++++++++++++++++ test/issues/1330/x86_64_result.log | 151 ++++++++++++++++++++++++++++ test/xpmem/README | 71 +++++++++++++ test/xpmem/XTP_001.c | 60 +++++++++++ test/xpmem/XTP_002.c | 76 ++++++++++++++ test/xpmem/XTP_003.c | 79 +++++++++++++++ test/xpmem/XTP_004.c | 112 +++++++++++++++++++++ test/xpmem/XTP_005.c | 76 ++++++++++++++ test/xpmem/XTP_006.c | 64 ++++++++++++ test/xpmem/XTP_007.c | 78 ++++++++++++++ test/xpmem/XTP_901.c | 89 ++++++++++++++++ test/xpmem/XTP_902.c | 89 ++++++++++++++++ test/xpmem/XTP_903.c | 92 +++++++++++++++++ test/xpmem/XTP_904.c | 90 +++++++++++++++++ test/xpmem/XTP_905.c | 88 ++++++++++++++++ test/xpmem/go_test.sh | 36 +++++++ test/xpmem/mc_run.sh | 15 +++ test/xpmem/util.h | 31 ++++++ 20 files changed, 1470 insertions(+), 4 deletions(-) create mode 100644 test/issues/1330/README create mode 100644 test/issues/1330/aarch64_result.log create mode 100644 test/issues/1330/x86_64_result.log create mode 100644 test/xpmem/README create mode 100644 test/xpmem/XTP_001.c create mode 100644 test/xpmem/XTP_002.c create mode 100644 test/xpmem/XTP_003.c create mode 100644 test/xpmem/XTP_004.c create mode 100644 test/xpmem/XTP_005.c create mode 100644 test/xpmem/XTP_006.c create mode 100644 test/xpmem/XTP_007.c create mode 100644 test/xpmem/XTP_901.c create mode 100644 test/xpmem/XTP_902.c create mode 100644 test/xpmem/XTP_903.c create mode 100644 test/xpmem/XTP_904.c create mode 100644 test/xpmem/XTP_905.c create mode 100755 test/xpmem/go_test.sh create mode 100755 test/xpmem/mc_run.sh create mode 100644 test/xpmem/util.h diff --git a/kernel/xpmem.c b/kernel/xpmem.c index 71e3b584..dafd17f2 100644 --- a/kernel/xpmem.c +++ b/kernel/xpmem.c @@ -1662,8 +1662,6 @@ int xpmem_remove_process_memory_range( xpmem_att_ref(att); - ihk_mc_spinlock_lock_noirq(&vm->memory_range_lock); - mcs_rwlock_writer_lock(&att->at_lock, &at_lock); if (att->flags & XPMEM_FLAG_DESTROYING) { @@ -1742,8 +1740,6 @@ int xpmem_remove_process_memory_range( out: mcs_rwlock_writer_unlock(&att->at_lock, &at_lock); - ihk_mc_spinlock_unlock_noirq(&vm->memory_range_lock); - xpmem_att_deref(att); XPMEM_DEBUG("return: ret=%d", 0); diff --git a/test/issues/1330/README b/test/issues/1330/README new file mode 100644 index 00000000..e8c6b832 --- /dev/null +++ b/test/issues/1330/README @@ -0,0 +1,22 @@ +【Issue#1330 動作確認】 +□ テスト内容 +1. xpmemの基本操作の確認 +mckernel/test/xpmemのテストを実行し、xpmemの基本操作が +正常に動作することを確認する +テスト内容の詳細はmckernel/test/xpmem/README を参照 + +□ 実行手順 +1. mckernel/test/xpmem に移動する +1. xpmemのインストールディレクトリをMakefileとgo_test.sh中のXPMEM_DIRに記載する +2. xpmemのビルドディレクトリをgo_test.sh中のXPMEM_BUILD_DIRに記載する +3. 下記の手順でテストを実行する +$ make test + +McKernelのインストール先や、OSTEST, LTPの配置場所は、 +$HOME/.mck_test_config を参照している +.mck_test_config は、McKernelをビルドした際に生成されるmck_test_config.sample ファイルを +$HOMEにコピーし、適宜編集する + +□ 実行結果 +x86_64_result.log, aarch64_result.log 参照。 +すべての項目をPASSしていることを確認。 diff --git a/test/issues/1330/aarch64_result.log b/test/issues/1330/aarch64_result.log new file mode 100644 index 00000000..72885b32 --- /dev/null +++ b/test/issues/1330/aarch64_result.log @@ -0,0 +1,151 @@ +*** XPMEM_TESTSUITE start ******************************* +XPMEM version = 26003 + +==== test_base STARTS ==== +xpmem_proc1: mypid = 3962 +xpmem_proc1: sharing 262144 bytes +xpmem_proc1: segid = 200000f7a at 0x100000210000 + +xpmem_proc2: mypid = 4161 +xpmem_proc2: segid = 200000f7a +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 = 4472 +xpmem_proc1: sharing 262144 bytes +xpmem_proc1: segid = 200001178 at 0x100000210000 + +xpmem_proc2: mypid = 4670 +xpmem_proc2: segid = 200001178 +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 = 4871 +xpmem_proc1: sharing 2 segments, 262144 bytes each +xpmem_proc1: segid[0] = 200001307 at 0x100000210000 +xpmem_proc1: segid[1] = 400001307 at 0x100000250000 + +xpmem_proc2: mypid = 5068 +xpmem_proc2: segid[0] = 200001307 +xpmem_proc2: segid[1] = 400001307 +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 = 5271 +xpmem_proc1: sharing 262144 bytes +xpmem_proc1: segid = 200001497 at 0x100000210000 + +xpmem_proc2: mypid = 5468 +xpmem_proc2: segid = 200001497 +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 5789 + +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 + [OK] xpmem_get in child + [OK] xpmem_attach in child + [OK] validate TEST_VAL + [OK] xpmem_remove +*** XTP_007 PASSED + +*** XTP_901 start *** + [OK] xpmem_make failed (invalid address) + [OK] xpmem_make succeed(do twice to same address) +*** XTP_901 PASSED + +*** XTP_902 start *** + [OK] xpmem_get in child failed (invalid segid) + [OK] xpmem_get in child (do twice to same segid +*** XTP_902 PASSED + +*** XTP_903 start *** + [OK] xpmem_attach in childi failed (invalid apid) + [OK] xpmem_attach in child succeed (do twice to same apid) +*** XTP_903 PASSED + +*** XTP_904 start *** + [OK] xpmem_detach in child succeed (invalid address) + [OK] xpmem_detach in child succeed (do twice to same address) +*** XTP_904 PASSED + +*** XTP_905 start *** + [OK] xpmem_remove failed (invalid segid) + [OK] xpmem_remove failed (do twice to same segid) +*** XTP_905 PASSED + diff --git a/test/issues/1330/x86_64_result.log b/test/issues/1330/x86_64_result.log new file mode 100644 index 00000000..ac673461 --- /dev/null +++ b/test/issues/1330/x86_64_result.log @@ -0,0 +1,151 @@ +*** XPMEM_TESTSUITE start ******************************* +XPMEM version = 26003 + +==== test_base STARTS ==== +xpmem_proc1: mypid = 4598 +xpmem_proc1: sharing 16384 bytes +xpmem_proc1: segid = 2000011f6 at 0x2aaaaafee000 + +xpmem_proc2: mypid = 5018 +xpmem_proc2: segid = 2000011f6 +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 = 5438 +xpmem_proc1: sharing 16384 bytes +xpmem_proc1: segid = 20000153e at 0x2aaaaafee000 + +xpmem_proc2: mypid = 5858 +xpmem_proc2: segid = 20000153e +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 = 6278 +xpmem_proc1: sharing 2 segments, 16384 bytes each +xpmem_proc1: segid[0] = 200001886 at 0x2aaaaafee000 +xpmem_proc1: segid[1] = 400001886 at 0x2aaaaaff2000 + +xpmem_proc2: mypid = 6698 +xpmem_proc2: segid[0] = 200001886 +xpmem_proc2: segid[1] = 400001886 +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 = 7118 +xpmem_proc1: sharing 16384 bytes +xpmem_proc1: segid = 200001bce at 0x2aaaaafee000 + +xpmem_proc2: mypid = 7538 +xpmem_proc2: segid = 200001bce +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 7958 + +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 + [OK] xpmem_get in child + [OK] xpmem_attach in child + [OK] validate TEST_VAL + [OK] xpmem_remove +*** XTP_007 PASSED + +*** XTP_901 start *** + [OK] xpmem_make failed (invalid address) + [OK] xpmem_make succeed(do twice to same address) +*** XTP_901 PASSED + +*** XTP_902 start *** + [OK] xpmem_get in child failed (invalid segid) + [OK] xpmem_get in child (do twice to same segid +*** XTP_902 PASSED + +*** XTP_903 start *** + [OK] xpmem_attach in childi failed (invalid apid) + [OK] xpmem_attach in child succeed (do twice to same apid) +*** XTP_903 PASSED + +*** XTP_904 start *** + [OK] xpmem_detach in child succeed (invalid address) + [OK] xpmem_detach in child succeed (do twice to same address) +*** XTP_904 PASSED + +*** XTP_905 start *** + [OK] xpmem_remove failed (invalid segid) + [OK] xpmem_remove failed (do twice to same segid) +*** XTP_905 PASSED + diff --git a/test/xpmem/README b/test/xpmem/README new file mode 100644 index 00000000..7beb8e53 --- /dev/null +++ b/test/xpmem/README @@ -0,0 +1,71 @@ +【XPMEMの基本操作確認】 +□ テスト内容 +XPMEM_TESTSUITE: + xpmemに付随するテストスイートをmckernelで実行 + +XTP_001: 単一プロセスでのXPMEM操作 + 1. 実行したプロセスがxpmem_make -> xpmem_get -> xpmem_attach -> xpmem_detach -> xpmem_remove + +XTP_002: 子プロセスでのXPMEM操作 + 1. 親プロセスがfork() + 2. 子プロセスがxpmem_make -> xpmem_get -> xpmem_attach -> xpmem_detach ->xpmem_remove + 3. 子プロセス終了後、親プロセスが終了 + +XTP_003: 親プロセスがmakeした共有領域への子プロセスによるXPMEM操作 + 1. 親プロセスがxpmem_make + 2. fork()で子プロセスを作成 + 3. 子プロセスで、xpmem_get -> xpmem_attach -> 値(TEST_VAL)の設定 -> xpmem_detach + 4. 子プロセスが終了 + 5. 親プロセスが、子プロセスによって設定された値(TEST_VAL)を確認 + 6. 親プロセスがxpmem_remove + +XTP_004: fork()後に親プロセスがmakeした共有領域への子プロセスによるXPMEM操作 + 1. fork()で子プロセスを作成 + 2. 親プロセスがxpmem_make + 3. 子プロセスで、xpmem_get -> xpmem_attach -> 値(TEST_VAL)の設定 -> xpmem_detach + 4. 子プロセスが終了 + 5. 親プロセスが、子プロセスによって設定された値(TEST_VAL)を確認 + 6. 親プロセスがxpmem_remove + +XTP_005: 子プロセスがxpmem_attach後、xpmem_detachをせずに終了 + 1. 親プロセスがxpmem_make + 2. fork()で子プロセスを作成 + 3. 子プロセスで、xpmem_get -> xpmem_attach + 4. 子プロセスが終了 + 5. 親プロセスがxpmem_remove + +XTP_006: 子プロセスがXPMEM操作を行う時点で、xpmem_makeをした親プロセスが終了している + 1. 親プロセスがxpmem_make + 2. fork()で子プロセスを作成 + 3. 親プロセスが終了 + 4. 子プロセスで、xpmem_get (失敗) + 5. 子プロセスが終了 + +XTP_007: 子プロセスがxpmem_attach後、xpmem_detachをせずに対象領域をunmapする + 1. 親プロセスがxpmem_make + 2. fork()で子プロセスを作成 + 3. 子プロセスで、xpmem_get -> xpmem_attach + 4. 子プロセスがattachした領域をunmap + 4. 子プロセスが終了 + 5. 親プロセスがxpmem_remove + +XTP_901: xpmem_make 呼び出しの異常系 + 1. xpmem_make の第1引数に不正なアドレスを指定する (失敗) + 2. 1度xpmem_make を実施したメモリ領域に対して、再度xpmem_make を行う (成功) + +XTP_902: xpmem_get 呼び出しの異常系 + 1. xpmem_get の第1引数に不正なsegidを指定する (失敗) + 2. 1度xpmem_get を実施したsegidで、再度xpmem_get を行う (成功) + +XTP_903: xpmem_attach 呼び出しの異常系 + 1. xpmem_attach の第1引数に不正なapidを指定する (失敗) + 2. 1度xpmem_attach を実施したapidで、再度xpmem_attach を行う (成功) + +XTP_904: xpmem_detach 呼び出しの異常系 + 1. xpmem_detach の第1引数に不正なアドレスを指定する (成功) + 2. 1度xpmem_detach を実施したメモリ領域に対して、再度xpmem_detach を行う (成功) + +XTP_905: xpmem_remove 呼び出しの異常系 + 1. xpmem_remove の第1引数に不正なsegidを指定する (失敗) + 2. 1度xpmem_remove を実施したsegidで、再度xpmem_remove を行う (失敗) + diff --git a/test/xpmem/XTP_001.c b/test/xpmem/XTP_001.c new file mode 100644 index 00000000..cfdc40cf --- /dev/null +++ b/test/xpmem/XTP_001.c @@ -0,0 +1,60 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "util.h" + +int main(int argc, char **argv) +{ + void *mem, *attach; + int rc = 0; + int status; + xpmem_segid_t segid; + xpmem_apid_t apid; + struct xpmem_addr addr; + + printf("*** %s start ***\n", basename(argv[0])); + + mem = mmap(0, SZ_MEM, PROT_READ | PROT_WRITE, + MAP_ANONYMOUS | MAP_PRIVATE | + MAP_HUGETLB | (LARGE_PAGE_SHIFT << MAP_HUGE_SHIFT), -1, 0); + CHKANDJUMP(mem == NULL, "mmap"); + memset(mem, 0, SZ_MEM); + + rc = xpmem_init(); + CHKANDJUMP(rc != 0, "xpmem_init"); + + segid = xpmem_make(mem, SZ_MEM, XPMEM_PERMIT_MODE, (void *)0666); + OKNG(segid == -1, "xpmem_make"); + + apid = xpmem_get(segid, XPMEM_RDWR, XPMEM_PERMIT_MODE, NULL); + OKNG(apid == -1, "xpmem_get"); + + addr.apid = apid; + addr.offset = 0; + attach = xpmem_attach(addr, SZ_MEM, NULL); + OKNG(attach == (void *)-1, "xpmem_attach"); + + rc = xpmem_detach(attach); + OKNG(rc == -1, "xpmem_detach"); + + rc = xpmem_remove(segid); + OKNG(rc == -1, "xpmem_remove"); + + printf("*** %s PASSED\n\n", basename(argv[0])); + return 0; + +fn_fail: + printf("*** %s FAILED\n\n", basename(argv[0])); + + return -1; +} diff --git a/test/xpmem/XTP_002.c b/test/xpmem/XTP_002.c new file mode 100644 index 00000000..3f7810d7 --- /dev/null +++ b/test/xpmem/XTP_002.c @@ -0,0 +1,76 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "util.h" + +int main(int argc, char **argv) +{ + void *mem, *attach; + int rc = 0; + int status; + pid_t pid; + xpmem_segid_t segid; + xpmem_apid_t apid; + struct xpmem_addr addr; + + printf("*** %s start ***\n", basename(argv[0])); + + mem = mmap(0, SZ_MEM, PROT_READ | PROT_WRITE, + MAP_ANONYMOUS | MAP_PRIVATE | + MAP_HUGETLB | (LARGE_PAGE_SHIFT << MAP_HUGE_SHIFT), -1, 0); + CHKANDJUMP(mem == NULL, "mmap"); + memset(mem, 0, SZ_MEM); + + fflush(0); + pid = fork(); + CHKANDJUMP(pid == -1, "fork failed\n"); + + if (pid == 0) { + /* Child process */ + rc = xpmem_init(); + CHKANDJUMP(rc != 0, "xpmem_init in child"); + + segid = xpmem_make(mem, SZ_MEM, XPMEM_PERMIT_MODE, + (void *)0666); + OKNG(segid == -1, "xpmem_make in child"); + + apid = xpmem_get(segid, XPMEM_RDWR, XPMEM_PERMIT_MODE, NULL); + OKNG(apid == -1, "xpmem_get in child"); + + addr.apid = apid; + addr.offset = 0; + attach = xpmem_attach(addr, SZ_MEM, NULL); + OKNG(attach == (void *)-1, "xpmem_attach in child"); + + rc = xpmem_detach(attach); + OKNG(rc == -1, "xpmem_detach in child"); + + rc = xpmem_remove(segid); + OKNG(rc == -1, "xpmem_remove in child"); + + fflush(0); + _exit(0); + } else { + /* Parent process */ + rc = waitpid(pid, &status, 0); + CHKANDJUMP(rc == -1, "waitpid failed\n"); + } + + printf("*** %s PASSED\n\n", basename(argv[0])); + return 0; + +fn_fail: + printf("*** %s FAILED\n\n", basename(argv[0])); + + return -1; +} diff --git a/test/xpmem/XTP_003.c b/test/xpmem/XTP_003.c new file mode 100644 index 00000000..55ca2c72 --- /dev/null +++ b/test/xpmem/XTP_003.c @@ -0,0 +1,79 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "util.h" + +int main(int argc, char **argv) +{ + void *mem, *attach; + int rc = 0; + int status; + pid_t pid; + xpmem_segid_t segid; + xpmem_apid_t apid; + struct xpmem_addr addr; + + printf("*** %s start ***\n", basename(argv[0])); + + mem = mmap(0, SZ_MEM, PROT_READ | PROT_WRITE, + MAP_ANONYMOUS | MAP_PRIVATE | + MAP_HUGETLB | (LARGE_PAGE_SHIFT << MAP_HUGE_SHIFT), -1, 0); + CHKANDJUMP(mem == NULL, "mmap"); + memset(mem, 0, SZ_MEM); + + rc = xpmem_init(); + CHKANDJUMP(rc != 0, "xpmem_init"); + + segid = xpmem_make(mem, SZ_MEM, XPMEM_PERMIT_MODE, (void *)0666); + OKNG(segid == -1, "xpmem_make"); + + fflush(0); + pid = fork(); + CHKANDJUMP(pid == -1, "fork failed\n"); + + if (pid == 0) { + /* Child process */ + apid = xpmem_get(segid, XPMEM_RDWR, XPMEM_PERMIT_MODE, NULL); + OKNG(apid == -1, "xpmem_get in child"); + + addr.apid = apid; + addr.offset = 0; + attach = xpmem_attach(addr, SZ_MEM, NULL); + OKNG(attach == (void *)-1, "xpmem_attach in child"); + + *((unsigned long *)attach) = TEST_VAL; + + rc = xpmem_detach(attach); + OKNG(rc == -1, "xpmem_detach in child"); + + fflush(0); + _exit(0); + } else { + /* Parent process */ + rc = waitpid(pid, &status, 0); + CHKANDJUMP(rc == -1, "waitpid failed\n"); + + OKNG(*((unsigned long *)mem) != TEST_VAL, "validate TEST_VAL"); + + rc = xpmem_remove(segid); + OKNG(rc == -1, "xpmem_remove"); + } + + printf("*** %s PASSED\n\n", basename(argv[0])); + return 0; + +fn_fail: + printf("*** %s FAILED\n\n", basename(argv[0])); + + return -1; +} diff --git a/test/xpmem/XTP_004.c b/test/xpmem/XTP_004.c new file mode 100644 index 00000000..157f34db --- /dev/null +++ b/test/xpmem/XTP_004.c @@ -0,0 +1,112 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "util.h" + +#define BUFF_SIZE 1024 + +int main(int argc, char **argv) +{ + void *mem, *attach; + int rc = 0; + int status; + pid_t pid; + xpmem_segid_t segid; + xpmem_apid_t apid; + struct xpmem_addr addr; + key_t key = ftok(argv[0], 0); + int shmid; + + printf("*** %s start ***\n", basename(argv[0])); + + shmid = shmget(key, SZ_MEM, IPC_CREAT | 0660); + CHKANDJUMP(shmid == -1, "shmget"); + + mem = mmap(0, SZ_MEM, PROT_READ | PROT_WRITE, + MAP_ANONYMOUS | MAP_PRIVATE | + MAP_HUGETLB | (LARGE_PAGE_SHIFT << MAP_HUGE_SHIFT), -1, 0); + CHKANDJUMP(mem == NULL, "mmap"); + memset(mem, 0, SZ_MEM); + + fflush(0); + pid = fork(); + CHKANDJUMP(pid == -1, "fork failed\n"); + + if (pid == 0) { + /* Child process */ + void *shm = shmat(shmid, NULL, 0); + + CHKANDJUMP(shm == (void *)-1, "shmat in child"); + + while ((segid = *(xpmem_segid_t *)shm) == 0) { + }; + + rc = shmdt(shm); + CHKANDJUMP(rc == -1, "shmdt"); + + rc = xpmem_init(); + CHKANDJUMP(rc != 0, "xpmem_init in child"); + + apid = xpmem_get(segid, XPMEM_RDWR, XPMEM_PERMIT_MODE, NULL); + OKNG(apid == -1, "xpmem_get in child"); + + addr.apid = apid; + addr.offset = 0; + attach = xpmem_attach(addr, SZ_MEM, NULL); + OKNG(attach == (void *)-1, "xpmem_attach in child"); + + *((unsigned long *)attach) = TEST_VAL; + + rc = xpmem_detach(attach); + OKNG(rc == -1, "xpmem_detach in child"); + + fflush(0); + _exit(0); + } else { + /* Parent process */ + void *shm = shmat(shmid, NULL, 0); + struct shmid_ds buf; + + CHKANDJUMP(shm == (void *)-1, "shmat in parent"); + rc = xpmem_init(); + CHKANDJUMP(rc != 0, "xpmem_init"); + + segid = xpmem_make(mem, SZ_MEM, XPMEM_PERMIT_MODE, + (void *)0666); + OKNG(segid == -1, "xpmem_make"); + + *(xpmem_segid_t *)shm = segid; + + rc = waitpid(pid, &status, 0); + CHKANDJUMP(rc == -1, "waitpid failed\n"); + + OKNG(*((unsigned long *)mem) != TEST_VAL, "validate TEST_VAL"); + + rc = shmctl(shmid, IPC_RMID, &buf); + CHKANDJUMP(rc == -1, "shmctl"); + + rc = shmdt(shm); + CHKANDJUMP(rc == -1, "shmdt"); + + rc = xpmem_remove(segid); + OKNG(rc == -1, "xpmem_remove"); + } + + printf("*** %s PASSED\n\n", basename(argv[0])); + return 0; + +fn_fail: + printf("*** %s FAILED\n\n", basename(argv[0])); + + return -1; +} diff --git a/test/xpmem/XTP_005.c b/test/xpmem/XTP_005.c new file mode 100644 index 00000000..554e9b3f --- /dev/null +++ b/test/xpmem/XTP_005.c @@ -0,0 +1,76 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "util.h" + +int main(int argc, char **argv) +{ + void *mem, *attach; + int rc = 0; + int status; + pid_t pid; + xpmem_segid_t segid; + xpmem_apid_t apid; + struct xpmem_addr addr; + + printf("*** %s start ***\n", basename(argv[0])); + + mem = mmap(0, SZ_MEM, PROT_READ | PROT_WRITE, + MAP_ANONYMOUS | MAP_PRIVATE | + MAP_HUGETLB | (LARGE_PAGE_SHIFT << MAP_HUGE_SHIFT), -1, 0); + CHKANDJUMP(mem == NULL, "mmap"); + memset(mem, 0, SZ_MEM); + + rc = xpmem_init(); + CHKANDJUMP(rc != 0, "xpmem_init"); + + segid = xpmem_make(mem, SZ_MEM, XPMEM_PERMIT_MODE, (void *)0666); + OKNG(segid == -1, "xpmem_make"); + + fflush(0); + pid = fork(); + CHKANDJUMP(pid == -1, "fork failed\n"); + + if (pid == 0) { + /* Child process */ + apid = xpmem_get(segid, XPMEM_RDWR, XPMEM_PERMIT_MODE, NULL); + OKNG(apid == -1, "xpmem_get in child"); + + addr.apid = apid; + addr.offset = 0; + attach = xpmem_attach(addr, SZ_MEM, NULL); + OKNG(attach == (void *)-1, "xpmem_attach in child"); + + *((unsigned long *)attach) = TEST_VAL; + + fflush(0); + _exit(0); + } else { + /* Parent process */ + rc = waitpid(pid, &status, 0); + CHKANDJUMP(rc == -1, "waitpid failed\n"); + + OKNG(*((unsigned long *)mem) != TEST_VAL, "validate TEST_VAL"); + + rc = xpmem_remove(segid); + OKNG(rc == -1, "xpmem_remove"); + } + + printf("*** %s PASSED\n\n", basename(argv[0])); + return 0; + +fn_fail: + printf("*** %s FAILED\n\n", basename(argv[0])); + + return -1; +} diff --git a/test/xpmem/XTP_006.c b/test/xpmem/XTP_006.c new file mode 100644 index 00000000..c5d52aad --- /dev/null +++ b/test/xpmem/XTP_006.c @@ -0,0 +1,64 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "util.h" + +int main(int argc, char **argv) +{ + void *mem, *attach; + int rc = 0; + int status; + pid_t pid; + xpmem_segid_t segid; + xpmem_apid_t apid; + struct xpmem_addr addr; + + printf("*** %s start ***\n", basename(argv[0])); + + mem = mmap(0, SZ_MEM, PROT_READ | PROT_WRITE, + MAP_ANONYMOUS | MAP_PRIVATE | + MAP_HUGETLB | (LARGE_PAGE_SHIFT << MAP_HUGE_SHIFT), -1, 0); + CHKANDJUMP(mem == NULL, "mmap"); + memset(mem, 0, SZ_MEM); + + rc = xpmem_init(); + CHKANDJUMP(rc != 0, "xpmem_init"); + + segid = xpmem_make(mem, SZ_MEM, XPMEM_PERMIT_MODE, (void *)0666); + OKNG(segid == -1, "xpmem_make"); + + fflush(0); + pid = fork(); + CHKANDJUMP(pid == -1, "fork failed\n"); + + if (pid == 0) { + /* Child process */ + sleep(1); /* wait for parent process exit */ + apid = xpmem_get(segid, XPMEM_RDWR, XPMEM_PERMIT_MODE, NULL); + OKNG(apid != -1, + "xpmem_get in child failed (parent process exited already"); + fflush(0); + + } else { + /* Parent process */ + _exit(0); + } + + printf("*** %s PASSED\n\n", basename(argv[0])); + return 0; + +fn_fail: + printf("*** %s FAILED\n\n", basename(argv[0])); + + return -1; +} diff --git a/test/xpmem/XTP_007.c b/test/xpmem/XTP_007.c new file mode 100644 index 00000000..95aa8ad5 --- /dev/null +++ b/test/xpmem/XTP_007.c @@ -0,0 +1,78 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "util.h" + + +int main(int argc, char **argv) +{ + void *mem, *attach; + int rc = 0; + int status; + pid_t pid; + xpmem_segid_t segid; + xpmem_apid_t apid; + struct xpmem_addr addr; + + printf("*** %s start ***\n", basename(argv[0])); + + mem = mmap(0, SZ_MEM, PROT_READ | PROT_WRITE, + MAP_ANONYMOUS | MAP_PRIVATE | + MAP_HUGETLB | (LARGE_PAGE_SHIFT << MAP_HUGE_SHIFT), -1, 0); + CHKANDJUMP(mem == NULL, "mmap"); + memset(mem, 0, SZ_MEM); + + rc = xpmem_init(); + CHKANDJUMP(rc != 0, "xpmem_init"); + + segid = xpmem_make(mem, SZ_MEM, XPMEM_PERMIT_MODE, (void *)0666); + OKNG(segid == -1, "xpmem_make"); + + fflush(0); + pid = fork(); + CHKANDJUMP(pid == -1, "fork failed\n"); + + if (pid == 0) { + /* Child process */ + apid = xpmem_get(segid, XPMEM_RDWR, XPMEM_PERMIT_MODE, NULL); + OKNG(apid == -1, "xpmem_get in child"); + + addr.apid = apid; + addr.offset = 0; + attach = xpmem_attach(addr, SZ_MEM, NULL); + OKNG(attach == (void *)-1, "xpmem_attach in child"); + + *((unsigned long *)attach) = TEST_VAL; + + munmap(attach, SZ_MEM); + fflush(0); + _exit(0); + } else { + /* Parent process */ + rc = waitpid(pid, &status, 0); + CHKANDJUMP(rc == -1, "waitpid failed\n"); + + OKNG(*((unsigned long *)mem) != TEST_VAL, "validate TEST_VAL"); + + rc = xpmem_remove(segid); + OKNG(rc == -1, "xpmem_remove"); + } + + printf("*** %s PASSED\n\n", basename(argv[0])); + return 0; + +fn_fail: + printf("*** %s FAILED\n\n", basename(argv[0])); + + return -1; +} diff --git a/test/xpmem/XTP_901.c b/test/xpmem/XTP_901.c new file mode 100644 index 00000000..dce5669e --- /dev/null +++ b/test/xpmem/XTP_901.c @@ -0,0 +1,89 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "util.h" + +#define BAD_ADDRESS ((void *)-1) + +int main(int argc, char **argv) +{ + void *mem, *attach; + int rc = 0; + int status; + pid_t pid; + xpmem_segid_t segid; + xpmem_apid_t apid; + struct xpmem_addr addr; + + printf("*** %s start ***\n", basename(argv[0])); + + mem = mmap(0, SZ_MEM, PROT_READ | PROT_WRITE, + MAP_ANONYMOUS | MAP_PRIVATE | + MAP_HUGETLB | (LARGE_PAGE_SHIFT << MAP_HUGE_SHIFT), -1, 0); + CHKANDJUMP(mem == NULL, "mmap"); + memset(mem, 0, SZ_MEM); + + rc = xpmem_init(); + CHKANDJUMP(rc != 0, "xpmem_init"); + + segid = xpmem_make(BAD_ADDRESS, SZ_MEM, XPMEM_PERMIT_MODE, + (void *)0666); + OKNG(segid != -1, "xpmem_make failed (invalid address)"); + + segid = xpmem_make(mem, SZ_MEM, XPMEM_PERMIT_MODE, (void *)0666); + CHKANDJUMP(segid == -1, "xpmem_make"); + + segid = xpmem_make(mem, SZ_MEM, XPMEM_PERMIT_MODE, (void *)0666); + OKNG(segid == -1, "xpmem_make succeed(do twice to same address)"); + + fflush(0); + pid = fork(); + CHKANDJUMP(pid == -1, "fork failed\n"); + + if (pid == 0) { + /* Child process */ + apid = xpmem_get(segid, XPMEM_RDWR, XPMEM_PERMIT_MODE, NULL); + CHKANDJUMP(apid == -1, "xpmem_get in child"); + + addr.apid = apid; + addr.offset = 0; + attach = xpmem_attach(addr, SZ_MEM, NULL); + CHKANDJUMP(attach == (void *)-1, "xpmem_attach in child"); + + *((unsigned long *)attach) = TEST_VAL; + + rc = xpmem_detach(attach); + CHKANDJUMP(rc == -1, "xpmem_detach in child"); + + fflush(0); + _exit(0); + } else { + /* Parent process */ + rc = waitpid(pid, &status, 0); + CHKANDJUMP(rc == -1, "waitpid failed\n"); + + CHKANDJUMP(*((unsigned long *)mem) != TEST_VAL, + "validate TEST_VAL"); + + rc = xpmem_remove(segid); + CHKANDJUMP(rc == -1, "xpmem_remove"); + } + + printf("*** %s PASSED\n\n", basename(argv[0])); + return 0; + +fn_fail: + printf("*** %s FAILED\n\n", basename(argv[0])); + + return -1; +} diff --git a/test/xpmem/XTP_902.c b/test/xpmem/XTP_902.c new file mode 100644 index 00000000..3423bb28 --- /dev/null +++ b/test/xpmem/XTP_902.c @@ -0,0 +1,89 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "util.h" + +#define BAD_SEGID -1 + +int main(int argc, char **argv) +{ + void *mem, *attach; + int rc = 0; + int status; + pid_t pid; + xpmem_segid_t segid; + xpmem_apid_t apid; + struct xpmem_addr addr; + + printf("*** %s start ***\n", basename(argv[0])); + + mem = mmap(0, SZ_MEM, PROT_READ | PROT_WRITE, + MAP_ANONYMOUS | MAP_PRIVATE | + MAP_HUGETLB | (LARGE_PAGE_SHIFT << MAP_HUGE_SHIFT), -1, 0); + CHKANDJUMP(mem == NULL, "mmap"); + memset(mem, 0, SZ_MEM); + + rc = xpmem_init(); + CHKANDJUMP(rc != 0, "xpmem_init"); + + segid = xpmem_make(mem, SZ_MEM, XPMEM_PERMIT_MODE, (void *)0666); + CHKANDJUMP(segid == -1, "xpmem_make"); + + fflush(0); + pid = fork(); + CHKANDJUMP(pid == -1, "fork failed\n"); + + if (pid == 0) { + /* Child process */ + apid = xpmem_get(BAD_SEGID, XPMEM_RDWR, XPMEM_PERMIT_MODE, + NULL); + OKNG(apid != -1, "xpmem_get in child failed (invalid segid)"); + + apid = xpmem_get(segid, XPMEM_RDWR, XPMEM_PERMIT_MODE, NULL); + CHKANDJUMP(apid == -1, "xpmem_get in child"); + + apid = xpmem_get(segid, XPMEM_RDWR, XPMEM_PERMIT_MODE, NULL); + OKNG(apid == -1, "xpmem_get in child (do twice to same segid"); + + addr.apid = apid; + addr.offset = 0; + attach = xpmem_attach(addr, SZ_MEM, NULL); + CHKANDJUMP(attach == (void *)-1, "xpmem_attach in child"); + + *((unsigned long *)attach) = TEST_VAL; + + rc = xpmem_detach(attach); + CHKANDJUMP(rc == -1, "xpmem_detach in child"); + + fflush(0); + _exit(0); + } else { + /* Parent process */ + rc = waitpid(pid, &status, 0); + CHKANDJUMP(rc == -1, "waitpid failed\n"); + + CHKANDJUMP(*((unsigned long *)mem) != TEST_VAL, + "validate TEST_VAL"); + + rc = xpmem_remove(segid); + CHKANDJUMP(rc == -1, "xpmem_remove"); + } + + printf("*** %s PASSED\n\n", basename(argv[0])); + return 0; + +fn_fail: + printf("*** %s FAILED\n\n", basename(argv[0])); + + return -1; +} diff --git a/test/xpmem/XTP_903.c b/test/xpmem/XTP_903.c new file mode 100644 index 00000000..b8d26b67 --- /dev/null +++ b/test/xpmem/XTP_903.c @@ -0,0 +1,92 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "util.h" + +int main(int argc, char **argv) +{ + void *mem, *attach; + int rc = 0; + int status; + pid_t pid; + xpmem_segid_t segid; + xpmem_apid_t apid; + struct xpmem_addr addr; + + printf("*** %s start ***\n", basename(argv[0])); + + mem = mmap(0, SZ_MEM, PROT_READ | PROT_WRITE, + MAP_ANONYMOUS | MAP_PRIVATE | + MAP_HUGETLB | (LARGE_PAGE_SHIFT << MAP_HUGE_SHIFT), -1, 0); + CHKANDJUMP(mem == NULL, "mmap"); + memset(mem, 0, SZ_MEM); + + rc = xpmem_init(); + CHKANDJUMP(rc != 0, "xpmem_init"); + + segid = xpmem_make(mem, SZ_MEM, XPMEM_PERMIT_MODE, (void *)0666); + CHKANDJUMP(segid == -1, "xpmem_make"); + + fflush(0); + pid = fork(); + CHKANDJUMP(pid == -1, "fork failed\n"); + + if (pid == 0) { + /* Child process */ + apid = xpmem_get(segid, XPMEM_RDWR, XPMEM_PERMIT_MODE, NULL); + CHKANDJUMP(apid == -1, "xpmem_get in child"); + + addr.apid = -1; + addr.offset = 0; + attach = xpmem_attach(addr, SZ_MEM, NULL); + OKNG(attach != (void *)-1, + "xpmem_attach in childi failed (invalid apid)"); + + addr.apid = apid; + addr.offset = 0; + attach = xpmem_attach(addr, SZ_MEM, NULL); + CHKANDJUMP(attach == (void *)-1, "xpmem_attach in child"); + + addr.apid = apid; + addr.offset = 0; + attach = xpmem_attach(addr, SZ_MEM, NULL); + OKNG(attach == (void *)-1, + "xpmem_attach in child succeed (do twice to same apid)"); + + *((unsigned long *)attach) = TEST_VAL; + + rc = xpmem_detach(attach); + CHKANDJUMP(rc == -1, "xpmem_detach in child"); + + fflush(0); + _exit(0); + } else { + /* Parent process */ + rc = waitpid(pid, &status, 0); + CHKANDJUMP(rc == -1, "waitpid failed\n"); + + CHKANDJUMP(*((unsigned long *)mem) != TEST_VAL, + "validate TEST_VAL"); + + rc = xpmem_remove(segid); + CHKANDJUMP(rc == -1, "xpmem_remove"); + } + + printf("*** %s PASSED\n\n", basename(argv[0])); + return 0; + +fn_fail: + printf("*** %s FAILED\n\n", basename(argv[0])); + + return -1; +} diff --git a/test/xpmem/XTP_904.c b/test/xpmem/XTP_904.c new file mode 100644 index 00000000..c923df44 --- /dev/null +++ b/test/xpmem/XTP_904.c @@ -0,0 +1,90 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "util.h" + +#define BAD_ADDRESS ((void *) -1) + +int main(int argc, char **argv) +{ + void *mem, *attach; + int rc = 0; + int status; + pid_t pid; + xpmem_segid_t segid; + xpmem_apid_t apid; + struct xpmem_addr addr; + + printf("*** %s start ***\n", basename(argv[0])); + + mem = mmap(0, SZ_MEM, PROT_READ | PROT_WRITE, + MAP_ANONYMOUS | MAP_PRIVATE | + MAP_HUGETLB | (LARGE_PAGE_SHIFT << MAP_HUGE_SHIFT), -1, 0); + CHKANDJUMP(mem == NULL, "mmap"); + memset(mem, 0, SZ_MEM); + + rc = xpmem_init(); + CHKANDJUMP(rc != 0, "xpmem_init"); + + segid = xpmem_make(mem, SZ_MEM, XPMEM_PERMIT_MODE, (void *)0666); + CHKANDJUMP(segid == -1, "xpmem_make"); + + fflush(0); + pid = fork(); + CHKANDJUMP(pid == -1, "fork failed\n"); + + if (pid == 0) { + /* Child process */ + apid = xpmem_get(segid, XPMEM_RDWR, XPMEM_PERMIT_MODE, NULL); + CHKANDJUMP(apid == -1, "xpmem_get in child"); + + addr.apid = apid; + addr.offset = 0; + attach = xpmem_attach(addr, SZ_MEM, NULL); + CHKANDJUMP(attach == (void *)-1, "xpmem_attach in child"); + + *((unsigned long *)attach) = TEST_VAL; + + rc = xpmem_detach(BAD_ADDRESS); + OKNG(rc == -1, + "xpmem_detach in child succeed (invalid address)"); + + rc = xpmem_detach(attach); + CHKANDJUMP(rc == -1, "xpmem_detach in child"); + + rc = xpmem_detach(attach); + OKNG(rc == -1, + "xpmem_detach in child succeed (do twice to same address)"); + + fflush(0); + _exit(0); + } else { + /* Parent process */ + rc = waitpid(pid, &status, 0); + CHKANDJUMP(rc == -1, "waitpid failed\n"); + + CHKANDJUMP(*((unsigned long *)mem) != TEST_VAL, + "validate TEST_VAL"); + + rc = xpmem_remove(segid); + CHKANDJUMP(rc == -1, "xpmem_remove"); + } + + printf("*** %s PASSED\n\n", basename(argv[0])); + return 0; + +fn_fail: + printf("*** %s FAILED\n\n", basename(argv[0])); + + return -1; +} diff --git a/test/xpmem/XTP_905.c b/test/xpmem/XTP_905.c new file mode 100644 index 00000000..2897b897 --- /dev/null +++ b/test/xpmem/XTP_905.c @@ -0,0 +1,88 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "util.h" + +#define BAD_SEGID -1 + +int main(int argc, char **argv) +{ + void *mem, *attach; + int rc = 0; + int status; + pid_t pid; + xpmem_segid_t segid; + xpmem_apid_t apid; + struct xpmem_addr addr; + + printf("*** %s start ***\n", basename(argv[0])); + + mem = mmap(0, SZ_MEM, PROT_READ | PROT_WRITE, + MAP_ANONYMOUS | MAP_PRIVATE | + MAP_HUGETLB | (LARGE_PAGE_SHIFT << MAP_HUGE_SHIFT), -1, 0); + CHKANDJUMP(mem == NULL, "mmap"); + memset(mem, 0, SZ_MEM); + + rc = xpmem_init(); + CHKANDJUMP(rc != 0, "xpmem_init"); + + segid = xpmem_make(mem, SZ_MEM, XPMEM_PERMIT_MODE, (void *)0666); + CHKANDJUMP(segid == -1, "xpmem_make"); + + fflush(0); + pid = fork(); + CHKANDJUMP(pid == -1, "fork failed\n"); + + if (pid == 0) { + /* Child process */ + apid = xpmem_get(segid, XPMEM_RDWR, XPMEM_PERMIT_MODE, NULL); + CHKANDJUMP(apid == -1, "xpmem_get in child"); + + addr.apid = apid; + addr.offset = 0; + attach = xpmem_attach(addr, SZ_MEM, NULL); + CHKANDJUMP(attach == (void *)-1, "xpmem_attach in child"); + + *((unsigned long *)attach) = TEST_VAL; + + rc = xpmem_detach(attach); + CHKANDJUMP(rc == -1, "xpmem_detach in child"); + + fflush(0); + _exit(0); + } else { + /* Parent process */ + rc = waitpid(pid, &status, 0); + CHKANDJUMP(rc == -1, "waitpid failed\n"); + + CHKANDJUMP(*((unsigned long *)mem) != TEST_VAL, + "validate TEST_VAL"); + + rc = xpmem_remove(BAD_SEGID); + OKNG(rc != -1, "xpmem_remove failed (invalid segid)"); + + rc = xpmem_remove(segid); + CHKANDJUMP(rc == -1, "xpmem_remove"); + + rc = xpmem_remove(segid); + OKNG(rc != -1, "xpmem_remove failed (do twice to same segid)"); + } + + printf("*** %s PASSED\n\n", basename(argv[0])); + return 0; + +fn_fail: + printf("*** %s FAILED\n\n", basename(argv[0])); + + return -1; +} diff --git a/test/xpmem/go_test.sh b/test/xpmem/go_test.sh new file mode 100755 index 00000000..da0ac747 --- /dev/null +++ b/test/xpmem/go_test.sh @@ -0,0 +1,36 @@ +#!/usr/bin/bash + +USELTP=0 +USEOSTEST=0 + +XPMEM_DIR=$HOME/usr +XPMEM_BUILD_DIR=/home/satoken/xpmem + +. ../common.sh + +sudo insmod ${XPMEM_DIR}/lib/modules/`uname -r`/xpmem.ko +sudo chmod og+rw /dev/xpmem + +echo "*** XPMEM_TESTSUITE start *******************************" +cwd=`pwd` +cd ${XPMEM_BUILD_DIR}/test +${cwd}/mc_run.sh +cd ${cwd} + +# xpmem basic test +${MCEXEC} ./XTP_001 +${MCEXEC} ./XTP_002 +${MCEXEC} ./XTP_003 +${MCEXEC} ./XTP_004 +${MCEXEC} ./XTP_005 +${MCEXEC} ./XTP_006 +sleep 3 +${MCEXEC} ./XTP_007 + +${MCEXEC} ./XTP_901 +${MCEXEC} ./XTP_902 +${MCEXEC} ./XTP_903 +${MCEXEC} ./XTP_904 +${MCEXEC} ./XTP_905 + +sudo rmmod xpmem.ko diff --git a/test/xpmem/mc_run.sh b/test/xpmem/mc_run.sh new file mode 100755 index 00000000..07e9c954 --- /dev/null +++ b/test/xpmem/mc_run.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash + +test -e /tmp/xpmem.share && rm -f /tmp/xpmem.share +test -e /tmp/xpmem.lock && rm -f /tmp/xpmem.lock + +# create TMP_SHARE_SIZE bytes defined in xpmem_test.h +for i in `seq 0 31` ; do + echo -n 0 >> /tmp/xpmem.share +done +echo 0 > /tmp/xpmem.lock + +# Run the main test app +mcexec $PWD/xpmem_master +exit 0 + diff --git a/test/xpmem/util.h b/test/xpmem/util.h new file mode 100644 index 00000000..3fe5b718 --- /dev/null +++ b/test/xpmem/util.h @@ -0,0 +1,31 @@ +#define CHKANDJUMP(cond, ...) do { \ + if (cond) { \ + fprintf(stderr, " [NG] "); \ + fprintf(stderr, __VA_ARGS__); \ + fprintf(stderr, " failed\n"); \ + goto fn_fail; \ + } \ +} while (0) + +#define OKNG(cond, ...) do { \ + if (cond) { \ + CHKANDJUMP(cond, __VA_ARGS__); \ + } else { \ + fprintf(stdout, " [OK] "); \ + fprintf(stdout, __VA_ARGS__); \ + fprintf(stdout, "\n"); \ + } \ +} while (0) + + +#ifdef __aarch64__ +#define LARGE_PAGE_SHIFT 21 +#elif defined(__x86_64__) +#define LARGE_PAGE_SHIFT 21 +#else +#error "Non-compliant architecture." +#endif + +#define MAP_HUGE_SHIFT 26 +#define SZ_MEM (2 * (1ULL << LARGE_PAGE_SHIFT)) +#define TEST_VAL 0x1129