個人的なメモです。
ND6_IFF_ACCEPT_RTADV の追加 (と、それに対応する ndp(8) の更新) を hsu@ に入れてもらう。
dillon が kernel@ で VFS の journaling layer の話をしてる。ちょっと追い切れてない‥‥
2005/2 にリリースを出して、USENIX'05 の時期 (2005/4) もう一度出す、とか言ってる。
今さらながら SD の記事を読んでみる。daichi さんには悪いけど、同意できない部分がたくさん、かなぁ。
全体的に、筆者の意見なのか、客観的な事実なのかを、 きちんと切り分けない文章になっているのが気になった。
ports に Xorg 6.8.1 が入ったので、それを使って package の rebuild をしようかと思ったら、dfports が古くて build できないという悲しい状況。
dfports 一式を更新して submit@ に投げたあとで、 patch 作っているひとがいたのに気づく。
ついでに KAME IPv6 の RELENG_4 patch を少し投げておく。
./a/. が rmdir できちゃう問題は dillon が修正してくれた。感謝。
vfs まわりのバグの正体が分かったので kernel@ にレポートを出しておく。 具体的には、mkdir a && rmdir ./a/. という操作がエラーにならないので、(めぐりめぐって) pax(1) が正常に動かない、というもの。 rmdir(2) は引数に与えられたパス名の最後に . や .. がつく場合、エラーを返さなければならない、と SUSv3 でも規定されている。VFS/namecache API 変更で、 このへんの動作が変わってしまっているらしい。
struct namei の場合、(struct vnode *)ni_dvp が (struct vnode *)ni_vp と等しいかどうか見れば良いはずなのだけど、 struct namecache の場合はどうやるのが適当なのか良く分からんので、 修正パッチの作成はあきらめ。
12/12 時点の snapshot には、vfs レベルのバグが少なくともひとつと、 高負荷時にタイマが不安定になるというバグがあることを確認。 12/26 時点の snapshot に更新して再現するかテスト中。 タイマのバグは panic してくれると追跡しやすいのだけどなぁ...
package build はひと区切りついたので、公開にまわす。build できた package 数は 6326 個、 build に失敗したものは 2694 個。kris@ は ports freeze を 12/30 にしたぜと言っているので、そのあとにもう一度回してみる予定。
cputime 統計を 64-bit カウンタでユーザランドに見せるためのインタフェースが書き直された。 libkinfo と libkcore 経由でアクセス可能。
netstat -P が追加された。PCB の情報を表示させることができる。
安定してるかもと思っていたのだけど、network I/O の負荷をあげてみたところ、TCP の再送タイマが正常に動かないことがあるもよう。 発生条件が絞れないので、とりあえず net.inet.tcp.delayed_ack=0 にして様子をみる。 TCP だけではなくて、タイマまわりがおかしいのかも知れない。
binutils 2.15 が hook up。
net.inet.tcp.inflight_enable 関連のバグが修正された。 incoming connection に対する帯域幅遅延積の計算がおかしかった、 とのこと。
キーボードが動かなくなる、と、確か asmodai@ が最初にレポートしていた問題に対する修正が入った。 AT キーボードの割り込みはエッジトリガなので、 処理が遅れると割り込みを再度有効にする前に次のトリガが来てしまう可能性がある。 そこで、割り込みのとりこぼしを防ぐため、100ms 間隔でキーボードのデータを polling し、とりこぼしを検出するようにした、とのこと。
VFS messaging/interfacing work stage 10/99。 追加されたのはジャーナリング、範囲指定可能なロックの機能と、 キャッシュの整合をとるためのインフラが少し。 vv_jops と vv_cops が無くなって、vop_ops が直接 mount 構造体の中に置かれるようになった。
負荷かけてみたらちょっと不安定だったので、 修正されるまで待つのが吉かも。
make(1) の変更が、引き続き FreeBSD から merge されている。 特に新しいものはなし。
asmodai が OpenSSL 0.9.7e, FILE 4.12, binutils 2.15, CVS 1.12.11 を import。
package build つづき。ほぼ 4 日で 2000 個完了。 今の時点で構築できないものとして 700 個記録された。 ports は全部で 12,000 くらいあるので、残りは 9,000。 まともに全部まわすと 20-30 日かかる計算。
12/13 時点の CURRENT を使って、かなり長時間 CPU & I/O intensive な負荷をかけているものの、特に不安定というところはなし。 1 回、割り込みをロストして panic したので、 タイマまわりは改善の余地があるのかも知れない。
hsu@ がルーティング並列化の準備をやっている。
OpenNTPd の sync と share/example/etc/ntp.conf に ntp.conf のサンプル追加。
ukbd(4) を console として使っている時、 抜き差しすると変になるというバグが修正された。 X 使っている場合でも、状態がおかしくなったりしなくなっている。
package build がようやくまわるようになった。P3/800MHz x 2 という非力なマシンなので、今のところ 400 個/day くらいのペース。 もうちょっと性能の良いものを投入しようかと考え中。
学会で海外に行っていたので、ここ 10 日あたりの変更をまとめて補完。
allbsd.org の package builder を少し整備。 100 個前後の package をつくってみたのだけど、 まだいくつか build がまわらないので、いろいろ調査 & 修正。 make all-depends-list が動かないというのは、かなり致命的だし、 $PERL_ARCH も調整しないとダメ。 ports まわりのインフラはぼろぼろになってます。
年内には、一度全部つくって公開できればいいな。
liamfoy@ がベースシステムの変更案をまとめるためのページを作成したよ、と http://leaf.dragonflybsd.org/‾liamfoy/baseplan.htm に出してる。がんばろうとしているのは分かるのだけど、 こういう TODO を維持管理するのは大変なので、失速しないか心配。
dillon@ が kernel@ で userland schedular の話をしてる。runtime に schedular を差し替えたり、複数の schedular を並列で動作させることができるような API を定義して、その次に実装という手順を踏むよ、と、まあ至極あたりまえの説明。 kernel thread 側 (LWKT) の schedular は、priority 固定で同一 priority のものは round-robin という方式。
users@ では、「できれば次回のリリースは 2 月頃にしたい」と dillon。
NFS の ESTALE 処理のバグが修正された。vn_open() で ESTALE が返った時の再試行で、ファイルが本当になくなっていたりした場合に vput(vp) の vp が NULL になる可能性があった、とのこと。
uptime が変になるバグが修正された。src/sys/kern/kern_clock.c の rev.1.28。 basetime と boottime の扱いが、ちと微妙な感じ。
contrib/traceroute が Attic 行き。stock traceroute は出自が NetBSD で OpenBSD 経由。もっと遡ると LBL のやつに行きつくので、 結局どれも同じなのだけど、あえて OpenBSD のやつ選ぶ理由があったのかしらん。
GPL'd math emulator, dgb(4), awe(4), rp(4), OLDCARD (pcic(4) 経由) が削除された。
VM にあった address boundary check のバグが修正された。 64-bit にした時に、このチェックルーチンだけ 32-bit のままだった、とのこと。 FreeBSD からの merge。
FreeBSD 5.x からの make(1) の変更の merge が続いている。 特に MKOBJDIRPREFIX の扱いが変わっているので注意 (このへんのはまりどころは freebsd-current@ を検索すると出てきます)。
rdate(8) が追加された。OpenBSD からの import。 ntpdate がなくなったので、その代替物として入れたっぽい。 ntp.org の ntpd 関連ファイルは、ごっそり Attic 行き。
stock ntpd (OpenNTPd) が 2004/12/01 時点の snapshot に更新された。DNS lookup のバグ修正が含まれている。
joerg が DFPORTS_WARNING の変更を back out。 結局、以下のようになった。
.if !defined(_DFPORTS_REDIRECT) _DFPORTS_REDIRECT= .if !make(package-depends-list) && !make(all-depends-list) && ¥ !make(run-depends-list) && !make(build-depends-list) && ¥ !make(describe) .BEGIN: @echo "WARNING, USING DRAGONFLY OVERRIDE ${DFPORTSDIR}/${PORTPATH}" cd ${DFPORTSDIR}/${PORTPATH} && ${MAKE} -B ${.TARGETS} .else .BEGIN: @cd ${DFPORTSDIR}/${PORTPATH} && ${MAKE} -B ${.TARGETS} .endif .endif
dfports がある port を /usr/ports で make した時に、 「dfports を使え」という warning が表示されるのだけど、DFPORTS_WARNING という knob を見るようになった。条件は以下のとおり。
.if !make(package-depends-list) && !make(all-depends-list) && ¥ !make(run-depends-list) && !make(build-depends-list) && ¥ !make(describe) && !defined(DFPORTS_WARNING)
いずれにしても、package build のこと何も考えてない気がする。 allbsd.org で package build をしようと、いろいろ調整中なのだけど、 こんな .BEGIN 入れたら、たとえば make package-name とか使えなくなっちゃう。せめて stderr に出してくれれば問題ないのに。
bulk build は pkgsrc のほうが比較的やりやすいので、 GoBSD のアプローチはある意味正解だと思う。 FreeBSD の ports system も、 もうちょっとそのあたり整頓されると嬉しいのだけど、 現状は kris@ が動かないと何も進まないという膠着状態だから、 期待薄。
chmod に -vv オプションが追加された。 こんな感じで前後の uid/gid が表示される。FreeBSD からの porting。
# chown -vv root /tmp/foo /tmp/foo: 1001:0 -> 0:0
libkcore 本体追加。pstat が libkinfo と libkcore を使うように変更された。デフォルトは libkcore。
newgrp(1) が追加された。これは real/effective GID を一時的に切り替える su(1) に似たユーティリティで、POSIX に含まれている。 FreeBSD 5 からの porting。
sys_checkpoint(2) の追加にともなって、checkpt.ko が削除された。 upgrade するひとは、ちゃんと消しておきましょう。
kernel@ で「DFly のタイマの使い方は FreeBSD とどう違うの」という質問が出ていて、 dillon が答えている。
FreeBSD 4 ではタイマ 0 をマスタとして使っていて、 これは HZ パラメータ (通常は 100 から 1000 程度) でカウントダウンする。 基本的にこれを RTC として使うけれど、他に TSC, LAPIC, ACPI などを使うことも可能。RTC 以外の用途にも使っているので、 その処理による誤差が生じることがある。
一方 DFly では、タイマ 0 は SYSTIMER 割り込みのみに使っていて、 この周期は必要に応じて再設定される。 RTC としてはタイマ 2 を使う。BIOS がタイマ 2 を触ることがあるので大変、 というのは、これに関連した話。他のものにも欠点があって、 TSC は CPU throttling が有効になると遅くなることがあるし、 ACPI タイマはハードウェアラッチが不十分で、きちんと読むには複数回 read する必要があるし、LAPIC は APIC がないと使えない、と、dillon。 DFly でタイマ 2 以外を RTC として使うことは、現時点ではできない。
ちなみに、この話の背景は AT 互換機に搭載されている 8254 という PIT (Programmable Interval Timer) です。 これはタイマ 0, タイマ 1, タイマ 2 の 3 個の 16bit カウンタを備えていて、 任意の周期 (またはワンショット) でタイマ割り込みを発生させることができます。 AT 互換機の場合、入力として 1.19318MHz のクロックが入力されていて、 OS 内部の時間計測は、ほとんどがこれを基準にしています。
FreeBSD の起動時に表示される
Timecounter "i8254" frequency 1193182 Hz quality 0 Timecounter "ACPI-safe" frequency 3579545 Hz quality 1000 Timecounter "ACPI-fast" frequency 3579545 Hz quality 1000 Timecounter "tick" frequency 360000000 Hz quality 0 Timecounter "counter-timer" frequency 1000000 Hz quality 100
とかいうのは、それぞれどれを使っているのかを表しているわけです。 DFly では次のような表示になります。
TSC clock: 876272310 Hz, i8254 clock: 1193182 Hz
FreeBSD 5 から make(1) の変更点がばんばん merge されてる。
chown(2), chmod(2), chflags(2) にバグがあったので修正したよ、と dillon。 今までだと vref(), vn_lock() だけでは vnode の VINACTIVE ビットがクリアされず、 vget() でクリアされていた。こういう状況だと、ある inode に変更が加わるまで、 ファイルシステムに反映しないことになる。たとえば cd /dev && ./MAKEDEV した時に、/dev/null が 0600 で作成されてしまう (chmod は行なわれるのだけど、 反映されない) という症状が典型例。
そういえば前回アップグレードした時に、確かに 0600 になってて変だなーとは思ったのだけど、 自分のミスかと思って chmod したのを思い出した。
joerg が libkcore を追加しようとしてる。libkcore は libkvm の置き換えで、libkinfo と対になるもの (のはず)。 ユーザランドユーティリティは sysctl ベースの libkinfo に移行するという流れなのだけど、 libkcore の kvm インタフェースを使うか、libkinfo を使うかを選べるようにすべき、という話が kernel@ で進行中。 確かに ps を完全に sysctl 依存にしてしまうと、ps -M とか ps -N が使えなくなって不便すぎる。
joerg は gdb 使えばいいじゃん、とか言っているのだけど、 それはいかがなものか。
メインリポジトリその他を抱える crater.dragonflybsd.org のディスクがクラッシュしたらしい。バックアップは日曜日時点 (日本時間だと月曜日) なので、その前後の commit やメールアーカイブがいくつかロストした、 と dillon。
キューブ型 PC で運用を続けるのはどうか、 とか思ってしまうのは、古い考えなのだろーか。
checkpoint 機能を実現するシステムコール sys_checkpoint(2) の整頓と、manual page が追加がおこなわれた。 ユーザランドユーティリティは checkpt(1)。 sys_checkpoint(2) は、checkpt(1) の実装と、 他のユーザランドプログラムから SIGCKPT のシグナルハンドラを設定したい時などに使われる。
buildworld & buildkernel が必要なので注意。
8254 の警告メッセージの timeout 値を制御する debug.nclockwarn という sysctl が追加された。 デフォルトは 1 秒で、単位は tick。 警告に該当しない場合にもメッセージを表示していたバグも修正されている。
em(4) の割り込み負荷軽減機能のパラメータが変更された。 em(4) にはそれ関連のタイマとして Receive Packet Delay Timer (RDTR), Receive Absolute Delay Timer (RADV), Interrupt Throttle Timer (ITR) が搭載されていて、そのうちの ITR は、 FreeBSD 由来のコードでは以下のように設定されている。
/* Set the interrupt throttling rate. Value is calculated * as DEFAULT_ITR = 1/(MAX_INTS_PER_SEC * 256ns) */ #define MAX_INTS_PER_SEC 8000 #define DEFAULT_ITR 1000000000/(MAX_INTS_PER_SEC * 256)
今回、これが次のように計算されるようになった。 em_sysctl_int_throttle の値は hw.em.int_throttle_ceil という tunable で制御可能。
/* Set the interrupt throttling rate in 256ns increments */ if (em_int_throttle_ceil) { E1000_WRITE_REG(&adapter->hw, ITR, 1000000000 / 256 / em_int_throttle_ceil); } else { E1000_WRITE_REG(&adapter->hw, ITR, 0); }
8000Hz を 10000Hz にしたらスループットが上がった、と dillon。commit log にベンチマークが載ってる。 また、デフォルト値は 10000Hz に変更されている。
init で chroot する patch が commit された。
virtual 8086 mode の monitor に 8254 へのアクセスを監視するコードが追加された。 システム時計が飛ぶ現象は、8254 のタイマ使っている BIOS (特に video card) があるかららしい。OS としてはマスタクロックとしてタイマが 2 個必要で、 勝手に書き込みがおこなわれると狂ってしまうので、 8254 への書き込みがあったら、BIOS 呼び出しの完了後に 8254 をリセットするようなルーチンを用意している。 リセットが発生すると、Warning: BIOS messed around with the 8254, resetting it という警告メッセージが出るもよう。
kernel@ で「1 時間ずれるんだけど」という報告が出ているけれど、 それは直したと dillon。
sendfile(2) が壊れていたのが修正された (vm_page_free() を vm_page_try_to_free() に変更)。apache2 がクラッシュする現象がなおったはず、とのこと。
joerg が submit@ に libkinfo の patch を投げてる。 libkinfo では、kinfo_* 関数群で CPU 数などの各種情報がとれるようになっている (今のところ sysctl の wrapper として実装されてるものが多い)。 kernel 側の sysctl ABI が変わっているので注意してほしい、とのこと。 buildkernel & buildworld しましょう。
www/firefox の portoverride が dfports に追加された。
新規ミラー追加。 http://www.theshell.com/pub/DragonFly と ftp://ftp.theshell.com/pub/DragonFly。 場所はアリゾナ州フェニックス。
submit@ に init(8) で chroot するという patch が出てる。 chroot 先は loader から init_chroot という tunable で操作可能。 同じファイルシステムの異なるディレクトリに複数のシステムを入れて、 起動を分けるとか、そういうのができる。
たとえば snapshot を試してみようとか思った時に、 ディレクトリをつくってそこにシステム一式を放りこんで、loader.conf に以下の設定を入れておく、というような感じ。
kernel="/dragonfly/kernel" bootfile="/dragonfly/kernel" module_path="/;/modules;/dragonfly/modules" init_path="/dragonfly/sbin/init:/sbin/init" init_chroot="/dragonfly"
複数のシステムを異なるディレクトリ入れてるなら、 各々の tunable を変更すれば良い。もちろん beastie.4th を使ってメニューをつくることもできる。 複数のシステムが起動可能な CD をつくる時とか、 便利そうかも (patch なしだと、 パーティションを切らないとこういうのはできなかったはず)。
security officer 話のつづき。hmp@ は今はそんなのいらないんじゃ、とやんわり否定。正論。
asmodai が fetch の SA の対応をしてる。 FreeBSD SA-04:16 の翻訳はこちら。一応、disclosure date の coordination はしてたみたい。
checkpoint が動いていない、という報告があったので rtld に修正が入っている。 relocation などで linker がいじくった text segment に NOCORE flag が立っていたため、きちんと checkpoint で書き出されなかったのが原因。 NOCORE をクリアするように修正された。また、現在の ELF coredump コードは backing vnode に対応するファイルハンドルを書き出してくれないので、 MAP_PRIVATE で mmap() した場合は、core dump されるようにフラグを変える必要があるので注意、と dillon。
ある checkpoint ファイルを使って再開して、再度 checkpoint を記録する時に、 古い checkpoint ファイルを消すように修正された。そうしないと、古い checkpoint ファイルを map していたという内容が新しい checkpoint ファイルに書き込まれてしまい、その古い checkpoint ファイルは上書きされてしまう、 という矛盾が生じる (文章にするとややこしい)。ファイル名に連番つけて セーブできるように、とか TODO リストが commit log に書かれている。
libkinfo が追加された。libkvm の置き換えを狙ったもの。
TCP SACK が直ったので、デフォルトが 1 に戻った。
usr.sbin/spkrtest を shell script に置き換え。FreeBSD からの porting。
TCP SACK が変だというレポートがあったので、 net.inet.tcp.sack のデフォルトが 0 に変更される。
追記: hsu がなおしたっぽい。out-of-order なセグメントを再構築する時に、データ長の計算にバグがあったもよう。
DragonFly の malloc は M_WAITOK だと NULL を返さない (そういう場合は panic してしまう。M_NULLOK があれば別) ので、NULL チェックは必要ないよね、ということで、 NDIS 関連のソースから NULL チェックが削除された。
slab allocator では使ってない M_FAILSAFE と M_INTALLOC も削除。
ru@ 他がいろいろ入れた make の fix/improve を FreeBSD から import。
「security officer と security team をつくろうぜ」と kernel@ で話を出している人がいる。
どうも、何がやりたいのか理解できない。 security team をどうする、なんて議論しているひまがあるなら、 誰かやる気のある人が、実際に動いてみせる方がよっぽど生産的ではないかなぁ。 今の体制なら dillon が SO を担当するのが自然な気がするし、 そもそもリリースエンジニアリングも満足にやっていない段階で、 「セキュリティチーム」なんて帽子が何か意味を持つのだろーか‥‥
pflog に endianess のバグがあったのがなおったらしい。 pf 内部では host byte order を使ってるのに対して、 pflog が ether_output() をショートカットしてたのが原因。 bpf_mtap() の前に htons 入れて対応。
periodic(8) のスクリプトと mklocatedb.sh が perl free になった。FreeBSD からの移植。
gnu/usr.bin/ptx とか src/release/doc とかが削除された。
起動メニュー (beastie.4th) に kernel.old を起動する選択肢を追加しようぜ、という話が kernel@ に出てる。 make installkernel を複数回実行した時に kernel.old が上書きされちゃうから、その対策も必要だよね、と dillon。 確かに悪くない感じ。
FreeBSD で、-RELEASE 追っかけていること前提なら、 GENERIC kernel を起動するという選択肢も有用かなぁ、 とふと思った。後で提案してみようかと思い中。
うーむ。fred しか出てこないのだから、"beastie" という名前は変えたほうがいいのではないかしらん。
dillon が kernel@ で ata(4) のパッチを試して〜と言ってる。 BUSY に関連する race がなおってるっぽい。未確認。
VFS 9/99 以降、getty まわりで cache_lock() が block してるもよう。「getty でこんなん出るのはおかしいので調査中」と dillon。手元ではこんな感じ。
[diagnostic] cache_lock: blocked on 0xcec400b8 "getty" [diagnostic] cache_lock: unblocked getty
delphij が投げた FreeBSD からの移植パッチ (htonl で bswap を使うようにするとかそういうの) の話から、 kernel-supplied mapped library を実装しようか、という話に。
__section(".klib-dragonfly01") uint32_t (*htonl)(uint32_t hostlong); のように、ELF のセクションに関数ポインタの配列を作る。 関数の実体はカーネルが提供する (プログラムにも含めることができる)。 プログラムを exec() する時、カーネルがその ELF セクションを見つけると、 そのポインタにカーネルから提供されるライブラリをマップする、という仕組み。 つまり、カーネルからライブラリをすり替えることが可能。
htonl の例だと、80386 の場合とそうでない場合で、 提供する関数を変えてやればいいことになる。 システムコールもこれを使って実装することができるので、 いろいろできて面白いかも、と dillon。
systat -netstat の kvm 依存だった部分が sysctl (net.inet.*.pcblist) に変更された。 対応は IPv4 のみで、それ以外は無視。 また、以下のように cpuid が表示されるように変更されている。
/0 /1 /2 /3 /4 /5 /6 /7 /8 /9 /10 Load Average Local Address Foreign Address Cpu Proto Recv-Q Send-Q (state) localhost.ntp *.* 0 udp 0 0 localhost.smtp *.* 0 tcp 0 0 LISTEN
TCP SACK (RFC 2018) の実装が追加された。 net.inet.tcp.earlyretransmit がデフォルトで 1 に変更され、 net.inet.tcp.sack という sysctl が追加された。SACK はデフォルトで有効。 net.inet.tcp.smartsack という knob もある。こっちはデフォルトで無効。 アルゴリズムの改良をしているっぽいけど、詳しくは未確認。
ちなみに net.inet.tcp.earlyretransmit は I-D で出ている draft-allman-tcp-early-rexmt-03 の実装。tcp_input.c rev.1.18 で同じく hsu が追加していたものだが、 今回デフォルトで有効になったもよう。
FreeBSD 5 では net.inet.tcp.sack.enable という sysctl を使うので、混同しないように注意 (2004/10 より前は net.inet.tcp.do_sack という名前だったりしてさらに分かりづらい)。 FreeBSD のやつは Y! の人が開発したものに、OpenBSD の実装にあったアイディアを盛り込んだものです。
前から気になっていたのだけど、 hsu の追加したコードには、条件付きで 4-clause BSD license になるような追記がおこなわれている。 ちなみに DragonFly の公式なライセンスは 3-clause。
/* * Copyright (c) 2003, 2004 Jeffrey M. Hsu. All rights reserved. * * License terms: all terms for the DragonFly license above plus the following: * * 4. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * * This product includes software developed by Jeffrey M. Hsu * for the DragonFly Project. * * This requirement may be waived with permission from Jeffrey Hsu. * This requirement will sunset and may be removed on November 13, 2005, * after which the standard DragonFly license (as shown above) will * apply. */
OpenNTPd や pf の import で system user (_pflogd とか _ntp) が増えたので、アップグレード時にチェックするように src/Makefile に preupgrade ターゲットが追加された。 mergemaster -p では不足なんだろうか。 こういうのは保守が難しくなるパターンのような気がする。
tinderbox から何回かエラーレポートが流れているように、 現時点の HEAD では unionfs と nullfs が壊れている。 一時的に構築しないように Makefile が変更された。
stock ntpd が OpenNTPd になった。/etc/ntpd.conf に名前が変わったのと、 ntpdate が無くなっているので注意してね、と joerg。 昔の ntpd を消すかどうかはまだ決まってないけど、 どうせ ports で入れられるから消してもいいんじゃ、とも言ってる。
kernel@ で「なんでわざわざ vp なんか使うの?」という質問が出て、 dillon が解説モード。件のコードはこんなやつ。
struct vnode *vp; struct vnode *nvp; if ((error = ckpt_fhtovp(&vnh->vnh_fh, &nvp)) != 0) return error; vp = nvp; /* nvp ignored, vp used from here on */
つまるとこ、vp が register に割り当てられることを期待した最適化。 dillon は比較用に次のコードを提示して、 gcc -S で出力を見てみい、と言ってる。 うーむ、サービスしすぎなのではないかしらん ;)
main() { int y; int x; #ifdef SPECIAL fubar(&y); x = y; #else fubar(&x); #endif ++x; ++x; bleh(x); ++x; ++x; bleh(x); }
rl(4) のバグ修正 (FreeBSD からの merge)。 bus_dma に対応して、miibus に depend。
VFS API cleanup 9/99. 古い namecache API が削除されて、 VOP_{,CACHED}LOOKUP を VOP_LOOKUP に一本化。 新しい API は VOP_N* という名前で NRESOLVE, NLOOKUPDOTDOT, NCREATE, NMKDIR, NMKNOD, NLINK, NSYMLINK, NWHITEOUT, NRENAME, NRMDIR, NREMOVE が追加された。古いものとは違って、namecache pointer を引数にとる (古いものは dir vnode, file vnode, name を渡していた)。 これによって、vnode をロックする必要がなくなった。
namecache が必須になったので、file handle から namecache pointer に変換する cache_fromdvp() と VOP_NLOOKUPDOTDOT が追加されてる。
dir vnode は LK_EXCLUSIVE でロックしないとダメなので注意、 という但書きがある。
contigmalloc() のバグ修正。 FreeBSD 4 の contigmalloc() は、 PQ_CACHE にあるページが無条件に再利用可能であることや、 解放可能であること、実際にそのページが PQ_HOLD になっているかも知れないのに PQ_FREE になっていることを仮定している。 また、コード中では m->object を NULL に設定すべきでない場合にも強制的に NULL にしているので、 VM のハッシュテーブルが壊れる可能性あり、という話。
症状としては、低速なディスクでファイルシステムが壊れるというものが考えられる。 bounce buffer など、ドライバが contigmalloc() を多用するケースで顕著。 また、ハッシュテーブルが壊れるので page not found in hash という panic が発生する可能性がある。
修正は m->busy, (m->flags & PG_BUSY), m->wire_count, m->hold_count を順にチェックして、引っかかるようならそのページは再利用しないようにする。 必要がないかも知れないけれど、このチェックは PQ_CACHE に限らずすべてで行なう。 m->object = NULL は、すでに NULL でないか assert チェックを入れて、ハッシュテーブルが壊れないように変更。
dillon が freebsd-hackers@ にも問題提起している。えらい。
sys/libkern.h の max/min マクロが u_int になっているのを MIN/MAX に修正。renice で負の値を使った場合に正しく処理されない症状がなおっているはず、 とのこと。
joerg が OpenNTPd を import。portable version ではなく、OpenBSD stock version。 まだ default にはなっていない。
joerg が FreeBSD 5 から libarchive と bsdtar を import。 GNU tar は gtar に rename。
gdb が 6.2.1 に更新。
BUF_REFCNTNB() という名前の non-blocking 版 BUF_REFCNT() 追加。 バッファのロックが必要な場所で使うためのもの。 もともとは ata の割り込み処理でブロックさせないようにするために追加したもよう。 BUF_REFCNT() は lockcount() を実行してしまうので、biodone() の中で割り込みスレッドがブロックしてしまう。
また、lockcountnb() という non-blocking 版 lockcount() も追加された。
awk の高速化パッチが追加。どれくらい効果があるものなのかは未確認。
libutil に humanize_number(3) 追加。 FreeBSD からの porting。
joerg が Binutils の a,out サポート、contrib/libstdc++3、 gnu/usr.bin/gzip を削除。
dillon が usr.sbin/pppd の remote DoS problem を修正。 patch は OpenBSD から持ってきたもの。
LAST MODIFIED: 2005/01/01 00:06:25 UTC