![FUJITA Tomonori](/assets/img/avatar_default.png)
The commitf4780ca005
moves swiotlb initialization before dma32_free_bootmem(). It's supposed to fix a bug that the commit75f1cdf1dd
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>
24 lines
443 B
C
24 lines
443 B
C
#ifndef _ASM_X86_SWIOTLB_H
|
|
#define _ASM_X86_SWIOTLB_H
|
|
|
|
#include <linux/swiotlb.h>
|
|
|
|
#ifdef CONFIG_SWIOTLB
|
|
extern int swiotlb;
|
|
extern int __init pci_swiotlb_detect(void);
|
|
extern void __init pci_swiotlb_init(void);
|
|
#else
|
|
#define swiotlb 0
|
|
static inline int pci_swiotlb_detect(void)
|
|
{
|
|
return 0;
|
|
}
|
|
static inline void pci_swiotlb_init(void)
|
|
{
|
|
}
|
|
#endif
|
|
|
|
static inline void dma_mark_clean(void *addr, size_t size) {}
|
|
|
|
#endif /* _ASM_X86_SWIOTLB_H */
|