00:50:41 # Life git-whatchanged -p 2c6e5a839f92591a4bc6cac4a575d42151645af3 で確認すればわかる. カーネルからdevfsのサポートは消えた事になっているけど,消すためのパッチはこれだけで, 実はKconfigファイルから消されただけなので,Kconfigファイルさえもどせばまだ動く状態なのではないだろうか,ということ.ただそれだけだけど.
14:23:08 # Life oprofileをDebian powerpcで使ってみる. 使っているノートパソコンはpowerpcなので, それでも使えるようにしてみた. CONFIG_OPROFILE=yにしてカーネルをインストールしなおしたら, 2.6.12で動作した しかし,opcontrol --resetを何度か実行していると, oprofiledが死んでしまう. while sleep 10s; opcontrol --reset; ps -ef |grep op ;done でループをまわしていると,10回くらいでどうも死んでいるように見える.
root 6172 1 0 14:19 ? 00:00:00 /usr/bin/oprofiled --separate-lib=1 --separate-kernel=0 --separate-thread=0 --separate-cpu=0 --events= --vmlinux=/boot/vmlinux.coff-2.6.12 --kernel-range=0000000000500000,0000000000506830 [14:20:29]ibookg4:tmp> while sleep 10s; do sudo opcontrol --reset ; ps -ef |grep op; done Signalling daemon... done root 6172 1 0 14:19 ? 00:00:00 /usr/bin/oprofiled --separate-lib=1 --separate-kernel=0 --separate-thread=0 --separate-cpu=0 --events= --vmlinux=/boot/vmlinux.coff-2.6.12 --kernel-range=0000000000500000,0000000000506830 dancer 9725 5489 0 14:20 pts/1 00:00:00 grep op Signalling daemon... done root 6172 1 0 14:19 ? 00:00:00 /usr/bin/oprofiled --separate-lib=1 --separate-kernel=0 --separate-thread=0 --separate-cpu=0 --events= --vmlinux=/boot/vmlinux.coff-2.6.12 --kernel-range=0000000000500000,0000000000506830 Signalling daemon... done root 6172 1 0 14:19 ? 00:00:00 /usr/bin/oprofiled --separate-lib=1 --separate-kernel=0 --separate-thread=0 --separate-cpu=0 --events= --vmlinux=/boot/vmlinux.coff-2.6.12 --kernel-range=0000000000500000,0000000000506830 dump fail: either daemon died during last run or dies during dump Signalling daemon... /usr/bin/opcontrol: line 1251: kill: (6172) - No such process done dancer 9856 5489 0 14:21 pts/1 00:00:00 grep op
ついでに,ibookのカーネルを2.6.14にあげてみた. ビルドして,/etc/yaboot.confを書き換えて,ybin -v を実行. どうやら2.6.14にするとoprofiledが死なないらしい. ibookg4で dd if=/dev/zero of=/dev/null と while(1);だけをしているプログラムを実行していた場合の出力.
CPU: CPU with timer interrupt, speed 0 MHz (estimated) Profiling through timer interrupt samples % image name app name symbol name 5587 72.8898 binfmtc1KoHxE (deleted) binfmtc1KoHxE (deleted) (no symbols) 1132 14.7684 libc-2.3.5.so dd _wordcopy_fwd_aligned 791 10.3196 dd dd (no symbols) 68 0.8871 libc-2.3.5.so dd memcpy 24 0.3131 bash bash (no symbols) 7 0.0913 libc-2.3.5.so bash mbrtowc 6 0.0783 libc-2.3.5.so bash __gconv_transform_ascii_internal 5 0.0652 libc-2.3.5.so dd __write_nocancel 3 0.0391 ld-2.3.5.so bash do_lookup_x 2 0.0261 ld-2.3.5.so bash _dl_relocate_object 2 0.0261 ld-2.3.5.so grep _dl_relocate_object 2 0.0261 libc-2.3.5.so cpufreqd _IO_file_read
おなじような状況をamd64マシンで再現させてみると, 全然風景が違う. まず,ibookではカーネルのプロファイリングができていないようだ.なぜだろう.
CPU: AMD64 processors, speed 2193.67 MHz (estimated) Counted CPU_CLK_UNHALTED events (Cycles outside of halt state) with a unit mask of 0x00 (No unit mask) count 200000 samples % image name app name symbol name 56804 45.8459 binfmtcwALdYr binfmtcwALdYr (no symbols) 8990 7.2557 vmlinux vmlinux __clear_user 7853 6.3381 vmlinux vmlinux system_call 5578 4.5019 vmlinux vmlinux vfs_read 4996 4.0322 dd dd (no symbols) 4501 3.6327 libc-2.3.5.so dd memcpy 4231 3.4148 vmlinux vmlinux sys_read 4167 3.3631 vmlinux vmlinux read_zero 4009 3.2356 vmlinux vmlinux sysret_check 2425 1.9572 vmlinux vmlinux vfs_write
ibookで利用しているCPUは,7447Aというもののようだが, パフォーマンスモニタ例外というのは存在するようだ.(cf. MPC7450UM). データシートはこちらに. Performance Monitor Exceptionというのがあり,それが利用できそうだ. とおもいながらなんとなくコードを眺めていると, arch/ppc/oprofile/op_model_fsl_booke.cがまさに11.2節にある「Performance Monitor Exception」の処理をしているように見える. CONFIG_FSL_BOOKEでないと有効にならない. oprofile_arch_init はFSL_BOOKEでないと-ENODEVを返す(arch/ppc/oprofile/common.c). FSL_BOOKEというのは,arch/ppc/Kconfigの説明によると e500 (85xx シリーズ) のことらしい. mtspr, mfspr という関数はアッセンブリ言語の命令に該当し, おそらく move to SPR, move from SPR という意味だろう. SPRはspecial Purpose Register. SPRN_UMMCR0が936である,とかいうのは仕様か. include/asm-ppc64/processor.h include/asm-ppc/processor.h にて,定義されている. ここをみてもppc64のほうがppcよりも真面目に仕込まれているように見える. PMC1にて,適当に1番(プロセッサーサイクル)を計測して,100000くらいでオーバフローするような値にすればよいか. PMCが6個あり,それぞれが違う値を計測できるようになっている,というのがなんとも言えない,
Programming Environment Manual for 32-bit Implementations of the PowerPC Architecture というアーキテクチャマニュアルをよんでいると,おもしろいことがたくさん書いてある. liは実はマクロらしく,addiを使って実装しているらしい. addi rD,0,valueか. move register(代入)もorで実装しているらしい.最強. 目から鱗.powerpcの命令セットは CPU側が命令を最適化して実行してくれることを前提にしているような気がします. 命令が32ビットの固定長というけっこう凄い縛りがあるからこういう 設計になってしまったのかもしれないですな.
linuxppcのパッチ一覧みたいなページがあり, どうやら, Stephen Rothwell という人が作業しているらしいということがわかった. 最新のgitツリーを見ると, arch/ppc/oprofileではなく, arch/powerpc/oprofileというディレクトリができており, arch/powerpc以下にppc32/64の両方に適用できるようなコードがマージされているようだ. ただ,ppc32でE500以外では-ENODEVを返すのはかわらない.
#ifndef __powerpc64__ #ifdef CONFIG_FSL_BOOKE model = &op_model_fsl_booke; #else return -ENODEV; #endif
$Id: dancer-diary.el,v 1.89 2005/05/12 11:19:14 dancer Exp $