2005年11月26日 (土曜日)

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/nullwhile(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
	
Junichi Uekawa

$Id: dancer-diary.el,v 1.89 2005/05/12 11:19:14 dancer Exp $