ZBOX nano VD01のHDDが遅い (4)
2012/03/10(土) 22:09 NetBSD はてブ情報 はてブに登録 はてブ数

さらにtsutsuiさんからdmesgのwd0が表示する内容でUDMAに関する表示が出ているはずなので確認してみてはどうか、というアドバイスを頂いたので早速確認。

まずは、UDMA 0 (sc->sc_wdcdev.sc_atac.atac_udma_cap = 0) です。
wd0 at atabus0 drive 0
wd0: <WDC WD1600BEVT-24A23T0>
wd0: drive supports 16-sector PIO transfers, LBA48 addressing
wd0: 149 GB, 310101 cyl, 16 head, 63 sec, 512 bytes/sect x 312581808 sectors
wd0: 32-bit data port
wd0: drive supports PIO mode 4, DMA mode 2, Ultra-DMA mode 6 (Ultra/133)
wd0(viaide0:0:0): using PIO mode 4, DMA mode 2 (using DMA)
次はUDMA 6 (sc->sc_wdcdev.sc_atac.atac_udma_cap = 6) の場合です。
wd0 at atabus0 drive 0
wd0: <WDC WD1600BEVT-24A23T0>
wd0: drive supports 16-sector PIO transfers, LBA48 addressing
wd0: 149 GB, 310101 cyl, 16 head, 63 sec, 512 bytes/sect x 312581808 sectors
wd0: 32-bit data port
wd0: drive supports PIO mode 4, DMA mode 2, Ultra-DMA mode 6 (Ultra/133)
wd0(viaide0:0:0): using PIO mode 4, Ultra-DMA mode 6 (Ultra/133) (using DMA)
ほとんど同じですが、最後の行が違いますね。比べてみましょう。
UDMAメッセージ
0wd0(viaide0:0:0): using PIO mode 4, DMA mode 2 (using DMA)
6wd0(viaide0:0:0): using PIO mode 4, Ultra-DMA mode 6 (Ultra/133) (using DMA)
なるほど。たしかに、変わっていますね。

これで/sys/dev/pci/viaide.c#604
    602 	sc->sc_wdcdev.sc_atac.atac_pio_cap = 4;
    603 	sc->sc_wdcdev.sc_atac.atac_dma_cap = 2;
    604 	sc->sc_wdcdev.sc_atac.atac_set_modes = via_setup_channel;
    605 	sc->sc_wdcdev.sc_atac.atac_channels = sc->wdc_chanarray;
    606 	sc->sc_wdcdev.sc_atac.atac_nchannels = PCIIDE_NUM_CHANNELS;
から/sys/dev/pci/viaide.c#via_setup_channelが呼ばれ、759行目でUDMA 6としての設定をレジスタにセットしているようですね。
    753 			case PCI_VENDOR_VIATECH:
    754 				if (sc->sc_wdcdev.sc_atac.atac_udma_cap == 6) {
    755 					/* 8233a */
    756 					udmatim_reg |= APO_UDMA_TIME(
    757 					    chp->ch_channel,
    758 					    drive,
    759 					    via_udma133_tim[drvp->UDMA_mode]);
    760 				} else if (sc->sc_wdcdev.sc_atac.atac_udma_cap == 5) {
via_udma133_timって何かと見てみると/sys/dev/pci/pciide_apollo_reg.h#149に次のように書かれています。
    149 static const int8_t via_udma133_tim[] __unused =
    150     {0x07, 0x07, 0x06, 0x04, 0x02, 0x01, 0x00};
先のdmesgのとおりdrvp->UDMA_modeは6ですから、えーと、0x00が設定されるってことですね。

うーん、この辺までくると、さっぱり中身がわからなくなってきしたが、何となくUDMAが6での転送に失敗したらUDMA 5に落とされて0x01が使われて... といったfall backに使われるんでしょうかねぇ。

ということで、ドライバとしてもUDMAのモードを意識した実装だということがわかった (ような気がする) ので、すっきりしました。

話は変わりますが、http://nxr.netbsd.orgってほんと便利ですよね。

名前:  非公開コメント   

  • TB-URL  http://www.tokuda.net/diary/0780/tb/

ZBOX nano VD01のHDDが遅い (3)
2012/03/10(土) 15:00 NetBSD はてブ情報 はてブに登録 はてブ数

前回の日記を書いて、さらにtsutsuiさんからコメントを頂きました。

どうやら、昔のVIAチップの設計がイマイチで、それを回避するコードが入っていたそうです。

最近のVIAチップはそういう回避コードは不要になっているにもかかわらず、回避コードの下に慣習的に各々のVIA IDE個別の設定が追加されていったようです。

今回のケースではその回避コードが逆に悪さをしてうまく動いていないということですね。むしろ、最近のチップがちゃんと動いているのか心配になってしまいます。

じゃぁ、回避コードのルートに乗っかる前に、さっさと処理をしてしまえばよいということで、次のような修正を加えることにしました。
--- ./sys/dev/pci/viaide.c.orig 2011-12-29 05:25:40.000000000 +0000
+++ ./sys/dev/pci/viaide.c      2012-03-10 12:43:07.00000000
@@ -464,6 +469,11 @@
                        interface = PCIIDE_INTERFACE_BUS_MASTER_DMA |
                            PCIIDE_INTERFACE_PCI(0) | PCIIDE_INTERFACE_PCI(1);
                        break;
+               case PCI_PRODUCT_VIATECH_VX900_IDE:
+                       aprint_normal_dev(sc->sc_wdcdev.sc_atac.atac_dev,
+                           "VIA Technologies VX900 ATA133 controller\n");
+                       sc->sc_wdcdev.sc_atac.atac_udma_cap = 6;
+                       break;
                default:
                        /*
                         * get a PCI tag for the ISA bridge.
起動すると期待どおりのメッセージが表示されました。
viaide0 at pci0 dev 15 function 0
viaide0: VIA Technologies VX900 ATA133 controller
viaide0: bus-master DMA support present
viaide0: primary channel configured to native-PCI mode
viaide0: using ioapic0 pin 21 for native-PCI interrupt
atabus0 at viaide0 channel 0
viaide0: secondary channel configured to native-PCI mode
atabus1 at viaide0 channel 1
やりましたね!

それでは、dbenchしてみましょう!
Throughput 60.1017 MB/sec 5 procs
あれ?! おかしいな。もう一回。
Throughput 62.8053 MB/sec 5 procs
おっ! 先ほどよりは良くなりましたね。って言っても前回の不完全パッチでも
Throughput 63.8846 MB/sec 5 procs
ということで、数値的にはほとんど変わらないという結果になりました。

dbehcnの数字が60MB/s程度だとして、これが何を意味するのかは他の結果と比較してみなければなりませんが、とても乱暴にUDMA 4 (66MB/s) 相当の速度と仮置きしておくことにしましょう。

せっかくUDMAを0から6にしたのに効果は得られていないようです。おかしいですね。

仮説としては三つくらいでしょうか。
  • 不完全パッチでもUDMA 0ではなくUDMA 4相当が使われていた
  • 今回の修正でもまだ不十分でUDMA 4相当で動いている
  • 実はちゃんと動いているけどdbenchがかけるワークロードではUDMAの差が数字として現れない
仮説の最初の二つを考える上で気になっているのは、VX900のSATAコントローラを使っているにもかかわらず、viaideドライバ上ではPATAとして処理されているっぽいというところです。OpenBSDでもPATAとして扱われているので、そういうもの、なのかもしれませんが気になってしまいます。

SATAコントローラがPATAコンパチモードで動くとUDMAの指定はともかく、そこそこの速度で動いてくれるという動作なのかもしれません。

じゃぁ、SATAで動かせばいいじゃないかという話になるのですが、実は試行錯誤をしていた段階で
        { PCI_PRODUCT_VIATECH_VX900_IDE,
          0,
          NULL,
          via_chip_map,
        },
のところを
          via_sata_chip_map_7,
にして動かしてみたのですが、起動時にpanicしてそれ以降深く追っかけていなかったのです。せっかくのSATAコントローラなのですからSATAで動かしたいものですね。

三つ目の仮説であるdbenchどうなの、という話は確かにあって、ベンチマークプログラムの選択はなかなか奥が深いですね。

このようなディスクの話であればiozoneが良いのではないかとお勧めされたりしているのですが、iozoneのオプションを見て、そっと閉じる、という情けない状態だったりします。

いくつか宿題は残っていますが、一定の結論がでたのでsend-prに向けて準備を進めたいと思います。

1: tsutsui 2012年03月10日(土) 午後3時53分

dmesgのドライブ側の行で
wd0: drive supports PIO mode 4, DMA mode 2, Ultra-DMA mode 6 (Ultra/133)
wd0(viaide0:0:0): using PIO mode 4, DMA mode 2, Ultra-DMA mode 6 (Ultra/133) (
using DMA)
みたいな行が出ていると思うんですが、そこの表示は変わっているんじゃないかと。
速度についてはドライブ側の限界なのかもしれませんが、VX900について調べて
みないとすぐにはわかりませんね。


名前:  非公開コメント   

  • TB-URL  http://www.tokuda.net/diary/0779/tb/