diff options
-rw-r--r-- | 0000_README | 4 | ||||
-rw-r--r-- | 1800_iommu-amd-dma-direct-revert.patch | 164 |
2 files changed, 0 insertions, 168 deletions
diff --git a/0000_README b/0000_README index f45eebec..76ef0960 100644 --- a/0000_README +++ b/0000_README @@ -59,10 +59,6 @@ Patch: 1003_linux-4.17.4.patch From: http://www.kernel.org Desc: Linux 4.17.4 -Patch: 1800_iommu-amd-dma-direct-revert.patch -From: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/patch/?id=e16c4790de39dc861b749674c2a9319507f6f64f -Desc: Revert iommu/amd_iommu: Use CONFIG_DMA_DIRECT_OPS=y and dma_direct_{alloc,free}(). See bug #658538. - Patch: 1500_XATTR_USER_PREFIX.patch From: https://bugs.gentoo.org/show_bug.cgi?id=470644 Desc: Support for namespace user.pax.* on tmpfs. diff --git a/1800_iommu-amd-dma-direct-revert.patch b/1800_iommu-amd-dma-direct-revert.patch deleted file mode 100644 index a78fa02f..00000000 --- a/1800_iommu-amd-dma-direct-revert.patch +++ /dev/null @@ -1,164 +0,0 @@ -From e16c4790de39dc861b749674c2a9319507f6f64f Mon Sep 17 00:00:00 2001 -From: Linus Torvalds <torvalds@linux-foundation.org> -Date: Mon, 11 Jun 2018 12:22:12 -0700 -Subject: Revert "iommu/amd_iommu: Use CONFIG_DMA_DIRECT_OPS=y and - dma_direct_{alloc,free}()" -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This reverts commit b468620f2a1dfdcfddfd6fa54367b8bcc1b51248. - -It turns out that this broke drm on AMD platforms. Quoting Gabriel C: - "I can confirm reverting b468620f2a1dfdcfddfd6fa54367b8bcc1b51248 fixes - that issue for me. - - The GPU is working fine with SME enabled. - - Now with working GPU :) I can also confirm performance is back to - normal without doing any other workarounds" - -Christan König analyzed it partially: - "As far as I analyzed it we now get an -ENOMEM from dma_alloc_attrs() - in drivers/gpu/drm/ttm/ttm_page_alloc_dma.c when IOMMU is enabled" - -and Christoph Hellwig responded: - "I think the prime issue is that dma_direct_alloc respects the dma - mask. Which we don't need if actually using the iommu. This would be - mostly harmless exept for the the SEV bit high in the address that - makes the checks fail. - - For now I'd say revert this commit for 4.17/4.18-rc and I'll look into - addressing these issues properly" - -Reported-and-bisected-by: Gabriel C <nix.or.die@gmail.com> -Acked-by: Christoph Hellwig <hch@lst.de> -Cc: Christian König <christian.koenig@amd.com> -Cc: Michel Dänzer <michel.daenzer@amd.com> -Cc: Joerg Roedel <jroedel@suse.de> -Cc: Tom Lendacky <thomas.lendacky@amd.com> -Cc: Andrew Morton <akpm@linux-foundation.org> -Cc: stable@kernel.org # v4.17 -Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> ---- - drivers/iommu/Kconfig | 1 - - drivers/iommu/amd_iommu.c | 68 ++++++++++++++++++++++++++++++++--------------- - 2 files changed, 47 insertions(+), 22 deletions(-) - -diff --git a/drivers/iommu/Kconfig b/drivers/iommu/Kconfig -index 8ea77ef..e055d22 100644 ---- a/drivers/iommu/Kconfig -+++ b/drivers/iommu/Kconfig -@@ -107,7 +107,6 @@ config IOMMU_PGTABLES_L2 - # AMD IOMMU support - config AMD_IOMMU - bool "AMD IOMMU support" -- select DMA_DIRECT_OPS - select SWIOTLB - select PCI_MSI - select PCI_ATS -diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c -index 0cea80be..596b95c 100644 ---- a/drivers/iommu/amd_iommu.c -+++ b/drivers/iommu/amd_iommu.c -@@ -2596,32 +2596,51 @@ static void *alloc_coherent(struct device *dev, size_t size, - unsigned long attrs) - { - u64 dma_mask = dev->coherent_dma_mask; -- struct protection_domain *domain = get_domain(dev); -- bool is_direct = false; -- void *virt_addr; -+ struct protection_domain *domain; -+ struct dma_ops_domain *dma_dom; -+ struct page *page; -+ -+ domain = get_domain(dev); -+ if (PTR_ERR(domain) == -EINVAL) { -+ page = alloc_pages(flag, get_order(size)); -+ *dma_addr = page_to_phys(page); -+ return page_address(page); -+ } else if (IS_ERR(domain)) -+ return NULL; - -- if (IS_ERR(domain)) { -- if (PTR_ERR(domain) != -EINVAL) -+ dma_dom = to_dma_ops_domain(domain); -+ size = PAGE_ALIGN(size); -+ dma_mask = dev->coherent_dma_mask; -+ flag &= ~(__GFP_DMA | __GFP_HIGHMEM | __GFP_DMA32); -+ flag |= __GFP_ZERO; -+ -+ page = alloc_pages(flag | __GFP_NOWARN, get_order(size)); -+ if (!page) { -+ if (!gfpflags_allow_blocking(flag)) - return NULL; -- is_direct = true; -- } - -- virt_addr = dma_direct_alloc(dev, size, dma_addr, flag, attrs); -- if (!virt_addr || is_direct) -- return virt_addr; -+ page = dma_alloc_from_contiguous(dev, size >> PAGE_SHIFT, -+ get_order(size), flag); -+ if (!page) -+ return NULL; -+ } - - if (!dma_mask) - dma_mask = *dev->dma_mask; - -- *dma_addr = __map_single(dev, to_dma_ops_domain(domain), -- virt_to_phys(virt_addr), PAGE_ALIGN(size), -- DMA_BIDIRECTIONAL, dma_mask); -+ *dma_addr = __map_single(dev, dma_dom, page_to_phys(page), -+ size, DMA_BIDIRECTIONAL, dma_mask); -+ - if (*dma_addr == AMD_IOMMU_MAPPING_ERROR) - goto out_free; -- return virt_addr; -+ -+ return page_address(page); - - out_free: -- dma_direct_free(dev, size, virt_addr, *dma_addr, attrs); -+ -+ if (!dma_release_from_contiguous(dev, page, size >> PAGE_SHIFT)) -+ __free_pages(page, get_order(size)); -+ - return NULL; - } - -@@ -2632,17 +2651,24 @@ static void free_coherent(struct device *dev, size_t size, - void *virt_addr, dma_addr_t dma_addr, - unsigned long attrs) - { -- struct protection_domain *domain = get_domain(dev); -+ struct protection_domain *domain; -+ struct dma_ops_domain *dma_dom; -+ struct page *page; - -+ page = virt_to_page(virt_addr); - size = PAGE_ALIGN(size); - -- if (!IS_ERR(domain)) { -- struct dma_ops_domain *dma_dom = to_dma_ops_domain(domain); -+ domain = get_domain(dev); -+ if (IS_ERR(domain)) -+ goto free_mem; - -- __unmap_single(dma_dom, dma_addr, size, DMA_BIDIRECTIONAL); -- } -+ dma_dom = to_dma_ops_domain(domain); -+ -+ __unmap_single(dma_dom, dma_addr, size, DMA_BIDIRECTIONAL); - -- dma_direct_free(dev, size, virt_addr, dma_addr, attrs); -+free_mem: -+ if (!dma_release_from_contiguous(dev, page, size >> PAGE_SHIFT)) -+ __free_pages(page, get_order(size)); - } - - /* --- -cgit v1.1 - |