From 283501dfaf627b5dc0e5509eeb9b29dc54403ca7 Mon Sep 17 00:00:00 2001 From: leoliu-oc Date: Thu, 23 May 2024 16:50:33 +0800 Subject: [PATCH 1/2] anolis: x86/pci-dma: Fix logical error in patch_do_basic_check() ANBZ: #9155 The purpose of the if statement in function patch_do_basic_check() regarding dir is to return false only when dir is not equal to DMA_FROM_DEVICE or DMA_BIDIRECTIONAL. Therefore, the '||' (logical OR) should be replaced with '&&' (logical AND). Fixes: fb5016b847cf ("anolis: Fix streaming DMA writes disorder issue for Zhaoxin's KH-40000 platform") Signed-off-by: leoliu-oc --- arch/x86/kernel/pci-dma.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/x86/kernel/pci-dma.c b/arch/x86/kernel/pci-dma.c index afd1e0a22895..3269c3b33295 100644 --- a/arch/x86/kernel/pci-dma.c +++ b/arch/x86/kernel/pci-dma.c @@ -195,7 +195,7 @@ static int patch_do_basic_check(struct device *dev, { u64 dma_mask = *dev->dma_mask; - if (dir != DMA_FROM_DEVICE || dir != DMA_BIDIRECTIONAL) + if (dir != DMA_FROM_DEVICE && dir != DMA_BIDIRECTIONAL) return false; if (dma_mask <= DMA_BIT_MASK(32)) -- Gitee From e3b2e872709382c8e638c0e26e3281b9464c2d09 Mon Sep 17 00:00:00 2001 From: leoliu-oc Date: Tue, 28 May 2024 14:25:05 +0800 Subject: [PATCH 2/2] anolis: Fix dev->node equal to NUMA_NO_NODE issue ANBZ: #9155 Some device or driver issues lead to dev->numa_node equal to NUMA_NO_NODE(-1). The preferred_nid of the __alloc_pages_node_mask() function cannot pass in negative values, so add the judgement of dev->numa_node. Signed-off-by: leoliu-oc --- drivers/iommu/dma-iommu.c | 5 ++++- kernel/dma/direct.c | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c index fbe2601ba3e1..0d1352b7a7a1 100644 --- a/drivers/iommu/dma-iommu.c +++ b/drivers/iommu/dma-iommu.c @@ -1234,7 +1234,10 @@ static void *iommu_dma_alloc_pages(struct device *dev, size_t size, page = dma_alloc_contiguous(dev, alloc_size, gfp); if (!page) { if (is_zhaoxin_kh40000()) { - if (!(gfp & (GFP_DMA | GFP_DMA32))) { + if (node == NUMA_NO_NODE) { + page = __alloc_pages_nodemask(gfp, get_order(alloc_size), + numa_mem_id(), NULL); + } else if (!(gfp & (GFP_DMA | GFP_DMA32))) { nodemask_t nodemask; nodes_clear(nodemask); diff --git a/kernel/dma/direct.c b/kernel/dma/direct.c index ea0044a1f2dc..70d18bcc73cb 100644 --- a/kernel/dma/direct.c +++ b/kernel/dma/direct.c @@ -113,7 +113,10 @@ static struct page *__dma_direct_alloc_pages(struct device *dev, size_t size, again: if (!page) { if (is_zhaoxin_kh40000()) { - if (!(gfp & (GFP_DMA | GFP_DMA32))) { + if (node == NUMA_NO_NODE) { + page = __alloc_pages_nodemask(gfp, get_order(size), + numa_mem_id(), NULL); + } else if (!(gfp & (GFP_DMA | GFP_DMA32))) { nodemask_t nodemask; nodes_clear(nodemask); -- Gitee