1
linux/drivers/pci
Keshavamurthy, Anil S eb3fa7cb51 Intel IOMMU: Avoid memory allocation failures in dma map api calls
Intel IOMMU driver needs memory during DMA map calls to setup its internal
page tables and for other data structures.  As we all know that these DMA map
calls are mostly called in the interrupt context or with the spinlock held by
the upper level drivers(network/storage drivers), so in order to avoid any
memory allocation failure due to low memory issues, this patch makes memory
allocation by temporarily setting PF_MEMALLOC flags for the current task
before making memory allocation calls.

We evaluated mempools as a backup when kmem_cache_alloc() fails
and found that mempools are really not useful here because
 1) We don't know for sure how much to reserve in advance
 2) And mempools are not useful for GFP_ATOMIC case (as we call
    memory alloc functions with GFP_ATOMIC)

(akpm: point 2 is wrong...)

With PF_MEMALLOC flag set in the current->flags, the VM subsystem avoids any
watermark checks before allocating memory thus guarantee'ing the memory till
the last free page.  Further, looking at the code in mm/page_alloc.c in
__alloc_pages() function, looks like this flag is useful only in the
non-interrupt context.

If we are in the interrupt context and memory allocation in IOMMU driver fails
for some reason, then the DMA map api's will return failure and it is up to
the higher level drivers to retry.  Suppose, if upper level driver programs
the controller with the buggy DMA virtual address, the IOMMU will block that
DMA transaction when that happens thus preventing any corruption to main
memory.

So far in our test scenario, we were unable to create any memory allocation
failure inside dma map api calls.

Signed-off-by: Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com>
Cc: Andi Kleen <ak@suse.de>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Muli Ben-Yehuda <muli@il.ibm.com>
Cc: "Siddha, Suresh B" <suresh.b.siddha@intel.com>
Cc: Arjan van de Ven <arjan@infradead.org>
Cc: Ashok Raj <ashok.raj@intel.com>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Christoph Lameter <clameter@sgi.com>
Cc: Greg KH <greg@kroah.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2007-10-22 08:13:18 -07:00
..
hotplug Get rid of unused variable warning in drivers/pci/hotplug/pci_hotplug_core.c 2007-10-15 09:07:58 -07:00
pcie pci: implement "pci=noaer" 2007-10-12 15:03:17 -07:00
.gitignore
access.c [PATCH] severing module.h->sched.h 2006-12-04 02:00:22 -05:00
bus.c pci: do not mark exported functions as __devinit 2007-05-02 19:02:35 -07:00
dmar.c Intel IOMMU: DMAR detection and parsing logic 2007-10-22 08:13:18 -07:00
hotplug.c Driver core: change add_uevent_var to use a struct 2007-10-12 14:51:01 -07:00
htirq.c PCI: Use pci_find_ht_capability() in drivers/pci/htirq.c 2006-12-20 10:54:42 -08:00
intel-iommu.c Intel IOMMU: Avoid memory allocation failures in dma map api calls 2007-10-22 08:13:18 -07:00
intel-iommu.h Intel IOMMU: Intel IOMMU driver 2007-10-22 08:13:18 -07:00
iova.c Intel IOMMU: IOVA allocation and management routines 2007-10-22 08:13:18 -07:00
iova.h Intel IOMMU: IOVA allocation and management routines 2007-10-22 08:13:18 -07:00
Kconfig PCI: remove the broken PCI_MULTITHREAD_PROBE option 2007-05-02 19:02:38 -07:00
Makefile Intel IOMMU: Intel IOMMU driver 2007-10-22 08:13:18 -07:00
msi.c MSI: Use correct data offset for 32-bit MSI in read_msi_msg() 2007-10-12 15:03:17 -07:00
msi.h PCI: Make some MSI-X #defines generic 2006-12-01 14:36:56 -08:00
pci-acpi.c ACPI: restore CONFIG_ACPI_SLEEP 2007-07-29 16:53:59 -07:00
pci-driver.c Merge master.kernel.org:/pub/scm/linux/kernel/git/gregkh/pci-2.6 2007-10-12 15:50:23 -07:00
pci-sysfs.c Remove capability.h from mm.h 2007-07-16 09:05:45 -07:00
pci.c more trivial signedness fixes in drivers 2007-10-14 12:41:52 -07:00
pci.h Intel IOMMU: PCI generic helper function 2007-10-22 08:13:18 -07:00
probe.c Intel IOMMU: PCI generic helper function 2007-10-22 08:13:18 -07:00
proc.c pci: write file size to inode on proc bus file write 2007-10-12 15:03:17 -07:00
quirks.c PCI: re-enable onboard sound on "MSI K8T Neo2-FIR" 2007-10-12 15:03:16 -07:00
remove.c PCI: add pci_stop_bus_device 2006-09-26 17:43:54 -07:00
rom.c [IA64] SN: Correct ROM resource length for BIOS copy 2007-07-09 13:37:18 -07:00
search.c Intel IOMMU: PCI generic helper function 2007-10-22 08:13:18 -07:00
setup-bus.c PCI: remove transparent bridge sizing 2007-10-12 15:03:17 -07:00
setup-irq.c kobjects: fix up improper use of the kobject name field 2007-10-12 14:51:02 -07:00
setup-res.c pci: do not mark exported functions as __devinit 2007-05-02 19:02:35 -07:00
syscall.c pci syscall.c: Switch to refcounting API 2007-07-11 16:02:07 -07:00