Previously, futex code of McKerenl was called by mccontrol, but there ware some problems with this method. (Mainly, location of McKernel image on memory) Call futex code in mcctrl instead of the one in McKernel image, giving the following benefits: 1. Not relying on shared kernel virtual address space with Linux any more 2. The cpu id store / retrieve is not needed and resulting in the code Change-Id: Ic40929b64a655b270c435859fa287fedb713ee5c refe: #1428
384 lines
18 KiB
Plaintext
384 lines
18 KiB
Plaintext
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
|