Kernel panic: PCI-DMA: high address but no IOMMU

次のエントリーでその効果について書きますが、メモリを2GBプラスして、合計 4GB にして参照系のデータ周りを /dev/shm に移動しようと思ってメモリ買って増設してみたんですけど、Kernel Panic で起動しませぬ・・・orz

サーバ停止を極力影響が少ない5時くらいに工事実施していたわけですが、なんっていうかこんな画面でフリーズします。眠いし焦っていたので写真ぼけてます。

PICT0170.JPG

- スポンサーリンク -

CentOS 4.2 - x86_64 を使っているので、Kernel は 2.6.9-22 を使ってます。うーむ。。。何だこのエラーは?

PCI-DMA: More than 4GB of RAM and no IOMMU
PCI-DMA: 32bit PCI IO may malfunction.<6> PCI DMA: disabling IOMMU
Kernel panic - not syncing: PCI-DMA: high address but no IOMMU

英語なページをかなーり検索しまくって情報集めたのですが、

  • Athlon 64 X2 Dual Core
  • Kernel 2.6.9 系
  • 4GB のメモリ
  • ASUS A8N 系のマザーボード

特有?(←うそかも・・・)のバグみたいです。詳細は、Bug 169115: Kernel panic when more than 4GB RAM and no IOMMU で情報が得られるわけですが、This was fixed in RHEL 4 U4 と書かれているので、一応最新の Kernel 2.6.9-55 では修正されているのかな??

なんだか、4GB のメモリはいわゆる一般的なデスクトップ PC ではいろいろと鬼門な気がします。

ちなみに、ソースで言うと、pci-gart.c あたりが kernel panic している場所なんですが、実際はこの関数を叩いている上の部分のロジックの不具合が原因っぽいです。なのでソースを結構追わないとダメっぽく、時間がないので解析しません。Kernel の update は今週末あたりにでもやろうかな。

static inline int need_iommu(struct device *dev, unsigned long addr, size_t size)
{ 
	u64 mask = *dev->dma_mask;
	int high = addr + size >= mask;
	int mmu = high;
	if (force_iommu) 
		mmu = 1; 
	if (no_iommu) { 
		if (high) 
			panic("PCI-DMA: high address but no IOMMU.\n"); 
		mmu = 0; 
	} 	
	return mmu; 
}

static inline int nonforced_iommu(struct device *dev, unsigned long addr, size_t size)
{ 
	u64 mask = *dev->dma_mask;
	int high = addr + size >= mask;
	int mmu = high;
	if (no_iommu) { 
		if (high) 
			panic("PCI-DMA: high address but no IOMMU.\n"); 
		mmu = 0; 
	} 	
	return mmu; 
}

__追記__ : 実際に yum 使って Kernel を最新に update してみる

yum update kernel
yum update kernel-devel
yum update kernel-utils
yum update kernel-smp
yum update kernel-smp-devel

で Kernel を最新のバージョンにすることで、無事に 4GB を認識して OS が立ち上がりました。取りあえず現時点で update された Kernel のバージョンは

Linux version 2.6.9-55.ELsmp (mockbuild@builder6.centos.org) (gcc version 3.4.6 20060404 (Red Hat 3.4.6-8)) #1 SMP Wed May 2 14:04:42 EDT 2007

でした。どのバージョンでこの不具合が修正されたかまでは調べてませんが、取りあえず 2.6.9-55 では OK だったので同様の不具合がでた場合はご参考までに。

- スポンサーリンク -