| From a1617e3860b4d2cd453c3196908f3ccaf6225105 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 28 Aug 2019 17:39:43 -0400 |
| Subject: iommu/amd: Silence warnings under memory pressure |
| |
| From: Qian Cai <cai@lca.pw> |
| |
| [ Upstream commit 3d708895325b78506e8daf00ef31549476e8586a ] |
| |
| When running heavy memory pressure workloads, the system is throwing |
| endless warnings, |
| |
| smartpqi 0000:23:00.0: AMD-Vi: IOMMU mapping error in map_sg (io-pages: |
| 5 reason: -12) |
| Hardware name: HPE ProLiant DL385 Gen10/ProLiant DL385 Gen10, BIOS A40 |
| 07/10/2019 |
| swapper/10: page allocation failure: order:0, mode:0xa20(GFP_ATOMIC), |
| nodemask=(null),cpuset=/,mems_allowed=0,4 |
| Call Trace: |
| <IRQ> |
| dump_stack+0x62/0x9a |
| warn_alloc.cold.43+0x8a/0x148 |
| __alloc_pages_nodemask+0x1a5c/0x1bb0 |
| get_zeroed_page+0x16/0x20 |
| iommu_map_page+0x477/0x540 |
| map_sg+0x1ce/0x2f0 |
| scsi_dma_map+0xc6/0x160 |
| pqi_raid_submit_scsi_cmd_with_io_request+0x1c3/0x470 [smartpqi] |
| do_IRQ+0x81/0x170 |
| common_interrupt+0xf/0xf |
| </IRQ> |
| |
| because the allocation could fail from iommu_map_page(), and the volume |
| of this call could be huge which may generate a lot of serial console |
| output and cosumes all CPUs. |
| |
| Fix it by silencing the warning in this call site, and there is still a |
| dev_err() later to notify the failure. |
| |
| Signed-off-by: Qian Cai <cai@lca.pw> |
| Signed-off-by: Joerg Roedel <jroedel@suse.de> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/iommu/amd_iommu.c | 4 +++- |
| 1 file changed, 3 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c |
| index a1174e61daf4e..07b6cf58fd99b 100644 |
| --- a/drivers/iommu/amd_iommu.c |
| +++ b/drivers/iommu/amd_iommu.c |
| @@ -2568,7 +2568,9 @@ static int map_sg(struct device *dev, struct scatterlist *sglist, |
| |
| bus_addr = address + s->dma_address + (j << PAGE_SHIFT); |
| phys_addr = (sg_phys(s) & PAGE_MASK) + (j << PAGE_SHIFT); |
| - ret = iommu_map_page(domain, bus_addr, phys_addr, PAGE_SIZE, prot, GFP_ATOMIC); |
| + ret = iommu_map_page(domain, bus_addr, phys_addr, |
| + PAGE_SIZE, prot, |
| + GFP_ATOMIC | __GFP_NOWARN); |
| if (ret) |
| goto out_unmap; |
| |
| -- |
| 2.20.1 |
| |