diff options
author | Joerg Roedel <jroedel@suse.de> | 2017-06-15 04:36:22 -0400 |
---|---|---|
committer | Joerg Roedel <jroedel@suse.de> | 2017-06-16 04:21:05 -0400 |
commit | 54bd63570484167cb13edf81e31fff107b879981 (patch) | |
tree | 28e5fe4889ba7e939a9f78c51c0b50d73a6e9092 | |
parent | ac3b708ad49f77b44faa104057783f161491e9e4 (diff) |
iommu/amd: Suppress IO_PAGE_FAULTs in kdump kernel
When booting into a kdump kernel, suppress IO_PAGE_FAULTs by
default for all devices. But allow the faults again when a
domain is assigned to a device.
Signed-off-by: Joerg Roedel <jroedel@suse.de>
-rw-r--r-- | drivers/iommu/amd_iommu.c | 3 | ||||
-rw-r--r-- | drivers/iommu/amd_iommu_init.c | 9 | ||||
-rw-r--r-- | drivers/iommu/amd_iommu_types.h | 1 |
3 files changed, 12 insertions, 1 deletions
diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c index 6498f5baa7ea..95ee360a5199 100644 --- a/drivers/iommu/amd_iommu.c +++ b/drivers/iommu/amd_iommu.c | |||
@@ -2078,7 +2078,8 @@ static void set_dte_entry(u16 devid, struct protection_domain *domain, bool ats) | |||
2078 | flags |= tmp; | 2078 | flags |= tmp; |
2079 | } | 2079 | } |
2080 | 2080 | ||
2081 | flags &= ~(0xffffUL); | 2081 | |
2082 | flags &= ~(DTE_FLAG_SA | 0xffffULL); | ||
2082 | flags |= domain->id; | 2083 | flags |= domain->id; |
2083 | 2084 | ||
2084 | amd_iommu_dev_table[devid].data[1] = flags; | 2085 | amd_iommu_dev_table[devid].data[1] = flags; |
diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c index 3fa7e3b35507..cf7896550e75 100644 --- a/drivers/iommu/amd_iommu_init.c +++ b/drivers/iommu/amd_iommu_init.c | |||
@@ -29,6 +29,7 @@ | |||
29 | #include <linux/export.h> | 29 | #include <linux/export.h> |
30 | #include <linux/iommu.h> | 30 | #include <linux/iommu.h> |
31 | #include <linux/kmemleak.h> | 31 | #include <linux/kmemleak.h> |
32 | #include <linux/crash_dump.h> | ||
32 | #include <asm/pci-direct.h> | 33 | #include <asm/pci-direct.h> |
33 | #include <asm/iommu.h> | 34 | #include <asm/iommu.h> |
34 | #include <asm/gart.h> | 35 | #include <asm/gart.h> |
@@ -1900,6 +1901,14 @@ static void init_device_table_dma(void) | |||
1900 | for (devid = 0; devid <= amd_iommu_last_bdf; ++devid) { | 1901 | for (devid = 0; devid <= amd_iommu_last_bdf; ++devid) { |
1901 | set_dev_entry_bit(devid, DEV_ENTRY_VALID); | 1902 | set_dev_entry_bit(devid, DEV_ENTRY_VALID); |
1902 | set_dev_entry_bit(devid, DEV_ENTRY_TRANSLATION); | 1903 | set_dev_entry_bit(devid, DEV_ENTRY_TRANSLATION); |
1904 | /* | ||
1905 | * In kdump kernels in-flight DMA from the old kernel might | ||
1906 | * cause IO_PAGE_FAULTs. There are no reports that a kdump | ||
1907 | * actually failed because of that, so just disable fault | ||
1908 | * reporting in the hardware to get rid of the messages | ||
1909 | */ | ||
1910 | if (is_kdump_kernel()) | ||
1911 | set_dev_entry_bit(devid, DEV_ENTRY_NO_PAGE_FAULT); | ||
1903 | } | 1912 | } |
1904 | } | 1913 | } |
1905 | 1914 | ||
diff --git a/drivers/iommu/amd_iommu_types.h b/drivers/iommu/amd_iommu_types.h index 6960d7db2fab..294a409e283b 100644 --- a/drivers/iommu/amd_iommu_types.h +++ b/drivers/iommu/amd_iommu_types.h | |||
@@ -322,6 +322,7 @@ | |||
322 | #define IOMMU_PTE_IW (1ULL << 62) | 322 | #define IOMMU_PTE_IW (1ULL << 62) |
323 | 323 | ||
324 | #define DTE_FLAG_IOTLB (1ULL << 32) | 324 | #define DTE_FLAG_IOTLB (1ULL << 32) |
325 | #define DTE_FLAG_SA (1ULL << 34) | ||
325 | #define DTE_FLAG_GV (1ULL << 55) | 326 | #define DTE_FLAG_GV (1ULL << 55) |
326 | #define DTE_FLAG_MASK (0x3ffULL << 32) | 327 | #define DTE_FLAG_MASK (0x3ffULL << 32) |
327 | #define DTE_GLX_SHIFT (56) | 328 | #define DTE_GLX_SHIFT (56) |