diff --git a/kernel/include/process.h b/kernel/include/process.h index 65474044..7c0b6f74 100644 --- a/kernel/include/process.h +++ b/kernel/include/process.h @@ -420,6 +420,7 @@ struct mckfd { long (*mmap_cb)(struct mckfd *, ihk_mc_user_context_t *); int (*close_cb)(struct mckfd *, ihk_mc_user_context_t *); int (*fcntl_cb)(struct mckfd *, ihk_mc_user_context_t *); + int (*dup_cb)(struct mckfd *, ihk_mc_user_context_t *); }; #define SFD_CLOEXEC 02000000 diff --git a/kernel/include/xpmem_private.h b/kernel/include/xpmem_private.h index b746d771..23d76f10 100644 --- a/kernel/include/xpmem_private.h +++ b/kernel/include/xpmem_private.h @@ -252,6 +252,7 @@ extern struct xpmem_partition *xpmem_my_part; static int xpmem_ioctl(struct mckfd *mckfd, ihk_mc_user_context_t *ctx); static int xpmem_close(struct mckfd *mckfd, ihk_mc_user_context_t *ctx); +static int xpmem_dup(struct mckfd *mckfd, ihk_mc_user_context_t *ctx); static int xpmem_init(void); static void xpmem_exit(void); @@ -275,6 +276,7 @@ static int xpmem_release(xpmem_apid_t); static void xpmem_release_ap(struct xpmem_thread_group *, struct xpmem_access_permit *); static void xpmem_release_aps_of_tg(struct xpmem_thread_group *ap_tg); +static void xpmem_flush(struct mckfd *); static int xpmem_attach(struct mckfd *, xpmem_apid_t, off_t, size_t, unsigned long, int, int, unsigned long *); diff --git a/kernel/process.c b/kernel/process.c index cc059a9a..6ef9015c 100644 --- a/kernel/process.c +++ b/kernel/process.c @@ -509,6 +509,10 @@ clone_thread(struct thread *org, unsigned long pc, unsigned long sp, mckfd->next = proc->mckfd; proc->mckfd = mckfd; } + + if (mckfd->dup_cb) { + mckfd->dup_cb(mckfd, NULL); + } } ihk_mc_spinlock_unlock(&proc->mckfd_lock, irqstate); diff --git a/kernel/xpmem.c b/kernel/xpmem.c index 2be01545..e2668b75 100644 --- a/kernel/xpmem.c +++ b/kernel/xpmem.c @@ -34,7 +34,6 @@ #include #include - struct xpmem_partition *xpmem_my_part = NULL; /* pointer to this partition */ @@ -107,6 +106,7 @@ int xpmem_open( mckfd->sig_no = -1; mckfd->ioctl_cb = xpmem_ioctl; mckfd->close_cb = xpmem_close; + mckfd->dup_cb = xpmem_dup; mckfd->data = (long)proc; irqstate = ihk_mc_spinlock_lock(&proc->mckfd_lock); @@ -276,16 +276,11 @@ static int xpmem_ioctl( return -EINVAL; } - static int xpmem_close( struct mckfd *mckfd, ihk_mc_user_context_t *ctx) { int n_opened; - struct process *proc = (struct process *)mckfd->data; - struct xpmem_thread_group *tg; - int index; - struct mcs_rwlock_node_irqsave lock; XPMEM_DEBUG("call: fd=%d, pid=%d, rgid=%d", mckfd->fd, proc->pid, proc->rgid); @@ -293,37 +288,11 @@ static int xpmem_close( n_opened = ihk_atomic_dec_return(&xpmem_my_part->n_opened); XPMEM_DEBUG("n_opened=%d", n_opened); - index = xpmem_tg_hashtable_index(proc->pid); - - mcs_rwlock_writer_lock(&xpmem_my_part->tg_hashtable[index].lock, &lock); - - tg = xpmem_tg_ref_by_tgid_all_nolock(proc->pid); - if (IS_ERR(tg)) { - mcs_rwlock_writer_unlock( - &xpmem_my_part->tg_hashtable[index].lock, &lock); - return 0; + if (mckfd->data) { + /* release my xpmem-objects */ + xpmem_flush(mckfd); } - list_del_init(&tg->tg_hashlist); - - mcs_rwlock_writer_unlock(&xpmem_my_part->tg_hashtable[index].lock, - &lock); - - XPMEM_DEBUG("tg->vm=0x%p", tg->vm); - - ihk_mc_spinlock_lock_noirq(&tg->lock); - tg->flags |= XPMEM_FLAG_DESTROYING; - ihk_mc_spinlock_unlock_noirq(&tg->lock); - - xpmem_release_aps_of_tg(tg); - xpmem_remove_segs_of_tg(tg); - - ihk_mc_spinlock_lock_noirq(&tg->lock); - tg->flags |= XPMEM_FLAG_DESTROYED; - ihk_mc_spinlock_unlock_noirq(&tg->lock); - - xpmem_destroy_tg(tg); - if (!n_opened) { xpmem_exit(); } @@ -333,6 +302,15 @@ static int xpmem_close( return 0; } +static int xpmem_dup( + struct mckfd *mckfd, + ihk_mc_user_context_t *ctx) +{ + mckfd->data = 0; + ihk_atomic_inc_return(&xpmem_my_part->n_opened); + + return 0; +} static int xpmem_init(void) { @@ -987,6 +965,44 @@ static void xpmem_release_aps_of_tg( XPMEM_DEBUG("return: "); } +static void xpmem_flush(struct mckfd *mckfd) +{ + struct process *proc = (struct process *)mckfd->data; + struct xpmem_thread_group *tg; + int index; + struct mcs_rwlock_node_irqsave lock; + + index = xpmem_tg_hashtable_index(proc->pid); + + mcs_rwlock_writer_lock(&xpmem_my_part->tg_hashtable[index].lock, &lock); + + tg = xpmem_tg_ref_by_tgid_all_nolock(proc->pid); + if (IS_ERR(tg)) { + mcs_rwlock_writer_unlock( + &xpmem_my_part->tg_hashtable[index].lock, &lock); + return; + } + + list_del_init(&tg->tg_hashlist); + + mcs_rwlock_writer_unlock(&xpmem_my_part->tg_hashtable[index].lock, + &lock); + + XPMEM_DEBUG("tg->vm=0x%p", tg->vm); + + ihk_mc_spinlock_lock_noirq(&tg->lock); + tg->flags |= XPMEM_FLAG_DESTROYING; + ihk_mc_spinlock_unlock_noirq(&tg->lock); + + xpmem_release_aps_of_tg(tg); + xpmem_remove_segs_of_tg(tg); + + ihk_mc_spinlock_lock_noirq(&tg->lock); + tg->flags |= XPMEM_FLAG_DESTROYED; + ihk_mc_spinlock_unlock_noirq(&tg->lock); + + xpmem_destroy_tg(tg); +} static int xpmem_attach( struct mckfd *mckfd, @@ -1431,11 +1447,12 @@ static void xpmem_detach_att( att->at_vaddr, att->at_vaddr + 1); if (!range || range->start > att->at_vaddr) { - DBUG_ON(1); + ihk_mc_spinlock_lock_noirq(&ap->lock); + list_del_init(&att->att_list); + ihk_mc_spinlock_unlock_noirq(&ap->lock); mcs_rwlock_writer_unlock(&att->at_lock, &at_lock); ihk_mc_spinlock_unlock_noirq(&vm->memory_range_lock); - ekprintf("%s: ERROR: lookup_process_memory_range() failed\n", - __FUNCTION__); + xpmem_att_destroyable(att); XPMEM_DEBUG("return: range=%p"); return; } diff --git a/test/mng_mod/issues/925/CT_001.c b/test/mng_mod/issues/925/CT_001.c new file mode 100644 index 00000000..42a2470a --- /dev/null +++ b/test/mng_mod/issues/925/CT_001.c @@ -0,0 +1,85 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define TEST_NAME "CT_001" +#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); + + +#define SZ_MEM 4 * (1ULL << 10) +#define TEST_VAL 0x1129 + +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", TEST_NAME); + + mem = mmap(0, SZ_MEM, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -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"); + + //*((unsigned long*)attach) = TEST_VAL; + + rc = xpmem_detach(attach); + OKNG(rc == -1, "xpmem_detach"); + + //OKNG(*((unsigned long*)mem) != TEST_VAL, "validate TEST_VAL"); + + rc = xpmem_remove(segid); + OKNG(rc == -1, "xpmem_remove"); + + printf("*** %s PASSED\n\n", TEST_NAME); + return 0; + +fn_fail: + printf("*** %s FAILED\n\n", TEST_NAME); + + return -1; +} diff --git a/test/mng_mod/issues/925/CT_002.c b/test/mng_mod/issues/925/CT_002.c new file mode 100644 index 00000000..3b72e176 --- /dev/null +++ b/test/mng_mod/issues/925/CT_002.c @@ -0,0 +1,100 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define TEST_NAME "CT_002" +#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); + + +#define SZ_MEM 4 * (1ULL << 10) +#define TEST_VAL 0x1129 + +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", TEST_NAME); + + mem = mmap(0, SZ_MEM, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -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"); + + //*((unsigned long*)attach) = TEST_VAL; + + rc = xpmem_detach(attach); + OKNG(rc == -1, "xpmem_detach in child"); + + rc = xpmem_remove(segid); + OKNG(rc == -1, "xpmem_remove in child"); + + //OKNG(*((unsigned long*)mem) != TEST_VAL, "validate TEST_VAL"); + + fflush(0); + _exit(0); + } else { + /* Parent process */ + rc = waitpid(pid, &status, 0); + CHKANDJUMP(rc == -1, "waitpid failed\n"); + } + + printf("*** %s PASSED\n\n", TEST_NAME); + return 0; + +fn_fail: + printf("*** %s FAILED\n\n", TEST_NAME); + + return -1; +} diff --git a/test/mng_mod/issues/925/CT_003.c b/test/mng_mod/issues/925/CT_003.c new file mode 100644 index 00000000..5fb94700 --- /dev/null +++ b/test/mng_mod/issues/925/CT_003.c @@ -0,0 +1,100 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define TEST_NAME "CT_003" +#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); + + +#define SZ_MEM 4 * (1ULL << 10) +#define TEST_VAL 0x1129 + +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", TEST_NAME); + + mem = mmap(0, SZ_MEM, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -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", TEST_NAME); + return 0; + +fn_fail: + printf("*** %s FAILED\n\n", TEST_NAME); + + return -1; +} diff --git a/test/mng_mod/issues/925/CT_004.c b/test/mng_mod/issues/925/CT_004.c new file mode 100644 index 00000000..254a43e9 --- /dev/null +++ b/test/mng_mod/issues/925/CT_004.c @@ -0,0 +1,127 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define TEST_NAME "CT_004" +#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); + + +#define SZ_MEM 4 * (1ULL << 10) +#define TEST_VAL 0x1129 +#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", TEST_NAME); + 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, -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); + 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"); + + struct shmid_ds buf; + 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", TEST_NAME); + return 0; + +fn_fail: + printf("*** %s FAILED\n\n", TEST_NAME); + + return -1; +} diff --git a/test/mng_mod/issues/925/CT_005.c b/test/mng_mod/issues/925/CT_005.c new file mode 100644 index 00000000..7ce1feae --- /dev/null +++ b/test/mng_mod/issues/925/CT_005.c @@ -0,0 +1,97 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define TEST_NAME "CT_005" +#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); + + +#define SZ_MEM 4 * (1ULL << 10) +#define TEST_VAL 0x1129 + +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", TEST_NAME); + + mem = mmap(0, SZ_MEM, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -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", TEST_NAME); + return 0; + +fn_fail: + printf("*** %s FAILED\n\n", TEST_NAME); + + return -1; +} diff --git a/test/mng_mod/issues/925/CT_006.c b/test/mng_mod/issues/925/CT_006.c new file mode 100644 index 00000000..3b826855 --- /dev/null +++ b/test/mng_mod/issues/925/CT_006.c @@ -0,0 +1,84 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define TEST_NAME "CT_006" +#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); + + +#define SZ_MEM 4 * (1ULL << 10) +#define TEST_VAL 0x1129 + +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", TEST_NAME); + + mem = mmap(0, SZ_MEM, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -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", TEST_NAME); + return 0; + +fn_fail: + printf("*** %s FAILED\n\n", TEST_NAME); + + return -1; +} diff --git a/test/mng_mod/issues/925/CT_007.c b/test/mng_mod/issues/925/CT_007.c new file mode 100644 index 00000000..238a30f5 --- /dev/null +++ b/test/mng_mod/issues/925/CT_007.c @@ -0,0 +1,107 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define TEST_NAME "CT_007" +#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); + + +#define SZ_MEM 4 * (1ULL << 10) +#define TEST_VAL 0x1129 +#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", TEST_NAME); + + mem = mmap(0, SZ_MEM, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -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", TEST_NAME); + return 0; + +fn_fail: + printf("*** %s FAILED\n\n", TEST_NAME); + + return -1; +} diff --git a/test/mng_mod/issues/925/CT_008.c b/test/mng_mod/issues/925/CT_008.c new file mode 100644 index 00000000..265cab25 --- /dev/null +++ b/test/mng_mod/issues/925/CT_008.c @@ -0,0 +1,107 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define TEST_NAME "CT_008" +#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); + + +#define SZ_MEM 4 * (1ULL << 10) +#define TEST_VAL 0x1129 +#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", TEST_NAME); + + mem = mmap(0, SZ_MEM, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -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", TEST_NAME); + return 0; + +fn_fail: + printf("*** %s FAILED\n\n", TEST_NAME); + + return -1; +} diff --git a/test/mng_mod/issues/925/CT_009.c b/test/mng_mod/issues/925/CT_009.c new file mode 100644 index 00000000..f92ebb34 --- /dev/null +++ b/test/mng_mod/issues/925/CT_009.c @@ -0,0 +1,110 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define TEST_NAME "CT_009" +#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); + + +#define SZ_MEM 4 * (1ULL << 10) +#define TEST_VAL 0x1129 + +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", TEST_NAME); + + mem = mmap(0, SZ_MEM, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -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", TEST_NAME); + return 0; + +fn_fail: + printf("*** %s FAILED\n\n", TEST_NAME); + + return -1; +} diff --git a/test/mng_mod/issues/925/CT_010.c b/test/mng_mod/issues/925/CT_010.c new file mode 100644 index 00000000..36744b48 --- /dev/null +++ b/test/mng_mod/issues/925/CT_010.c @@ -0,0 +1,107 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define TEST_NAME "CT_010" +#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); + + +#define SZ_MEM 4 * (1ULL << 10) +#define TEST_VAL 0x1129 +#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", TEST_NAME); + + mem = mmap(0, SZ_MEM, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -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", TEST_NAME); + return 0; + +fn_fail: + printf("*** %s FAILED\n\n", TEST_NAME); + + return -1; +} diff --git a/test/mng_mod/issues/925/CT_011.c b/test/mng_mod/issues/925/CT_011.c new file mode 100644 index 00000000..ef49c929 --- /dev/null +++ b/test/mng_mod/issues/925/CT_011.c @@ -0,0 +1,107 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define TEST_NAME "CT_011" +#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); + + +#define SZ_MEM 4 * (1ULL << 10) +#define TEST_VAL 0x1129 +#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", TEST_NAME); + + mem = mmap(0, SZ_MEM, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -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", TEST_NAME); + return 0; + +fn_fail: + printf("*** %s FAILED\n\n", TEST_NAME); + + return -1; +} diff --git a/test/mng_mod/issues/925/Makefile b/test/mng_mod/issues/925/Makefile new file mode 100644 index 00000000..4adf8d58 --- /dev/null +++ b/test/mng_mod/issues/925/Makefile @@ -0,0 +1,84 @@ +CC = gcc +MCK_DIR=/home/satoken/ppos +XPMEM_DIR=/home/satoken/usr + +MCEXEC=$(MCK_DIR)/bin/mcexec +TARGET=CT_001 CT_002 CT_003 CT_004 CT_005 CT_006 CT_007 CT_008 CT_009 CT_010 CT_011 + +CPPFLAGS = -I$(XPMEM_DIR)/include +LDFLAGS = -L$(XPMEM_DIR)/lib -lxpmem + +all: $(TARGET) + +CT_001: CT_001.o + $(CC) -o $@ $^ -static $(LDFLAGS) +CT_001.o: CT_001.c + $(CC) $(CPPFLAGS) -c $< + +CT_002: CT_002.o + $(CC) -o $@ $^ -static $(LDFLAGS) +CT_002.o: CT_002.c + $(CC) $(CPPFLAGS) -c $< + +CT_003: CT_003.o + $(CC) -o $@ $^ -static $(LDFLAGS) +CT_003.o: CT_003.c + $(CC) $(CPPFLAGS) -c $< + +CT_004: CT_004.o + $(CC) -o $@ $^ -static $(LDFLAGS) +CT_004.o: CT_004.c + $(CC) $(CPPFLAGS) -c $< + +CT_005: CT_005.o + $(CC) -o $@ $^ -static $(LDFLAGS) +CT_005.o: CT_005.c + $(CC) $(CPPFLAGS) -c $< + +CT_006: CT_006.o + $(CC) -o $@ $^ -static $(LDFLAGS) +CT_006.o: CT_006.c + $(CC) $(CPPFLAGS) -c $< + +CT_007: CT_007.o + $(CC) -o $@ $^ -static $(LDFLAGS) +CT_007.o: CT_007.c + $(CC) $(CPPFLAGS) -c $< + +CT_008: CT_008.o + $(CC) -o $@ $^ -static $(LDFLAGS) +CT_008.o: CT_008.c + $(CC) $(CPPFLAGS) -c $< + +CT_009: CT_009.o + $(CC) -o $@ $^ -static $(LDFLAGS) +CT_009.o: CT_009.c + $(CC) $(CPPFLAGS) -c $< + +CT_010: CT_010.o + $(CC) -o $@ $^ -static $(LDFLAGS) +CT_010.o: CT_010.c + $(CC) $(CPPFLAGS) -c $< + +CT_011: CT_011.o + $(CC) -o $@ $^ -static $(LDFLAGS) +CT_011.o: CT_011.c + $(CC) $(CPPFLAGS) -c $< + +test: all + $(MCEXEC) ./CT_001 + $(MCEXEC) ./CT_002 + $(MCEXEC) ./CT_003 + $(MCEXEC) ./CT_004 + $(MCEXEC) ./CT_005 + $(MCEXEC) ./CT_006 + @sleep 2 + $(MCEXEC) ./CT_007 + $(MCEXEC) ./CT_008 + $(MCEXEC) ./CT_009 + $(MCEXEC) ./CT_010 + $(MCEXEC) ./CT_011 + +clean: + rm -f $(TARGET) *.o + diff --git a/test/mng_mod/issues/925/README b/test/mng_mod/issues/925/README new file mode 100644 index 00000000..8abd499a --- /dev/null +++ b/test/mng_mod/issues/925/README @@ -0,0 +1,83 @@ +【Issue#925 動作確認】 +Issue#925が解決され、既存機能に影響がないことをIssueで報告されたテストプログラム(1項目)と、 +McKernelでのXPMEM操作の基本動作確認(11項目)の計12項目のテストによって確認した。 +なお、各テストの実行結果は./result.log として格納している。 + +①Issueで報告されたテストプログラムによる確認 + ・Issue#925 + 報告で使用されたテストプログラムを用いて、現象が再現しないことを確認した。 + 実行時の出力を./result.log に記載している + +②McKernelでのXPMEM操作の基本動作確認 +以下の内容で、Issue#925による変更が既存機能(XPMEM)に影響しないことを確認した。 + +基本動作確認の詳細を以下に示す。 + +1. テストの実行方法 + 以下の手順でテストを実行する + 1. Makefileの変数MCK_DIRの内容を、McKernelがインストールされているディレクトリに変更する + 2. Makefileの変数XPMEM_DIRの内容を、XPMEMライブラリがインストールされているディレクトリに変更する + 3. sh make test を実行する + +2. テスト項目 +CT_001: 単一プロセスでのXPMEM操作 + 1. 実行したプロセスがxpmem_make -> xpmem_get -> xpmem_attach -> xpmem_detach -> xpmem_remove + +CT_002: 子プロセスでのXPMEM操作 + 1. 親プロセスがfork() + 2. 子プロセスがxpmem_make -> xpmem_get -> xpmem_attach -> xpmem_detach ->xpmem_remove + 3. 子プロセス終了後、親プロセスが終了 + +CT_003: 親プロセスがmakeした共有領域への子プロセスによるXPMEM操作 + 1. 親プロセスがxpmem_make + 2. fork()で子プロセスを作成 + 3. 子プロセスで、xpmem_get -> xpmem_attach -> 値(TEST_VAL)の設定 -> xpmem_detach + 4. 子プロセスが終了 + 5. 親プロセスが、子プロセスによって設定された値(TEST_VAL)を確認 + 6. 親プロセスがxpmem_remove + +CT_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 + +CT_005: 子プロセスがxpmem_attach後、xpmem_detachをせずに終了 + 1. 親プロセスがxpmem_make + 2. fork()で子プロセスを作成 + 3. 子プロセスで、xpmem_get -> xpmem_attach + 4. 子プロセスが終了 + 5. 親プロセスがxpmem_remove + +CT_006: 子プロセスがXPMEM操作を行う時点で、xpmem_makeをした親プロセスが終了している + 1. 親プロセスがxpmem_make + 2. fork()で子プロセスを作成 + 3. 親プロセスが終了 + 4. 子プロセスで、xpmem_get (失敗) + 5. 子プロセスが終了 + +CT_007: xpmem_make 呼び出しの異常系 + 1. xpmem_make の第1引数に不正なアドレスを指定する (失敗) + 2. 1度xpmem_make を実施したメモリ領域に対して、再度xpmem_make を行う (成功) + +CT_008: xpmem_get 呼び出しの異常系 + 1. xpmem_get の第1引数に不正なsegidを指定する (失敗) + 2. 1度xpmem_get を実施したsegidで、再度xpmem_get を行う (成功) + +CT_009: xpmem_attach 呼び出しの異常系 + 1. xpmem_attach の第1引数に不正なapidを指定する (失敗) + 2. 1度xpmem_attach を実施したapidで、再度xpmem_attach を行う (成功) + +CT_010: xpmem_detach 呼び出しの異常系 + 1. xpmem_detach の第1引数に不正なアドレスを指定する (成功) + 2. 1度xpmem_detach を実施したメモリ領域に対して、再度xpmem_detach を行う (成功) + +CT_011: xpmem_remove 呼び出しの異常系 + 1. xpmem_remove の第1引数に不正なsegidを指定する (失敗) + 2. 1度xpmem_remove を実施したsegidで、再度xpmem_remove を行う (失敗) + +3. 結果 +テストプログラムの実行結果をresult.log に示す。 +上記の11項目がPASSしていることを確認した。 diff --git a/test/mng_mod/issues/925/result.log b/test/mng_mod/issues/925/result.log new file mode 100644 index 00000000..e4d0db38 --- /dev/null +++ b/test/mng_mod/issues/925/result.log @@ -0,0 +1,89 @@ +①Issueで報告されたテストプログラムによる確認 +$ mcexec ./rusage012 +1234 + +②McKernelでのXPMEM操作の基本動作確認 + +/home/satoken/ppos/bin/mcexec ./CT_001 +*** CT_001 start ******************************* + [OK] xpmem_make + [OK] xpmem_get + [OK] xpmem_attach + [OK] xpmem_detach + [OK] xpmem_remove +*** CT_001 PASSED + +/home/satoken/ppos/bin/mcexec ./CT_002 +*** CT_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 +*** CT_002 PASSED + +/home/satoken/ppos/bin/mcexec ./CT_003 +*** CT_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 +*** CT_003 PASSED + +/home/satoken/ppos/bin/mcexec ./CT_004 +*** CT_004 start ******************************* + [OK] xpmem_get in child + [OK] xpmem_attach in child + [OK] xpmem_detach in child + [OK] xpmem_make + [OK] validate TEST_VAL + [OK] xpmem_remove +*** CT_004 PASSED + +/home/satoken/ppos/bin/mcexec ./CT_005 +*** CT_005 start ******************************* + [OK] xpmem_make + [OK] xpmem_get in child + [OK] xpmem_attach in child + [OK] validate TEST_VAL + [OK] xpmem_remove +*** CT_005 PASSED + +/home/satoken/ppos/bin/mcexec ./CT_006 +*** CT_006 start ******************************* + [OK] xpmem_make + [OK] xpmem_get in child failed (parent process exited already +*** CT_006 PASSED + +/home/satoken/ppos/bin/mcexec ./CT_007 +*** CT_007 start ******************************* + [OK] xpmem_make failed (invalid address) + [OK] xpmem_make succeed(do twice to same address) +*** CT_007 PASSED + +/home/satoken/ppos/bin/mcexec ./CT_008 +*** CT_008 start ******************************* + [OK] xpmem_get in child failed (invalid segid) + [OK] xpmem_get in child (do twice to same segid +*** CT_008 PASSED + +/home/satoken/ppos/bin/mcexec ./CT_009 +*** CT_009 start ******************************* + [OK] xpmem_attach in childi failed (invalid apid) + [OK] xpmem_attach in child succeed (do twice to same apid) +*** CT_009 PASSED + +/home/satoken/ppos/bin/mcexec ./CT_010 +*** CT_010 start ******************************* + [OK] xpmem_detach in child succeed (invalid address) + [OK] xpmem_detach in child succeed (do twice to same address) +*** CT_010 PASSED + +/home/satoken/ppos/bin/mcexec ./CT_011 +*** CT_011 start ******************************* + [OK] xpmem_remove failed (invalid segid) + [OK] xpmem_remove failed (do twice to same segid) +*** CT_011 PASSED +