Revert "xpmem: Fix deadlock in xpmem_remove_process_memory_range()"

This reverts commit d052acab1d.

Change-Id: I31e982465ef9e0936145f27c8d1587c01737ec81
This commit is contained in:
Masamichi Takagi
2020-06-16 10:38:33 +09:00
parent e774e1b984
commit 2fe5c8de2e
20 changed files with 4 additions and 1470 deletions

View File

@ -1664,6 +1664,8 @@ int xpmem_remove_process_memory_range(
xpmem_att_ref(att);
ihk_rwspinlock_read_lock_noirq(&vm->memory_range_lock);
mcs_rwlock_writer_lock(&att->at_lock, &at_lock);
if (att->flags & XPMEM_FLAG_DESTROYING) {
@ -1742,6 +1744,8 @@ int xpmem_remove_process_memory_range(
out:
mcs_rwlock_writer_unlock(&att->at_lock, &at_lock);
ihk_rwspinlock_read_unlock_noirq(&vm->memory_range_lock);
xpmem_att_deref(att);
XPMEM_DEBUG("return: ret=%d", 0);

View File

@ -1,22 +0,0 @@
【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していることを確認。

View File

@ -1,151 +0,0 @@
*** 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

View File

@ -1,151 +0,0 @@
*** 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

View File

@ -1,71 +0,0 @@
【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 を行う (失敗)

View File

@ -1,60 +0,0 @@
#include <unistd.h>
#include <stdio.h>
#include <sys/mman.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <xpmem.h>
#include <libgen.h>
#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;
}

View File

@ -1,76 +0,0 @@
#include <unistd.h>
#include <stdio.h>
#include <sys/mman.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <xpmem.h>
#include <libgen.h>
#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;
}

View File

@ -1,79 +0,0 @@
#include <unistd.h>
#include <stdio.h>
#include <sys/mman.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <xpmem.h>
#include <libgen.h>
#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;
}

View File

@ -1,112 +0,0 @@
#include <unistd.h>
#include <stdio.h>
#include <sys/mman.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <xpmem.h>
#include <libgen.h>
#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;
}

View File

@ -1,76 +0,0 @@
#include <unistd.h>
#include <stdio.h>
#include <sys/mman.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <xpmem.h>
#include <libgen.h>
#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;
}

View File

@ -1,64 +0,0 @@
#include <unistd.h>
#include <stdio.h>
#include <sys/mman.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <xpmem.h>
#include <libgen.h>
#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;
}

View File

@ -1,78 +0,0 @@
#include <unistd.h>
#include <stdio.h>
#include <sys/mman.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <xpmem.h>
#include <libgen.h>
#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;
}

View File

@ -1,89 +0,0 @@
#include <unistd.h>
#include <stdio.h>
#include <sys/mman.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <xpmem.h>
#include <libgen.h>
#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;
}

View File

@ -1,89 +0,0 @@
#include <unistd.h>
#include <stdio.h>
#include <sys/mman.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <xpmem.h>
#include <libgen.h>
#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;
}

View File

@ -1,92 +0,0 @@
#include <unistd.h>
#include <stdio.h>
#include <sys/mman.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <xpmem.h>
#include <libgen.h>
#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;
}

View File

@ -1,90 +0,0 @@
#include <unistd.h>
#include <stdio.h>
#include <sys/mman.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <xpmem.h>
#include <libgen.h>
#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;
}

View File

@ -1,88 +0,0 @@
#include <unistd.h>
#include <stdio.h>
#include <sys/mman.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <xpmem.h>
#include <libgen.h>
#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;
}

View File

@ -1,36 +0,0 @@
#!/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

View File

@ -1,15 +0,0 @@
#!/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

View File

@ -1,31 +0,0 @@
#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