Files
mckernel/test/uti
Yoshihisa Morizumi 3a6273777a test: uti/tofu, issues/1507+1519: fix README
Change-Id: I3060e1273c8ef6a1b392a2c678da3bc02a25a4f8
2021-03-11 03:59:57 +00:00
..
2018-09-04 19:52:11 +09:00
2019-02-01 15:15:14 +09:00
2018-09-04 19:52:11 +09:00
2018-09-04 19:52:11 +09:00
2018-09-04 19:52:11 +09:00
2018-09-04 19:52:11 +09:00
2018-09-04 19:52:11 +09:00
2018-09-04 19:52:11 +09:00
2018-09-04 19:52:11 +09:00
2018-09-04 19:52:11 +09:00
2018-09-04 19:52:11 +09:00
2018-09-04 19:52:11 +09:00
2018-09-04 19:52:11 +09:00
2021-02-26 10:24:19 +09:00
2018-09-04 19:52:11 +09:00
2018-09-04 19:52:11 +09:00
2018-09-04 19:52:11 +09:00
2018-09-04 19:52:11 +09:00
2018-09-04 19:52:11 +09:00
2018-09-04 19:52:11 +09:00
2018-09-04 19:52:11 +09:00
2021-02-26 10:24:19 +09:00
2021-02-26 10:24:19 +09:00
2018-09-04 19:52:11 +09:00
2018-09-04 19:52:11 +09:00
2018-09-04 19:52:11 +09:00
2018-09-04 19:52:11 +09:00
2018-09-04 19:52:11 +09:00
2021-02-26 10:24:19 +09:00
2021-02-26 10:24:19 +09:00
2021-02-26 10:24:19 +09:00
2021-02-26 10:24:19 +09:00
2018-09-04 19:52:11 +09:00
2018-09-04 19:52:11 +09:00
2021-02-26 10:24:19 +09:00
2018-09-04 19:52:11 +09:00
2021-02-26 10:24:19 +09:00
2018-09-04 19:52:11 +09:00
2021-02-26 10:24:19 +09:00
2021-02-26 10:24:19 +09:00
2018-09-04 19:52:11 +09:00
2021-02-26 10:24:19 +09:00
2021-02-26 10:24:19 +09:00
2021-02-26 10:24:19 +09:00
2021-02-26 10:24:19 +09:00
2021-02-26 10:24:19 +09:00
2021-02-26 10:24:19 +09:00
2021-02-26 10:24:19 +09:00
2018-09-04 19:52:11 +09:00
2021-02-26 10:24:19 +09:00
2018-09-04 19:52:11 +09:00
2018-09-04 19:52:11 +09:00

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