« パーランマウム 「we are PARANMAUM」 | メイン | PC-MW70J de Linux (目次) »

2005年8月 1日

PC-MW70J de Linux #4

Category: Linux

[-> 目次]

おそらく細かい設定は今日で最後になると思います。本当はビデオカードの部分をもう少しなんとかしたいですが使えるのでよしとします。やはり DMA 転送が出来ないとどうしようもないということでなんとかならないものかと調べたところ、どうも設定レベルではなんともならないということが分かってきました。

それでもなんとかしたいということで Google で検索をしていると Parallel IDE HDD への DMAアクセスができない。というページを見つけました。このページを参考にカーネルを修正することを決意しました。以下がそのパッチとなります(ここにファイル[linux-2.4.27_ich6m.patch]を置いておきます )。

diff -uNr linux-2.4.27/drivers/ide/pci/piix.c linux-2.4.27_ich6m/drivers/ide/pci/piix.c --- linux-2.4.27/drivers/ide/pci/piix.c 2004-08-08 08:26:04.000000000 +0900 +++ linux-2.4.27_ich6m/drivers/ide/pci/piix.c 2005-08-01 01:21:16.000000000 +0900 @@ -155,6 +155,7 @@ case PCI_DEVICE_ID_INTEL_82801E_11: case PCI_DEVICE_ID_INTEL_ESB_2: case PCI_DEVICE_ID_INTEL_ICH6_2: + case PCI_DEVICE_ID_INTEL_ICH6_5: p += sprintf(p, "PIIX4 Ultra 100 "); break; case PCI_DEVICE_ID_INTEL_82372FB_1: @@ -294,6 +295,7 @@ case PCI_DEVICE_ID_INTEL_82801EB_11: case PCI_DEVICE_ID_INTEL_ESB_2: case PCI_DEVICE_ID_INTEL_ICH6_2: + case PCI_DEVICE_ID_INTEL_ICH6_5: mode = 3; break; /* UDMA 66 capable */ @@ -688,6 +690,7 @@ case PCI_DEVICE_ID_INTEL_82801E_11: case PCI_DEVICE_ID_INTEL_ESB_2: case PCI_DEVICE_ID_INTEL_ICH6_2: + case PCI_DEVICE_ID_INTEL_ICH6_5: { unsigned int extra = 0; pci_read_config_dword(dev, 0x54, &extra); @@ -885,6 +888,7 @@ { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 18}, { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB_2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 19}, { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 20}, + { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_5, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 21}, { 0, }, }; diff -uNr linux-2.4.27/drivers/ide/pci/piix.h linux-2.4.27_ich6m/drivers/ide/pci/piix.h --- linux-2.4.27/drivers/ide/pci/piix.h 2004-04-14 22:05:30.000000000 +0900 +++ linux-2.4.27_ich6m/drivers/ide/pci/piix.h 2005-08-01 01:18:44.000000000 +0900 @@ -333,6 +333,20 @@ .enablebits = {{0x41,0x80,0x80}, {0x43,0x80,0x80}}, .bootable = ON_BOARD, .extra = 0, + },{ /* 21 */ + .vendor = PCI_VENDOR_ID_INTEL, + .device = PCI_DEVICE_ID_INTEL_ICH6_5, + .name = "ICH6M", + .init_setup = init_setup_piix, + .init_chipset = init_chipset_piix, + .init_iops = NULL, + .init_hwif = init_hwif_piix, + .init_dma = init_dma_piix, + .channels = 2, + .autodma = AUTODMA, + .enablebits = {{0x41,0x80,0x80}, {0x43,0x80,0x80}}, + .bootable = ON_BOARD, + .extra = 0, },{ .vendor = 0, .device = 0, diff -uNr linux-2.4.27/include/linux/pci_ids.h linux-2.4.27_ich6m/include/linux/pci_ids.h --- linux-2.4.27/include/linux/pci_ids.h 2004-08-08 08:26:06.000000000 +0900 +++ linux-2.4.27_ich6m/include/linux/pci_ids.h 2005-08-01 01:16:41.000000000 +0900 @@ -1935,6 +1935,7 @@ #define PCI_DEVICE_ID_INTEL_ICH6_0 0x2640 #define PCI_DEVICE_ID_INTEL_ICH6_1 0x2641 #define PCI_DEVICE_ID_INTEL_ICH6_2 0x266f +#define PCI_DEVICE_ID_INTEL_ICH6_5 0x2653 #define PCI_DEVICE_ID_INTEL_ICH6_18 0x266e #define PCI_DEVICE_ID_INTEL_82850_HB 0x2530 #define PCI_DEVICE_ID_INTEL_82845G_HB 0x2560

このパッチを Vine 3.1 の最新カーネル 2.4.27-0vl7.6 に mkkpkg を実行する際に SPEC ファイルを書き換えるという形であててカーネルを再構築。再起動をしてみた。すると dmesg で

Uniform Multi-Platform E-IDE driver Revision: 7.00beta4-2.4 ide: Assuming 33MHz system bus speed for PIO modes; override with idebus=xx ICH6M: IDE controller at PCI slot 00:1f.2 ICH6M: chipset revision 4 ICH6M: not 100% native mode: will probe irqs later ide0: BM-DMA at 0x1810-0x1817, BIOS settings: hda:DMA, hdb:pio ide1: BM-DMA at 0x1818-0x181f, BIOS settings: hdc:DMA, hdd:pio hda: MATSHITADVD-RAM UJ-822S, ATAPI CD/DVD-ROM drive hdc: FUJITSU MHV2080AT, ATA DISK drive blk: queue c0423b5c, I/O limit 4095Mb (mask 0xffffffff) ide0 at 0x1f0-0x1f7,0x3f6 on irq 14 ide1 at 0x170-0x177,0x376 on irq 15

のようにきちんとチップセットを認識するようになり、デフォルトで DMA 転送がオンになっている状態になりました。そして hdparm -Tt を実行した結果

DMA 転送オフの場合
/dev/hdc:
Timing cached reads: 3508MB in 2.00 seconds = 1754.00 MB/sec
Timing buffered disk reads: 6MB in 3.94 sec = 1.52 MB/sec

DMA 転送オンの場合
Timing cached reads: 3580MB in 2.00 seconds = 1790.00 MB/sec
Timing buffered disk reads: 82MB in 3.02 sec = 27.15 MB/sec

のように無事に10倍以上のパフォーマンスになりました。その結果、ハードディスクに書き込み中に固まる問題も無事に解決しました!確証はないですが、このパッチはカーネル 2.4.26 以降の 2.4.x ならばそのまま使えるのではないかなと思います。

かなりとりあえずで作ったパッチですので、問題が発生するかもしれません(まぁ、私はこのまま使いますので人柱がいることになりますが…)。その場合は自己責任ということで。

最後にもしこのパッチを利用したいディストリビューションなどありましたら特に許可は入りませんので自由に持って行ってください。報告も下さるとうれしいですが、特にいりません。

(2005/09/23 追記)
上のパッチをあててカーネルを再構築する方法ですが、上のパッチ(ファイル名は linux-2.4.27_ich6m.patch とします)を rpm/SOURCES ディレクトリにおきます。次に通常のカーネルパッケージ作成のように

# mkkpkg kernel-2.4.x-0vlx.x.src.rpm

を実行します。途中で SPEC ファイルを書き換えますか?というメニューがありますので、 [y] を入力して編集します。パッチ番号はバッティングしないように 30000 としました。「# END OF PATCH DEFINITIONS」という行の前に

# # enable DMA for Intel 82801FBM (ICH6M) IDE controler # Patch30000: linux-2.4.27_ich6m.patch

を追加、そして「# END OF PATCH APPLICATIONS」という行の前に

# # enable DMA for Intel 82801FBM (ICH6M) IDE controler # %patch30000 -p1

を追加します。そして保存、終了後は通常のカーネルの再構築及びアップデートの方法に従います。

投稿者 kato : 2005年8月 1日 02:35

トラックバック

このエントリーのトラックバックURL:
http://cachu.xrea.jp/MT/mt-tb-1328e30.cgi/483

コメント

僕も某社のラックマウントサーバーに Vine を入れたときに同じDMA転送の問題に遭遇していたので,週明けにでもコメントしようと思っていたのですが,もう解決されてましたか...
最新を追わない Vine にはありがちな問題なのでしょうが,日頃の安定性を考えると Vine はやっぱり手放せません.でも,Boot CD がはじめから Serial ATA を認識してくれるともっと助かるのですが...
ちょっと Boot CD のシステムをいじっている暇がないので...

投稿者 M坂 : 2005年8月 1日 03:48

> もう解決されてましたか...
しばらく放置をしておくつもりだったのですが、バックアップをしていたデータの復旧作業中は
ほとんど固まってしまう状態になってしまったので、これはしゃれにならないということで処置を
しました。カーネルを書き換えることになるとは思いませんでしたが…

メッセージ見れば分かるのですが、なぜかこのマシン hda が光学ドライブで hdc がハードディスクに
なっている。そのせいか dmesg でたまにエラーが出ているんだよねぇ。確実に出るのは lilo を
更新させたとき…

> 最新を追わない Vine にはありがちな問題なのでしょうが
言い換えれば我々も最新を追ってはいけないのかもしれない ^^;

どこかで少し書きましたが、このマシン kernel 2.6 にすると光学ドライブを認識してくれません。
なので、CD Plamo で 2.6 を選んで起動させようとするとドライブの認識に失敗してその後
当然ですが起動できずに失敗をします。
そういう意味では 2.6 系が標準のディストリビューションはもっとはまるのかも。

投稿者 きゃちゅ : 2005年8月 1日 04:27

コメントしてください




保存しますか?