]> git.baikalelectronics.ru Git - kernel.git/commit
x86: Split swiotlb initialization into two stages
authorFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Tue, 15 Dec 2009 11:47:56 +0000 (20:47 +0900)
committerIngo Molnar <mingo@elte.hu>
Tue, 15 Dec 2009 12:01:57 +0000 (13:01 +0100)
commitca09c932b7ff7bd3315b473d3e8b790598d0afd6
tree363fa110d9f4a785abf26cd9979dd60c0ed92a99
parent549adca61e042d9bba11f989f879d17ad5ea0115
x86: Split swiotlb initialization into two stages

The commit 54f4993544d723484f13c35506c136dfc7c0ac84 moves
swiotlb initialization before dma32_free_bootmem(). It's
supposed to fix a bug that the commit
f40fc6585b664d0ae7a7833b11b9db5a06edacc7 introduced, we
initialize SWIOTLB right after dma32_free_bootmem so we wrongly
steal memory area allocated for GART with broken BIOS earlier.

However, the above commit introduced another problem, which
likely breaks machines with huge amount of memory. Such a box
use the majority of DMA32_ZONE so there is no memory for
swiotlb.

With this patch, the x86 IOMMU initialization sequence are:

1. We set swiotlb to 1 in the case of (max_pfn > MAX_DMA32_PFN
   && !no_iommu). If swiotlb usage is forced by the boot option,
   we go to the step 3 and finish (we don't try to detect IOMMUs).

2. We call the detection functions of all the IOMMUs. The
   detection function sets x86_init.iommu.iommu_init to the IOMMU
   initialization function (so we can avoid calling the
   initialization functions of all the IOMMUs needlessly).

3. We initialize swiotlb (and set dma_ops to swiotlb_dma_ops) if
   swiotlb is set to 1.

4. If the IOMMU initialization function doesn't need swiotlb
   (e.g. the initialization is sucessful) then sets swiotlb to zero.

5. If we find that swiotlb is set to zero, we free swiotlb
   resource.

Reported-by: Yinghai Lu <yinghai@kernel.org>
Reported-by: Roland Dreier <rdreier@cisco.com>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
LKML-Reference: <20091215204729A.fujita.tomonori@lab.ntt.co.jp>
Tested-by: Yinghai Lu <yinghai@kernel.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
arch/x86/include/asm/swiotlb.h
arch/x86/kernel/pci-dma.c
arch/x86/kernel/pci-swiotlb.c