]> nv-tegra.nvidia Code Review - linux-2.6.git/commitdiff
Merge branch 'core-iommu-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 11 Sep 2009 20:16:37 +0000 (13:16 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 11 Sep 2009 20:16:37 +0000 (13:16 -0700)
* 'core-iommu-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: (59 commits)
  x86/gart: Do not select AGP for GART_IOMMU
  x86/amd-iommu: Initialize passthrough mode when requested
  x86/amd-iommu: Don't detach device from pt domain on driver unbind
  x86/amd-iommu: Make sure a device is assigned in passthrough mode
  x86/amd-iommu: Align locking between attach_device and detach_device
  x86/amd-iommu: Fix device table write order
  x86/amd-iommu: Add passthrough mode initialization functions
  x86/amd-iommu: Add core functions for pd allocation/freeing
  x86/dma: Mark iommu_pass_through as __read_mostly
  x86/amd-iommu: Change iommu_map_page to support multiple page sizes
  x86/amd-iommu: Support higher level PTEs in iommu_page_unmap
  x86/amd-iommu: Remove old page table handling macros
  x86/amd-iommu: Use 2-level page tables for dma_ops domains
  x86/amd-iommu: Remove bus_addr check in iommu_map_page
  x86/amd-iommu: Remove last usages of IOMMU_PTE_L0_INDEX
  x86/amd-iommu: Change alloc_pte to support 64 bit address space
  x86/amd-iommu: Introduce increase_address_space function
  x86/amd-iommu: Flush domains if address space size was increased
  x86/amd-iommu: Introduce set_dte_entry function
  x86/amd-iommu: Add a gneric version of amd_iommu_flush_all_devices
  ...

1  2 
arch/x86/kernel/pci-dma.c

index fa80f60e9607db49e4ed1b3266869d961828afe9,8fb4ce35bea201adf11358ef2cecd60425d12865..d71c8655905b4c4d8e2dbc3a729a4224d44b18ab
@@@ -3,7 -3,6 +3,7 @@@
  #include <linux/dmar.h>
  #include <linux/bootmem.h>
  #include <linux/pci.h>
 +#include <linux/kmemleak.h>
  
  #include <asm/proto.h>
  #include <asm/dma.h>
@@@ -33,7 -32,14 +33,14 @@@ int no_iommu __read_mostly
  /* Set this to 1 if there is a HW IOMMU in the system */
  int iommu_detected __read_mostly = 0;
  
- int iommu_pass_through;
+ /*
+  * This variable becomes 1 if iommu=pt is passed on the kernel command line.
+  * If this variable is 1, IOMMU implementations do no DMA ranslation for
+  * devices and allow every device to access to whole physical memory. This is
+  * useful if a user want to use an IOMMU only for KVM device assignment to
+  * guests and not for driver dma translation.
+  */
+ int iommu_pass_through __read_mostly;
  
  dma_addr_t bad_dma_address __read_mostly = 0;
  EXPORT_SYMBOL(bad_dma_address);
@@@ -89,11 -95,6 +96,11 @@@ void __init dma32_reserve_bootmem(void
        size = roundup(dma32_bootmem_size, align);
        dma32_bootmem_ptr = __alloc_bootmem_nopanic(size, align,
                                 512ULL<<20);
 +      /*
 +       * Kmemleak should not scan this block as it may not be mapped via the
 +       * kernel direct mapping.
 +       */
 +      kmemleak_ignore(dma32_bootmem_ptr);
        if (dma32_bootmem_ptr)
                dma32_bootmem_size = size;
        else
@@@ -153,7 -154,7 +160,7 @@@ again
                return NULL;
  
        addr = page_to_phys(page);
-       if (!is_buffer_dma_capable(dma_mask, addr, size)) {
+       if (addr + size > dma_mask) {
                __free_pages(page, get_order(size));
  
                if (dma_mask < DMA_BIT_MASK(32) && !(flag & GFP_DMA)) {