Linux kernel enable the IOMMU - input / output memory management unit support
One of our regular reader asks:
How do I turn on IOMMU (Linux kernel Calgary patch) DMA support under Linux?
Most modern Linux has support for IOMMU. An IOMMU is a device that will support mapping memory addresses. There is currently high-end branded server hardware that support this, but no desktop machines support IOMMU, AFAIK. An example IOMMU is the AGP and PCI Express graphics cards.
More about IOMMU
According to wikipedia:
The IOMMU or input/output memory management unit is a computer memory management unit (MMU) that connects a DMA-capable I/O bus to the primary storage memory. Like the CPU memory management unit, an IOMMU takes care of mapping virtual addresses (also called device addresses or I/O addresses) to physical addresses and some units guarantee memory protection from misbehaving devices.

[ Image: Comparison of the I/O memory management unit (IOMMU) to the memory management unit (MMU) ]
The advantages of having an IOMMU, compared to direct physical addressing of the memory, include:
- Large regions of memory can be allocated without the need to be contiguous in physical memory - the IOMMU will take care of mapping contiguous virtual addresses to fragmented physical addresses. Thus, the use of vectored I/O (scatter-gather lists) can sometimes be avoided.
- Memory protection from malicious or misbehaving devices \u2013 a device cannot read or write to memory that hasn't been explicitly allocated (mapped) for it.
- Virtualized guest operating systems can safely be granted direct access to hardware.
- In general, the IOMMU provides isolation (memory protection) and address translatio
Turn on IOMMU
In order to turn on IOMMU, you need to pass following parameter to boot kernel (assuming that support is compiled into running kernel - most modern Linux kernel / distro has support, for e.g. Fedora / CentOS / RHEL / Suse etc):
iommu=calgary
Open /etc/grub.conf or /boot/grub/menu.lst file
vi grub.conf
Append above string to kernel line:
kernel /boot/vmlinuz-2.6.17-10-generic root=UUID=317464f6-8be2-4f54-88e3-694dcc8cd3c4 ro quiet splash iommu=calgary
Save and close the file. Reboot the server.
A note about IOMMU support
Please note that you need hardware and software to support IOMMU. Above instructions will just turn on Linux kernel software support. Since current hardware support is limited to high-end expensive server most Linux distro does not enable calgary DMA address mapping with memory protection by default.
See also:
=> AMD I/O Virtualization Technology (IOMMU) Specification
You may also be interested in other helpful articles:
- How to optimize a web page for faster and better experience
- Git revision control software howto
- How to keep files safe from accidental overwriting with noclobber under BASH shell
- FreeNAS server howto
- nixCraft FAQ Roundup
Leave a Reply
We encourage your comments, and suggestions. But please stay on topic, be polite, and avoid spam. Thank you very much for stopping by our site!
Tags: agp_and_pci, calgary, calgary_iommu_patch, device_addresses, iommu, linux_kernel, memory_management_unit, memory_protection, mmu, pci_express_graphics_cards, server_only_feature



Recent Comments
Yesterday ~ 24 Comments
Yesterday ~ 24 Comments
Yesterday ~ 3 Comments
Yesterday ~ 2 Comments
09/05/2008 06:08 pm (2 days ago) ~ 16 Comments