Linuxへのスレッド生成 結合テスト仕様 CT01 システムコールテスト mmap/munmap/futex/exit □ CT01001 mmap/munmap/futex/exit START Linuxにスレッドを生成 (pthread_create)。成功 □ CT01002 pthread_create OK get_system() の戻り値が -1 (Linux で動作) □ CT01003 get_system OK mmap 発行。戻り値が (void *)-1 以外 □ CT01004 mmap OK mmap 領域に "mmap OK" を書き込む Linuxスレッドからメインスレッドに対して cond_signal メインスレッドにて、mmap 領域参照 (mmap 領域の内容を表示) □ CT01005 mmap OK メインスレッドからLinuxスレッドに cond_signal Linux スレッドにて mmap 領域を munmap。戻り値が 0 □ CT01006 munmap OK Linuxスレッドからメインスレッドに対して cond_signal メインスレッドが mmap 領域を参照 -> SIGSEGV発生 □ CT01007 munmap OK (SIGSEGV) Linux スレッド終了 メインスレッドにて pthread_join。成功 □ CT01008 exit (pthread_join) OK □ CT01009 futex (pthread_mutex/pthread_cond) OK □ CT01010 END CT02 システムコールテスト mremap □ CT02001 mremap START Linuxにスレッドを生成 (pthread_create)。成功 □ CT02002 pthread_create OK get_system() の戻り値が -1 (Linux で動作) □ CT02003 get_system OK mmap 発行。戻り値が (void *)-1 以外 □ CT02004 mmap OK mmap 領域の縮小予定の領域に "mmap OK" を書き込む Linuxスレッドからメインスレッドに対して cond_signal メインスレッドにて、mmap 領域の書き込んだ領域を参照 (mmap 領域の内容を表示) □ CT02005 mmap OK メインスレッドからLinuxスレッドに cond_signal Linux スレッドにて mmap 領域を mremap して縮小。戻り値が 0 □ CT02006 mremap OK Linuxスレッドからメインスレッドに対して cond_signal メインスレッドが mmap 領域の縮小した領域を参照 -> SIGSEGV発生 □ CT02007 mremap OK (SIGSEGV) メインスレッドからLinuxスレッドに cond_signal Linux スレッドにて mmap 領域を munmap。戻り値が 0 □ CT02008 munmap OK Linux スレッド終了 メインスレッドにて pthread_join。成功 □ CT02009 pthread_join OK □ CT02010 END CT03 システムコールテスト mprotect □ CT03001 mprotect START Linuxにスレッドを生成 (pthread_create)。成功 □ CT03002 pthread_create OK get_system() の戻り値が -1 (Linux で動作) □ CT03003 get_system OK mmap 発行。戻り値が (void *)-1 以外 □ CT03004 mmap OK mmap 領域に "mmap OK" を書き込む Linuxスレッドからメインスレッドに対して cond_signal メインスレッドにて、mmap 領域を参照 (mmap 領域の内容を表示) □ CT03005 mmap OK メインスレッドからLinuxスレッドに cond_signal Linux スレッドにて mmap 領域を mprotect して参照権のみ設定。戻り値が 0 □ CT03006 mprotect OK Linuxスレッドからメインスレッドに対して cond_signal メインスレッドが mmap 領域に書き込み -> SIGSEGV発生 □ CT03007 mremap OK (SIGSEGV) メインスレッドからLinuxスレッドに cond_signal Linux スレッドにて mmap 領域を munmap。戻り値が 0 □ CT03008 munmap OK Linux スレッド終了 メインスレッドにて pthread_join。成功 □ CT03009 pthread_join OK □ CT03010 END CT04 システムコールテスト brk □ CT04001 brk START Linuxにスレッドを生成 (pthread_create)。成功 □ CT04002 pthread_create OK get_system() の戻り値が -1 (Linux で動作) □ CT04003 get_system OK sbrk(0)発行。戻り値を保存…(A) □ CT04004 sbrk OK sbrk(4096)発行。戻り値を保存…(B) (A)の場所に "sbrk OK" を書き込む Linuxスレッドからメインスレッドに対して cond_signal メインスレッドにて、(A) 領域を参照 (領域の内容を表示) □ CT04005 sbrk OK メインスレッドにてsbrk(0)発行。戻り値を保存…(C) メインスレッドからLinuxスレッドに cond_signal Linuxスレッドでsbrk(0)発行。戻り値が(C)と一致している □ CT04006 sbrk OK Linux スレッド終了 メインスレッドにて pthread_join。成功 □ CT04007 pthread_join OK □ CT04008 END CT05 システムコールテスト gettid □ CT05001 gettid START McKernelにスレッドを生成 (pthread_create)。成功 □ CT05002 pthread_create OK get_system() の戻り値が 0 (McKernel で動作) □ CT05003 get_system OK gettid() の戻り値を保存…(A) □ CT05004 gettid OK %d util_migrate_inter_kernel 発行。戻り値が 0 □ CT05005 util_migrate_inter_kernel OK get_system() の戻り値が -1 (Linux で動作) □ CT05006 get_system OK gettid() の戻り値が(A)と一致 □ CT05007 gettid OK %d Linux スレッド終了 メインスレッドにて pthread_join。成功 □ CT05008 pthread_join OK □ CT05009 END CT06 システムコールテスト exit_group □ CT06001 exit_group START fork して子プロセス生成。以下、子プロセスの処理 Linuxにスレッドを生成 (pthread_create)。成功 □ CT06002 pthread_create OK get_system() の戻り値が -1 (Linux で動作) □ CT06003 get_system OK Linuxスレッドが exit_group(99) □ CT06004 pthread_join NG が表示されない 親プロセスが wait。子プロセスの終了ステータスが 99 □ CT06004 exit_group OK □ CT06005 END CT07 システムコールテスト エラー系 □ CT07001 error START Linuxにスレッドを生成 (pthread_create)。成功 □ CT07002 pthread_create OK get_system() の戻り値が -1 (Linux で動作) □ CT07003 get_system OK clone() の戻り値が -1 で errno が ENOSYS □ CT07004 clone OK %d fork() の戻り値が -1 で errno が ENOSYS □ CT07005 fork OK %d vfork() の戻り値が -1 で errno が ENOSYS □ CT07006 vfork OK %d execve() の戻り値が -1 で errno が ENOSYS ※ syscall_interceptの不具合によりvforkはSegmentation faultを起こすため、除外している □ CT07007 execve OK %d Linux スレッド終了 メインスレッドにて pthread_join。成功 □ CT07008 pthread_join OK □ CT07009 END CT08 uti_attr_t関連 uti_attr_t の動作は実行環境によって変化するため、機械的にOK/NGの判断ができない。 このため、affinityとschedulerを目視確認して、OK/NGを判断して下さい。 UTI_FLAG_SAME_NUMA_DOMAIN のテストを容易にするため、mcreboot では特定のNUMA ドメインにCPUを寄せて下さい。 また、UTI_FLAG_SAME_L1のテストを容易にするために、論理コアを1つ以上空けるように CPUを割り当てて下さい。 sched cpu には Linux に生成したスレッドの sched_getaffinity の結果を表示する。 sched には同じく sched_getscheduler の結果を表示する。 □ CT08001 UTI_FLAG_NUMA_SET sched cpu に NUMA domain 2 に属すLinux CPU集合が表示されること。 sched=0 であること。 □ CT08002 UTI_FLAG_NUMA_SET|UTI_FLAG_EXCLUSIVE_CPU sched cpu に NUMA domain 2 に属すLinux CPUの内、1つが表示されること。 (CT08001 のCPU集合のメンバであること) sched=1 であること。 □ CT08003 UTI_FLAG_NUMA_SET|UTI_FLAG_EXCLUSIVE_CPU(2) sched cpu に NUMA domain 2 に属すLinux CPUの内、1つが表示されること。 sched cpu は CT08002 とは異なるCPUが表示されていること(ラウンドロビン)。 sched=1 であること。 □ CT08004 UTI_FLAG_SAME_NUMA_DOMAIN sched cpu にMcKernelに割り当てたCPUと同じNUMAドメインに属すLinux CPU集合が 表示されること。 sched=0 であること。 □ CT08005 UTI_FLAG_SAME_NUMA_DOMAIN|UTI_FLAG_CPU_INTENSIVE sched cpu に NUMA domain 2 に属すLinux CPUの内、1つが表示されること。 (CT08004 のCPU集合のメンバであること) sched=0 であること。 □ CT08006 UTI_FLAG_DIFFERENT_NUMA_DOMAIN sched cpu にMcKernelに割り当てたCPUと異なるNUMAドメインに属すLinux CPU集合が 表示されること。 sched=0 であること。 □ CT08007 UTI_FLAG_DIFFERENT_NUMA_DOMAIN|UTI_FLAG_HIGH_PRIORITY sched cpu にMcKernelに割り当てたCPUと異なるNUMAドメインに属すLinux CPU集合の 内、1つが表示されること。(CT08006 のCPU集合のメンバであること) sched=1 であること。 □ CT08008 UTI_FLAG_SAME_L1 sched cpu にMcKernelの親プロセスが実行するCPUとL1キャッシュを共有するLinuxの CPU集合が表示されること。(McKernelへのCPU割り当て状態に依存するが、2論理コア /物理コアの場合、高々1CPUのみが該当する。該当コアが存在しない場合は、全ての コアが対象となる)。 sched=0 であること。 □ CT08009 UTI_FLAG_SAME_L1|UTI_FLAG_NON_COOPERATIVE sched cpu にMcKernelの親プロセスが実行するCPUとL1キャッシュを共有するLinuxの CPUの内1つが表示されること。(CT08008のCPU集合のメンバ。但し、CT08008で該当 CPUが存在しない場合は、全てのコアが対象になる)。 sched=0 であること。 □ CT08010 UTI_FLAG_SAME_L2 sched cpu にMcKernelの親プロセスが実行するCPUとL2キャッシュを共有するLinuxの CPU集合が表示されること。(McKernelへのCPU割り当て状態に依存するが、2論理コア /物理コアの場合、高々1CPUのみが該当する。該当コアが存在しない場合は、全ての コアが対象となる)。 sched=0 であること。 □ CT08011 UTI_FLAG_SAME_L2|UTI_FLAG_CPU_INTENSIVE sched cpu にMcKernelの親プロセスが実行するCPUとL2キャッシュを共有するLinuxの CPUの内1つが表示されること。(CT08010のCPU集合のメンバ。但し、CT08010で該当 CPUが存在しない場合は、全てのコアが対象になる)。 sched=0 であること。 □ CT08012 UTI_FLAG_SAME_L3 sched cpu にMcKernelの親プロセスが実行するCPUとL3キャッシュを共有するLinuxの CPU集合が表示されること。 sched=0 であること。 □ CT08013 UTI_FLAG_SAME_L3|UTI_FLAG_CPU_INTENSIVE sched cpu にMcKernelの親プロセスが実行するCPUとL3キャッシュを共有するLinuxの CPUの内1つが表示されること。(CT08012のCPU集合のメンバ)。 sched=0 であること。 □ CT08014 UTI_FLAG_DIFFERENT_L1 sched cpu にMcKernelの親プロセスが実行するCPUとL1キャッシュを共有しない LinuxのCPU集合が表示されること。 sched=0 であること。 □ CT08015 UTI_FLAG_DIFFERENT_L1|UTI_FLAG_CPU_INTENSIVE sched cpu にMcKernelの親プロセスが実行するCPUとL1キャッシュを共有しない LinuxのCPUの内、1つが表示されること(CT08014のCPU集合のメンバ)。 sched=0 であること。 □ CT08016 UTI_FLAG_DIFFERENT_L2 sched cpu にMcKernelの親プロセスが実行するCPUとL2キャッシュを共有しない LinuxのCPU集合が表示されること。 コアが対象となる)。 sched=0 であること。 □ CT08017 UTI_FLAG_DIFFERENT_L2|UTI_FLAG_CPU_INTENSIVE sched cpu にMcKernelの親プロセスが実行するCPUとL2キャッシュを共有しない LinuxのCPUの内、1つが表示されること(CT08016のCPU集合のメンバ)。 sched=0 であること。 □ CT08018 UTI_FLAG_DIFFERENT_L3 sched cpu にMcKernelの親プロセスが実行するCPUとL3キャッシュを共有しない LinuxのCPU集合が表示されること。 sched=0 であること。 □ CT08019 UTI_FLAG_DIFFERENT_L3|UTI_FLAG_CPU_INTENSIVE sched cpu にMcKernelの親プロセスが実行するCPUとL3キャッシュを共有しない LinuxのCPUの内、1つが表示されること(CT08018のCPU集合のメンバ)。 sched=0 であること。 CT09 プログレス処理オーバーヘッド測定 MPI通信処理とMPIプログレス処理とのロック競合を模すことで、MPIプログレス処理の オーバーヘッドを測定する。 MPI通信処理のステップは以下の通り。 (1) 1usの間オブジェクトをロック (2) 30usの間計算を行う MPIプログレス処理のステップは以下の通り。 (1) 10msに一回オブジェクトをロック (2) 通信が終了したタイミングに重なった場合は2usの処理を行う。そうでない 場合は直ちにアンロックする CT10 pthread_cond_{wait,signal}() [OK] CT11 measure time of system calls [OK] CT12 以下の組み合わせのfutexによる待ち合わせと起床とを確認する。なお、 LinuxスレッドはMcKernelのfutex()を呼ぶ。 ・Linuxスレッドが待ち合わせる ・McKernelスレッドが前記スレッドを起こす CT13 以下の組み合わせのfutexによる待ち合わせと起床とを確認する。なお、 LinuxスレッドはMcKernelのfutex()を呼ぶ。 ・McKernelスレッドが待ち合わせる ・Linuxスレッドが前記スレッドを起こす CT14 以下の組み合わせのpthread_mutex_lockによる待ち合わせと起床とを確 認する。なお、LinuxスレッドはMcKernelのfutex()を呼ぶ。 ・Linuxスレッドが待ち合わせる ・McKernelスレッドが前記スレッドを起こす CT15 以下の組み合わせのpthread_mutex_lockによる待ち合わせと起床とを確 認する。なお、LinuxスレッドはMcKernelのfutex()を呼ぶ。 ・McKernelスレッドが待ち合わせる ・Linuxスレッドが前記スレッドを起こす CT16 以下の組み合わせのpthread_cond_waitによる待ち合わせと起床とを確 認する。なお、LinuxスレッドはMcKernelのfutex()を呼ぶ。 ・Linuxスレッドが待ち合わせる ・McKernelスレッドが前記スレッドを起こす CT17 以下の組み合わせのpthread_cond_waitによる待ち合わせと起床とを確 認する。なお、LinuxスレッドはMcKernelのfutex()を呼ぶ。 ・McKernelスレッドが待ち合わせる。 ・Linuxスレッドが前記スレッドを起こす CT18 以下の組み合わせのfutexによる待ち合わせタイムアウトを確認する。 なお、LinuxスレッドはMcKernelのfutex()を呼ぶ。 ・LinuxスレッドがFUTEX_WAIT_BITSET | FUTEX_CLOCK_REALTIMEと現在時刻 プラス800 msのタイムアウト時刻を指定して、タイムアウトする ・McKernelスレッドがそれより後の時刻に起床を試みる CT19 以下の組み合わせのfutexによる待ち合わせタイムアウトを確認する。 なお、LinuxスレッドはMcKernelのfutex()を呼ぶ。 ・LinuxスレッドがFUTEX_WAIT_BITSETと現在時刻プラス800 msのタイムアウ ト時刻を指定して、タイムアウトする ・McKernelスレッドがそれより後の時刻に起床を試みる CT20 以下の組み合わせのfutexによる待ち合わせタイムアウトを確認する。 なお、LinuxスレッドはMcKernelのfutex()を呼ぶ。 ・LinuxスレッドがFUTEX_WAITと非ゼロのタイムアウト時間を指定して、タ イムアウトする ・McKernelスレッドが上記タイムアウト時間より長い時間が経過した後に 起床を試みる CT21 progress-threadのlockタイミングを変化させたテスト CT22 compute-threadのlockタイミングを変化させたテスト CT23 progress-threadのcond_waitタイミングを変化させたテスト CT24 compute-threadのcond_waitタイミングを変化させたテスト CT25 MPI_Isend()でのプロセス終了時メモリ破壊不具合のスケルトン。パラメタは以下の通り。 * 1MB x 250 (./CT25 20 250) * 128K x 1024 (./CT25 17 1024) CT26 終了時レースコンディションのテスト * thread->statusがPS_EXITEDの場合もhold_thread()を呼んでデッドロックする不具合のテスト CT27 プログレス処理オーバーヘッド測定 * CT09の複数プロセス版。async progressによってオーバーサブスクライブになった場合のオーバーヘッドを測定する。 CT28 taskset -c 0-7 lock-inc-lock x 10000 CT29 no reverse offload CT30 CT21にopenmpスレッドを追加したテスト CT31 pthread_cond_waitオーバーヘッド測定 * Linuxがwaker、McKernelがwaiter CT32 pthread_cond_waitオーバーヘッド測定 * Linuxがwaiter、McKernelがwaker CT33 Main threadでfutex_wait, UTI threadでfutex_wakeをした場合のオーバーヘッド測定 * Linuxがwaker、McKernelがwaiter CT34 UTI threadでfutex_wait, Main threadでfutex_wakeをした場合のオーバーヘッド測定 * Linuxがwaiter、McKernelがwaker CT35 繰り返しpthread_create CT36 LD_PRELOADでsyscall_interceptを用いたsoをつけた場合のテスト ========== How to run ========== Prepare $HOME/.mck_test_config. Example: # Config file for McKernel tests MCK_DIR=/home/m-takagi/project/os/install BIN=/home/m-takagi/project/os/install/bin SBIN=/home/m-takagi/project/os/install/sbin : ${OSTEST:=/home/m-takagi/project/src/ostest} : ${LTP:=/home/m-takagi/project/src/ltp/install} BOOTPARAM="-k 0 -f LOG_LOCAL6 -c 1-7,9-15,17-23,25-31 -m 10G@0,10G@1 -r 1-7:0+9-15:8+17-23:16+25-31:24 -O" : ${MCKERNEL_VERSION:=1.5.0} Prepare $HOME/.mck_test_config.mk. Example: # Config file for McKernel tests BIN ?= /home/m-takagi/project/os/install/bin SBIN ?= /home/m-takagi/project/os/install/sbin OSTEST ?= LTP ?= BOOTPARAM ?= -c 1-7,9-15,17-23,25-31 -m 10G@0,10G@1 -r 1-7:0+9-15:8+17-23:16+25-31:24 MCK_DIR ?= /home/m-takagi/project/os/install ARCH ?= x86_64 TARGET ?= smp-x86 UTI_DIR ?= /home/m-takagi/project/uti/install_mckernel