The reason the CPU is all the time 100% used I think it is different than the message you are seeing.
About the error message
AMD-Vi: IOAPIC not in IVRS table and
AMD-Vi: No southbridge IOAPIC found in IVRS tableerrors. Those messages mean that your CMOS/BIOS setup is configured to enable IOMMU, but BIOS lacks IVRS table that is describing which is the address of IOMMU and SMBus Controller. IVRS = I/O Virtualization Reporting Structure. See also: http://support.amd.com/TechDocs/48882_IOMMU.pdf
What is IOMMU?
IOMMU is a hardware unit that today is part of CPU. It allows to map device-visible virtual addresses to physical addresses.
- IOMMU allows to have better security and protect your computer from some attacks from someone having access to some busses like PCIe and firewire.
- you can expose a physical PCIe device to a VM.
- it is required for SR-IOV (VNF)
Fixing "AMD-Vi: IOAPIC not in IVRS table"
- Update motherboard firmware
The proper fix should come from hardware manufacturer of the motherboard. So if you have a BIOS/firmware update for your motherboard, install it as this might fix the problem. Unfortunately for my motherboard (Asus Crosshair V Formula) the IVRS is broken even in the latest BIOS/firmware update (version 1703, Release Date: 10/17/2012).
- Linux workarround
If the manufacturer of the MB is not offering a fix, you can fix this in Linux by specifying in the kernel startup parameters where those devices are located using
Here are the steps to do it. For more details see: https://ubuntuforums.org/showthread.php?t=2254677
Boot your kernel by adding
amd_iommu_dump=1 to the kernel options. You can do this via grub menu during boot.
In the kernel log, you will see some lines like:
$ dmesg |grep 'DEV_SPECIAL(IOAPIC\|not in IVRS table'
[ 0.133756] AMD-Vi: DEV_SPECIAL(IOAPIC) devid: 00:14.0
[ 0.133995] AMD-Vi: DEV_SPECIAL(IOAPIC) devid: 00:00.1
[ 0.134116] [Firmware Bug]: AMD-Vi: IOAPIC not in IVRS table
[ 0.134235] [Firmware Bug]: AMD-Vi: IOAPIC not in IVRS table
Write down the indexes from
IOAPIC. In this case those are
6. Note the devid, where
00:14.0 is ok and
00:00.1 is incorrect.
Search for the bus address for those devices and write down the addresses (
$ lspci -nn | egrep "SMBus | IOMMU"
00:00.2 IOMMU : Advanced Micro Devices, Inc. [AMD/ATI] RD890S/RD990 I/O Memory Management Unit (IOMMU) [1002:5a23]
00:14.0 SMBus [0c05]: Advanced Micro Devices, Inc. [AMD/ATI] SBx00 SMBus Controller [1002:4385] (rev 42)
Now add as kernel parameters:
ivrs_ioapic=00:14.0 ivrs_ioapic=00:00.2 where index
6 were found in dmesg output and the values are from lspci output. You can make this permanent by editing
/etc/default/grub file, then running
grub2-mkconfig -o /boot/grub2/grub.cfg.
- Disable IOMMU in UEFI/BIOS configuration
Disabling IOMMU has a small performance benefit. But it is undesirable to disable it for security and stability of the system. IOMMU is required for certain virtualization setups (PCI pass-through, SR-IOV) and disabling it is not an option.