玄箱でNetBSDを動かす Linkstation-mipsel > kern

LinkStation-MIPSel NetBSDカーネル移植作業メモ

(このページの最終更新日: 2008-03-12)

# 師曰く 『この移植には技術が感じられない』 orz

現在の状況(2007-09-22更新)

  • 全機能を(性能やバグはさておき)実装完了。
  • バイナリ&パッチ&スクリプトの公開を開始。
  • 実際に動作させるまでの手順が難しいのでお手軽化を検討中。
  • いろいろと場当たり的に改善中。

  • netbsd-4ブランチでの実験中。
  • netbsd-currentでも実験中。

お試し版ダウンロード (2008-03-12更新)

  • こちら(プライマリ)(ミラー)に置いてあります。
    • NetBSD4.0サンプルカーネル: 2008-01-21版
    • NetBSD3.1サンプルカーネル: 2007-04-28版  (COMPAT_16追加)
    • NetBSD3.1サンプルカーネル: 2007-03-18版
    • NetBSD3.0サンプルカーネル: 2007-02-03版
    • カーネルパッチ(NetBSD 4用): 2008-01-22版
    • カーネルパッチ(NetBSD 3.1用): 2007-08-16版 (実験中)
      • パッチの例: "bzip2 -dc 20070203.evbmips.diff.bz2 | (cd /usr/src; patch -p0)"
    • ブートローダー: 2007-01-27版
      • Linux側の環境にインストールします。
    • ブートセレクタ: 2007-06-17版
      • Linux側の環境にインストールします。
    • 電源管理デーモン(ls2_powerd): 2007-01-25版
    • NetBSDコンソール切替(ls2_consw): 2007-01-25版
    • ユーザランドバイナリ: 2007-02-02版
      • sbin/fdisk, sbin/disklabel, sbin/fsck_ext2fsが入っています。
    • ユーザランドパッチ: 2007-02-02版
      • fsck_ext2fsのコンパイルにはカーネルパッチに入っている修正(BUFFALO_E2FS_MAGIC)が必要になります。
      • 簡単に回避するには、/usr/include/ufs/ext2fs/ext2fs.hに "#define BUFFALO_E2FS_MAGIC 0xef54" を追加してください。
    • USBメモリイメージ用追加ファイル: 2007-02-03版
      • NetBSD/i386等、Little-EndianなNetBSD上でUSBメモリをfdisk&disklabel&newfsします。
        • sd0aとして認識できるようにして下さい。
      • マウントし、NetBSD/evbmips-el 3.xのbin.tgz etc.tgzを展開後、上記追加ファイルを展開します。
        • tarの引数の-p(--preserve-permissions)を忘れずに!
      • これで終了です。rootまたはbsduserでログインできるように環境が作られています。
        • IPアドレスはいつもどおりDHCPと固定の両対応です。固定は192.168.200.220/24です。
        • 手抜きにより、デバイスノードもアーカイブに含んでいます。ご注意下さい。

  • USBメモリイメージファイル(NetBSD-4): 2008-02-29版(512MB以上用) 27MBちょっと
  • お試しパックは準備中です。
    • fdiskとdisklabelはhpcmips-elから取り出しても使えると思います。

(ご試用は自己責任でお願いします。)

大方針

  • currentは使わず、NetBSD 3.0ベースで作業する。
  • MALTA評価ボード用をベースに改造する。
    • 元のコードは気にせず改造する。(あとで分離) 分離完了

  • 次のステップを踏む予定。( 一応全て完了 )
    • mainbus+com(ポーリング)+時計(ダミー)のみ 完了
    • +割り込みまわり整備+タイマ割り込み 完了
    • +com(割り込み駆動) 完了
    • +PCIバス+デバイスサポート(ATA,USB) 課題を残しつつ完了 やり直すかも
      • ここでローカルファイルシステムをサポートする予定 wd0,sd0をサポート
        • うまくいけばセルフ開発環境へ移行 完了
      • USBまで動けばUSB-NIC経由でネットワーク接続をサポート axe,aueをサポート
    • +GPIO+SPI+時計 一応完了
    • +DOS MBR, disklabel周辺(カーネル/ユーザランド) 完了
    • +内蔵Ethernet 無理やり完了
    • +コンソール切り替え機構(com/null) 完了

  • 追加作業項目(案)
    • ブートローダー
      • 4MB超えサポート
      • bootstrサポート
      • DMA停止コード書き直し
    • ブートセレクタ
      • ls2_swread
        • ブート中表示(LEDインジケータ)
    • カーネル
      • カーネル起動引数
        • bootstrサポート
        • bootdevサポート 完了
        • boothowtoサポート 完了
      • ドライバ
        • PCIドライバ安定化
    • ユーザランド
      • fdisk
        • MBRサポート追加 完了
      • disklabel
        • MBRサポート追加 完了
      • fsck_ext2fs
        • Special MAGICサポート追加 完了
      • ls2_powerd
        • stdin/outをcloseする(daemon化時)
    • その他
      • 各種アーカイブ作成
      • USBメモリイメージ作成
      • お試しパック作成

解決しなければならない問題

  • ブート不安定
    • PCIデバイスのレジスタの読み込みでハングする。
    • 回避コードで回避中(本解決では無い)

  • (追記予定)

解決済み

  • MALTAの概要も知っておく必要あり。(資料探索中→入手)
  • 79RC32434の割り込み機構のコード化 (完了)
  • LinkStationはyamonを持っていないのでyamonに依存している部分を書き直す必要あり。(完了)
  • LEDディスプレイも無い。削除する必要あり。(完了)
  • シリアルドライバは書き直し(完了)
  • dbsymが効いていない(完了)
  • PCI周りの初期化は?(だいたいOK)
  • DMAはどう使う?(PCIバスマスタDMAはOK)
  • Ethernetドライバは?(だいたいOK)
    • DMA2つと割り込み5つっていうのはまじめにコード書くのは規模大きすぎ。
    • 送受信割り込み以外は手を抜くか...(実際手抜き)
  • SPIドライバの構造は?
    • SPIデバイス(RTC)とSPIコントロールとデバイスアサート(GPIO)を分けると結構な手間がかかる
    • ↑結局完全統合型(分離は後回し)
  • コンソール切替機構
    • 適当に回避
  • ユーザランド
    • とりあえず電源管理はOKっぽい。
  • ルートデバイス選択&ブートフラグ指定をカーネル&ブートローダーに追加する必要あり
    • 追加した。(旧方式のみ: 16進で指定)


作業メモランダム


(2007-08-11)
  • boehm-gcが動かなかった件。
    • ishihara@つなぐねっとさんのモバイルギアでNetBSDの中に、そのものずばりの記述を見つけた。
    • 早速実験中...
    • boehm-gcのビルドは成功。引き続きw3mをビルド中...
      • /etc/mk.confには"PKG_OPTIONS.w3m=w3m-m17n w3m-unicode"を追加している。
    • w3mもビルド成功。charsetまわりを設定してUnicodeなページ(slashdot.jpなど)もOK。完璧(^_^)。
    • ishiharaさん、伊藤さんに感謝 _o_

(2007-08-14)
  • 07-24に書いた件の追加メモ。
    • どうも最初から4バイトアラインメントアクセスの手段は用意されていたようだ >> evbmips
    • CHIP_ALIGN_STRIDE, CHIP_ACCESS_SIZE CHIP_ACCESSTYPEあたり。
      • CHIP_ALIGN_STRIDE=2, CHIP_ACCESS_SIZE=4 にすれば良いのかな?
    • CHIP_ALIGN_STRIDEを実際に使っているものがevbmips以下には無いのが心配だが。
    • 他Archでは、 algorが使っているものが非常に良く似ている。(←algorもmips系)
    • すべてのオフセット値を定義し直しするのと、com_***bus.cを作る必要があるので、作業は後回しになってしまいそう。
      • # そもそも全てのものをmainbus直下にしているのがまずいのだ orz

(2007-08-15)
  • 上記CHIP_ACCESS_SIZEはcurrent用で、CHIP_ACCESSTYPEがnetbsd-3用。
    • 紛らわしい...
    • ちょっと試したけれど動かず。もう少し粘ってみる。
    • (comはcom_mainbus.cにした)
    • ロングワード(uint32_t)アクセスの場合はオフセットはそのままで良いようだ。

(2007-08-16)
  • com化、うまくいっていない。
    • early consoleからcomへ切り替わるところで固まる。comのアクセスに問題がありそう。
    • 次は一気に変更せず、icomのみを改造して試してみることにする。

  • com化引き続き。
    • CHIP_ACCESSTYPEは使用しないことにした。CHIP_ALIGN_STRIDE=2で使用。
      • bus_space_read_[12], bus_space_write_[12]が上記の影響を受ける。
    • icomのレジスタオフセットをいじらず、bus_space_read_1をbus_space_read_4に、bus_space_write_1をbus_space_write_4にしてみた。OK。
      • 影響を受けないのだからあたりまえ。
      • bus_space_write_mult_1はそのまま。icom_data(=0)なのでこれも影響なし。
    • icomのレジスタオフセットをいじって0,1,2,... に変更し、元のbus_space_read_1, bus_space_write_1に戻した。OK。
      • icom_mainbus.c中のbus_space_mapのlengthは0x44のまま。
      • 現在com_is_consoleがtrueな状態なので効果は無いはずだが。
    • ここまでうまくいったので、icom_mainbus.cをcom_mainbus.cにして、中身もicomをcomにリネーム。
      • files.ls2もcomを使うように修正。
      • com_mainbusreg.h中でCOM_FREQを200000000にoverrideするように設定。
      • includeの順番もcom_reg.hよりも後にcom_mainbusreg.hを読むように修正。
    • 上記でうまくいった。
      • 昨日の失敗は...COM_FREQが主原因かな?
      • もうちょっと整理が必要かもしれない。特にconsoleとして使わないパターンの場合。
    • 現状のコードだと、CHIP_ALIGN_STRIDEはbus_space_mapのlengthに影響しない。
      • com.cだとCOM_NPORTS(=8)しか取らない。
      • CHIP_ALIGN_STRIDEが2の場合は8<<2で32は必要。このへんの解決方法は不明。

(2007-08-17)
  • 一応パッチを作成。ダウンロードできます。NetBSD-3.1オリジナルからの差分です。
    • サイズが圧縮後で12kBほど小さくなりました。icomを削除できたのが効いてます。
    • 通常モード(非デバッグモード;シリアルコンソール無効)のテストはまだしていないのでご注意のほどを。
      • ls2_powerdの対応するデバイスの変更も必要なのを特に注意されたし。

(2007-08-20)
  • お問い合わせを受けて調べましたが、HD-LANv3もinsmodが出来そうです。
    • ソース:buffaloのカーネルソース
  • HD-LANv3ではUSBインタフェースが無いので、インストール作業は(1)ディスクを外して行うか、(2)『スーパーお手軽パック for MIPS』(←未作成)のどちらかになると思います。
    • # 『スーパーお手軽パック for MIPS』は某Iさん(仮名)が実験されていたような...(^^;)

(2007-08-21)
  • 上記に追加。
    • HD-LANv3にはUSBが無いので、カーネルソースを少しいじる必要があります。
      • ↑PCIデバイスの検出で、ズルをしているためです _o_
      • (運が良かったらそのままでも動くはずですが)
    • 実験がまとまったら改めて説明する予定です。

(2007-09-16)
  • netbsd-4の実験が大体まとまったのでご報告。以下はブートメッセージ。
NetBSD loader module loaded
kernel=/boot/test4.bin
boot device=0xa0000404
boot flags=0x00000000
start address=0x80100000
flushing ide devices: hda
MIPS32/64 params: cpu arch: 32
MIPS32/64 params: TLB entries: 16
MIPS32/64 params: Icache: line = 16, total = 8192, ways = 4
                 sets = 128
MIPS32/64 params: Dcache: line = 16, total = 8192, ways = 4
                 sets = 128
  picache_stride    = 2048
  picache_loopcount = 4
  pdcache_stride    = 2048
  pdcache_loopcount = 4
NetBSD 4.0_RC1 (LS2) #0: Sun Sep 16 13:26:52 JST 2007
        root@LS2BSD:/mnt/netbsd-4/src/sys/arch/evbmips/compile/LS2
total memory = 65536 KB
avail memory = 60080 KB
timecounter: Timecounters tick every 10.000 msec
mainbus0 (root)
cpu0 at mainbus0: 400.00MHz (hz cycles = 2000000, delay divisor = 200)
cpu0: MIPS 4Kc (0x1800a) Rev. 10 with software emulated floating point
cpu0: 8KB/16B 4-way set-associative L1 Instruction cache, 16 TLB entries
cpu0: 8KB/16B 4-way set-associative write-back L1 Data cache
ipci0 at mainbus0 addr 0x80000
pci0 at ipci0
pci0: i/o space, memory space enabled
iteide0 at pci0 dev 2 function 0
iteide0: Integrated Technology Express IDE controller (rev. 0x13)
iteide0: bus-master DMA support present
iteide0: primary channel wired to native-PCI mode
iteide0: using irq 40 for native-PCI interrupt
atabus0 at iteide0 channel 0
iteide0: secondary channel wired to native-PCI mode
atabus1 at iteide0 channel 1
ohci0 at pci0 dev 4 function 0: NEC USB Host Controller (rev. 0x43)
ohci0: interrupting at irq 42
ohci0: OHCI version 1.0
usb0 at ohci0: USB revision 1.0
uhub0 at usb0
uhub0: NEC OHCI root hub, class 9/0, rev 1.00/1.00, addr 1
uhub0: 3 ports with 3 removable, self powered
ohci1 at pci0 dev 4 function 1: NEC USB Host Controller (rev. 0x43)
ohci1: interrupting at irq 42
ohci1: OHCI version 1.0
usb1 at ohci1: USB revision 1.0
uhub1 at usb1
uhub1: NEC OHCI root hub, class 9/0, rev 1.00/1.00, addr 1
uhub1: 2 ports with 2 removable, self powered
ehci0 at pci0 dev 4 function 2: NEC USB Host Controller (rev. 0x04)
ehci0: interrupting at irq 42
ehci0: BIOS has given up ownership
ehci0: EHCI version 1.0
ehci0: companion controllers, 3 ports each: ohci0 ohci1
usb2 at ehci0: USB revision 2.0
uhub2 at usb2
uhub2: NEC EHCI root hub, class 9/0, rev 2.00/1.00, addr 1
uhub2: 5 ports with 5 removable, self powered
com0 at mainbus0 addr 0x58000 irq 18 : ns16550a, working fifo
com0: console
ieth0 at mainbus0 addr 0x60000 irq 12 : 79RC32434 10/100 Ethernet
ieth0: Ethernet address 00:07:40:**:**:**
ieth0: Rx IRQ = 12, Tx IRQ = 13
ukphy0 at ieth0 phy 12: Generic IEEE 802.3u media interface
ukphy0: RTL8201L 10/100 media interface (OUI 0x000004, model 0x0020), rev. 1
ukphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
irtc0 at mainbus0: RICOH RS5C348A/B Real-time Clock
timecounter: Timecounter "clockinterrupt" frequency 100 Hz quality 0
timecounter: Timecounter "mips3_cp0_counter" frequency 200000000 Hz quality 100
wd0 at atabus0 drive 0: <ST3120022A>
wd0: drive supports 16-sector PIO transfers, LBA48 addressing
wd0: 111 GB, 232581 cyl, 16 head, 63 sec, 512 bytes/sect x 234441648 sectors
wd0: 32-bit data port
wd0: drive supports PIO mode 4, DMA mode 2, Ultra-DMA mode 5 (Ultra/100)
wd0(iteide0:0:0): using PIO mode 4, Ultra-DMA mode 5 (Ultra/100) (using DMA)
boot device: wd0
root on wd0e dumps on wd0b
root file system type: ffs
Sun Sep 16 13:29:35 GMT 2007
swapctl: adding /dev/wd0b as swap device at priority 0
Checking for botched superblock upgrades: done.
Starting file system checks:
/dev/rwd0e: file system is clean; not checking
/dev/rwd0g: file system is clean; not checking
/dev/rwd0j: file system is clean; not checking
Setting tty flags.
Setting sysctl variables:
Starting network.
Hostname: LS2BSD
IPv6 mode: host
Configuring network interfaces: ieth0.
add net default: gateway 192.168.11.1
Adding interface aliases:
Building databases...
Setting RTC offset to -540.
Setting date via ntp.
Mounting all filesystems...
Clearing /tmp.
Setting securelevel: kern.securelevel: 0 -> 1
Starting virecover.
Starting local daemons:.
Updating motd.
Starting sshd.
postfix/postfix-script: starting the Postfix mail system
not starting ls2_powerd.
***** LinkStation2 console switcher *****
Setting up serial-console mode.
Starting inetd.
Starting cron.
Sun Sep 16 13:30:01 JST 2007

NetBSD/evbmips (LS2BSD) (console)

login:
  • memoのほうにも書いたが、iethのMACアドレスの部分に手抜きが残っている。
  • パッチはもう少し整理したら公開します。→ http://kurobsd.ki.nu/download/testing/mipsel/patch-4/ に置きました。
    • バイナリは未定...ご本家の4.0 RELEASEの公開時を予定。

(2007-09-22)
  • evbmips-current(memo書きから移動)
    • ごにょごにょ弄ったら動いた。
NetBSD loader module loaded
kernel=/boot/test_curr.bin
boot device=0xa0000404
boot flags=0x00000000
start address=0x80100000
flushing ide devices: hda
MIPS32/64 params: cpu arch: 32
MIPS32/64 params: TLB entries: 16
MIPS32/64 params: Icache: line = 16, total = 8192, ways = 4
                 sets = 128
MIPS32/64 params: Dcache: line = 16, total = 8192, ways = 4
                 sets = 128
  picache_stride    = 2048
  picache_loopcount = 4
  pdcache_stride    = 2048
  pdcache_loopcount = 4
NetBSD 4.99.31 (LS2) #1: Sat Sep 22 20:07:43 JST 2007
        root@LS2BSD:/mnt/current/src/sys/arch/evbmips/compile/LS2
total memory = 65536 KB
avail memory = 59988 KB
mainbus0 (root)
cpu0 at mainbus0: 400.00MHz (hz cycles = 2000000, delay divisor = 200)
cpu0: MIPS 4Kc (0x1800a) Rev. 10 with software emulated floating point
cpu0: 8KB/16B 4-way set-associative L1 Instruction cache, 16 TLB entries
cpu0: 8KB/16B 4-way set-associative write-back L1 Data cache
ipci0 at mainbus0 addr 0x80000
pci0 at ipci0
pci0: i/o space, memory space enabled
iteide0 at pci0 dev 2 function 0
iteide0: Integrated Technology Express IDE controller (rev. 0x13)
iteide0: using irq 40 for native-PCI interrupt
atabus0 at iteide0 channel 0
atabus1 at iteide0 channel 1
ohci0 at pci0 dev 4 function 0: NEC USB Host Controller (rev. 0x43)
ohci0: interrupting at irq 42
ohci0: OHCI version 1.0
usb0 at ohci0: USB revision 1.0
uhub0 at usb0
uhub0: NEC OHCI root hub, class 9/0, rev 1.00/1.00, addr 1
uhub0: 3 ports with 3 removable, self powered
ohci1 at pci0 dev 4 function 1: NEC USB Host Controller (rev. 0x43)
ohci1: interrupting at irq 42
ohci1: OHCI version 1.0
usb1 at ohci1: USB revision 1.0
uhub1 at usb1
uhub1: NEC OHCI root hub, class 9/0, rev 1.00/1.00, addr 1
uhub1: 2 ports with 2 removable, self powered
ehci0 at pci0 dev 4 function 2: NEC USB Host Controller (rev. 0x04)
ehci0: interrupting at irq 42
ehci0: companion controllers, 3 ports each: ohci0 ohci1
usb2 at ehci0: USB revision 2.0
uhub2 at usb2
uhub2: NEC EHCI root hub, class 9/0, rev 2.00/1.00, addr 1
uhub2: 5 ports with 5 removable, self powered
com0 at mainbus0 addr 0x58000 irq 18 : ns16550a, working fifo
com0: console
ieth0 at mainbus0 addr 0x60000 irq 12 : 79RC32434 10/100 Ethernet
ieth0: Ethernet address 00:07:40:**:**:**
ieth0: Rx IRQ = 12, Tx IRQ = 13
ukphy0 at ieth0 phy 12: Generic IEEE 802.3u media interface
ukphy0: RTL8201L 10/100 media interface (OUI 0x000004, model 0x0020), rev. 1
ukphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
irtc0 at mainbus0: RICOH RS5C348A/B Real-time Clock
wd0 at atabus0 drive 0: <ST3120022A>
wd0: 111 GB, 232581 cyl, 16 head, 63 sec, 512 bytes/sect x 234441648 sectors
boot device: wd0
root on wd0e dumps on wd0b
root file system type: ffs
Sat Sep 22 20:14:03 GMT 2007
swapctl: adding /dev/wd0b as swap device at priority 0
Checking for botched superblock upgrades: done.
Starting file system checks:
/dev/rwd0e: file system is clean; not checking
/dev/rwd0g: file system is clean; not checking
/dev/rwd0j: file system is clean; not checking
Setting tty flags.
Setting sysctl variables:
Starting network.
Hostname: LS2BSD
IPv6 mode: host
Configuring network interfaces: ieth0ieth0: cannot assign link-local address
.
add net default: gateway 192.168.0.1
Adding interface aliases:
Building databases...
Starting syslogd.
Setting RTC offset to -540.
Setting date via ntp.
Mounting all filesystems...
Clearing /tmp.
Setting securelevel: kern.securelevel: 0 -> 1
Starting virecover.
Starting local daemons:.
Updating motd.
Starting sshd.
postfix/postfix-script: starting the Postfix mail system
not starting ls2_powerd.
***** LinkStation2 console switcher *****
Setting up serial-console mode.
Starting inetd.
Starting cron.
Sat Sep 22 20:14:29 JST 2007

NetBSD/evbmips (LS2BSD) (console)

login:

(2007-10-31)
  • 送信パケット(TCP)のチェックサム問題。
    • 当初、iethのバグかと思っていたが、どうも違うようだ。
    • aueを使っていても、頻度は低いがTCPチェックサムエラーが発生している。
    • 次に怪しいのはメモリ(cache)制御周りか。

(2007-11-02)
  • CPU cache周りで怪しいものをピックアップ。ブートログに以下のものが出ている(from cache.c)。
MIPS32/64 params: cpu arch: 32
MIPS32/64 params: TLB entries: 16
MIPS32/64 params: Icache: line = 16, total = 8192, ways = 4
                 sets = 128
MIPS32/64 params: Dcache: line = 16, total = 8192, ways = 4
                 sets = 128
  • たぶん以下のとおり。
    • cpu archはMIPS32なので32で正しい。
    • TLB entriesも16で正しい。
    • cache lineはLine Sizeだろうから、16bytesで正しい。
    • totalはキャッシュサイズだから、8192bytesで正しい。
    • Lines per setは4 way set associativeだから4で正しい。
    • sets は Number of cache setsだから、マニュアルによると256。ここは誤認している?
      • なんだか変だな...。マニュアルが間違っている??
        • ここはどうもcache.cのコーディングミスっぽいが...。
      • CP0 Register 16の値を直読してみるか...

(2007-11-03)
  • レジスタ直読。
    • CFG0は0x80050083。
    • CFG1は0x9e5b2d8a。
  • 考察。
    • CFG0の最下位3ビットはキャッシュタイプ。0x3なのでcacheable, write-back, cohelent, no write allocate.
      • これをマニュアル通りwrite-throughとするには0x0となってなければならないはず。
    • CFG1のMSBが立っているので、CFG2が有ることを意味するが、マニュアルにはここは0固定と書いてある。
  • #なんだかボロボロ orz
  • よくわからないが、マニュアルに書いてあることを(自分の都合の良いように)信じてみる。
    • cacheの扱いはr4k相当とのこと。
    • でも、MIPS32ということで、NetBSDではmips_config_cache_modern()を実行している。
    • mips_config_cache_modern()の中身は、主にmipsXX_*という関数ポインタの登録になっている。(r4k_*の登録では無い)
      • 各々対応する関数を比較すると、やはり若干異なる。
    • とりあえず確認をするため、全てのmipsXX_*をr4k_*に書き換えてみる。
  • 上記、ブートはしたのでこのまま様子をみる。
    • # cohelentまわりもフラグ指定の実験をする必要があるかも。

(2007-11-04)
  • 上記キャッシュ制御の変更、今の所効果が有った模様。
    • r4k化によって受信側でのTCP checksumは発生していない。(あくまで今の所)
    • もう少し様子を見るつもり。
    • # 仮に効果が有ったと仮定しても、現在のフレームワークに取り込んだ形での改造が厳しかったりする場所なのだが...
  • 遅くなった?のか、dnetc -benchでチェック。
[Nov 04 13:45:34 UTC] RC5-72: using core #0 (ANSI 4-pipe).
[Nov 04 13:45:54 UTC] RC5-72: Benchmark for core #0 (ANSI 4-pipe)
                      0.00:00:16.81 [25,698 keys/sec]
[Nov 04 13:45:54 UTC] RC5-72: using core #1 (ANSI 2-pipe).
[Nov 04 13:46:14 UTC] RC5-72: Benchmark for core #1 (ANSI 2-pipe)
                     0.00:00:16.77 [22,080 keys/sec]
[Nov 04 13:46:14 UTC] RC5-72: using core #2 (ANSI 1-pipe).
[Nov 04 13:46:33 UTC] RC5-72: Benchmark for core #2 (ANSI 1-pipe)
                      0.00:00:16.39 [136,541 keys/sec]
[Nov 04 13:46:33 UTC] RC5-72: using core #3 (MIPS 2-pipe).
[Nov 04 13:46:51 UTC] RC5-72: Benchmark for core #3 (MIPS 2-pipe)
                      0.00:00:16.23 [97,330 keys/sec]
[Nov 04 13:47:11 UTC] OGR-P2: Benchmark for core #0 (GARSP 6.0)
                      0.00:00:16.12 [938,492 nodes/sec]
  • 確かに4月に計った値よりも遅いなぁ orz

(2007-11-05)
  • 上記キャッシュ制御、忘れてください orz
    • 別口の変更が効果が有った可能性があるのですが、r4k_*はダメのようです。
    • # 白昼夢でも見ていたのか...

(2007-11-06)
  • ベンチマーク取り直し。
[Nov 05 14:05:47 UTC] RC5-72: using core #0 (ANSI 4-pipe).
[Nov 05 14:06:06 UTC] RC5-72: Benchmark for core #0 (ANSI 4-pipe)
                      0.00:00:16.86 [27,340 keys/sec]
[Nov 05 14:06:06 UTC] RC5-72: using core #1 (ANSI 2-pipe).
[Nov 05 14:06:26 UTC] RC5-72: Benchmark for core #1 (ANSI 2-pipe)
                      0.00:00:16.60 [23,790 keys/sec]
[Nov 05 14:06:26 UTC] RC5-72: using core #2 (ANSI 1-pipe).
[Nov 05 14:06:45 UTC] RC5-72: Benchmark for core #2 (ANSI 1-pipe)
                      0.00:00:16.34 [136,943 keys/sec]
[Nov 05 14:06:45 UTC] RC5-72: using core #3 (MIPS 2-pipe).
[Nov 05 14:07:03 UTC] RC5-72: Benchmark for core #3 (MIPS 2-pipe)
                      0.00:00:16.20 [101,595 keys/sec]
[Nov 05 14:07:23 UTC] OGR-P2: Benchmark for core #0 (GARSP 6.0)
                      0.00:00:16.10 [938,631 nodes/sec]
  • だいぶ速くなった。でも四月の結果には及ばない。
    • ブートローダーでのDDRコントローラのレジスタ操作を止めてみたのが上記。
    • 併せて、CPUキャッシュを制御できるかもしれないので、CFG0の下位3ビットを0クリアしてみている。
  • 次はCFG0の書き換えを止めてみる。
    • CFG0の書き換えを止めても全く変わらず。ここに関してはマニュアルが正しいっぽい...。

(2007-11-10)
  • 送信パケット(TCP)のチェックサム問題。
    • 思いつきを実行してみたら、何と、絶大な効果が!\(^o^)/(←大げさ)
    • (請うご期待)
  • 続き。
    • TCPチェックサムが問題なのだから、TCPチェックサムを計算する関数が問題に一番近いのではないか、という仮説(思いつき)に基づき作業。
    • TCP(に限らず)チェックサムは、in_cksum()で計算する。
    • in_cksum()は効率面からか、arch毎に作成されている場合が多い。
      • たとえばmipsの場合はarch/mips/mips/in_cksum.c, i386の場合はarch/i386/i386/in_cksum.S(アセンブラ)。
    • 最初は上記in_cksum.cをオプティマイズ無し(-O0)でコンパイルしてみたが、効果が無かった。
    • 次に、確か汎用(arch非依存)のが有ったはず、というのを思い出し、netinet/in_cksum.c(とnetinet/in4_cksum.c)を代わりに組み込んでみた。
      • mipsアーキテクチャでarch/mips/mips/in_cksum.cを外すのは通常の方法では厳しいため、configコマンドで生成されたMakefileを直接書き換えた。
    • で、今の所かなり順調なわけです。(^_^)
      • もう少し(数日?)様子を見てみます。
    • パッチが非常に作りづらいのが難点。
      • arch/mips/mips/in_cksum.cの「ここがバグ!」っていうのは判れば簡単でしょうが... orz
    • パッチ作成。
      • 中身は... ブー(AA略)なことになってしまった orz
        • (ライトサイドしか知らない良い子は真似しないでね)
    • netbsd-3, netbsd-4, currentで動作確認中。
      • 一応全部確認。(今のところ)問題無さそう。
      • 2~3日cvsyncを動かして負荷をかけてみる。
  • ベンチマーク取り直し。
    • makeoptions CPUFLAGS="-march=4kc -mtune=4kc"を外していたのを復活させた。
[Nov 10 14:28:58 UTC] RC5-72: using core #0 (ANSI 4-pipe).
[Nov 10 14:29:18 UTC] RC5-72: Benchmark for core #0 (ANSI 4-pipe)
                      0.00:00:16.86 [27,351 keys/sec]
[Nov 10 14:29:18 UTC] RC5-72: using core #1 (ANSI 2-pipe).
[Nov 10 14:29:37 UTC] RC5-72: Benchmark for core #1 (ANSI 2-pipe)
                      0.00:00:16.59 [23,808 keys/sec]
[Nov 10 14:29:37 UTC] RC5-72: using core #2 (ANSI 1-pipe).
[Nov 10 14:29:56 UTC] RC5-72: Benchmark for core #2 (ANSI 1-pipe)
                      0.00:00:16.33 [137,078 keys/sec]
[Nov 10 14:29:56 UTC] RC5-72: using core #3 (MIPS 2-pipe).
[Nov 10 14:30:15 UTC] RC5-72: Benchmark for core #3 (MIPS 2-pipe)
                      0.00:00:16.26 [101,696 keys/sec]
[Nov 10 14:30:34 UTC] OGR-P2: Benchmark for core #0 (GARSP 6.0)
                      0.00:00:16.10 [938,631 nodes/sec]
  • 若干いい感じ?

(2007-12-20)
  • 緊急告知!
    • LinkStation2をNFSクライアントとし、他のマシンのディスクをマウントした際、書き込み時にデータが化けるようです。
    • その他状況(read等)は完全には把握していませんが、大丈夫なようです。
    • ftp等での転送も確認した限り問題ないです。NFSだけのようです。
    • netbsd-3ベースでは問題はありません。netbsd-4ベースでは問題が出ています。current(4.99.40)は問題有りません。
    • もう少し詳細に追跡したいと思います。とりいそぎ。

(2008-01-26)
  • メモ書きのほうに経緯を書いていますが、PR/33152のパッチをnetbsd-4ブランチに当てることでNFSの書き込み問題は解決した模様です。
    • 上記PRのパッチを含んだ形のパッチ、およびカーネルをアップロードしました。テストをお願いします。

(なし崩しに続く...)

36400