Received: by 2002:a25:c205:0:0:0:0:0 with SMTP id s5csp2523804ybf; Mon, 2 Mar 2020 10:19:16 -0800 (PST) X-Google-Smtp-Source: ADFU+vv4iS3KGvgiln6T8Ph0pGvO/DrUPS4R7+bq5ni4qzXhF4j/WRTlVys/FQkuHAuxC222bIoq X-Received: by 2002:a05:6830:1daf:: with SMTP id z15mr339552oti.57.1583173156015; Mon, 02 Mar 2020 10:19:16 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1583173156; cv=none; d=google.com; s=arc-20160816; b=YA1KWA2kj7lPnp0euNJmGzlEH2Jr6nPPv3fb03P2JiTGQqEM/O4p+wfnTaYekZxRj/ sz7u9Mj39ugjtmkjZkKl9WwstSjNb0kG152/CqXrLUC7pk3huW7t/rZg4k4rN0E6W4Ge PHcHHvadbxCgw1RrxvRht6cm62ucoglSEyc7v5dwk6bkVzxqHDkgwpZroceCj89kUkpQ g/ogsZp5qg/J75A6XPhBZOF2YjxvTO4ZCUmk3ihvP9XzAzGojHsVTZo8mvoFmCMC3fj8 przpJXULHzY2iBM5fDqfTQqxz9pDtJCehN/5NmwdDoHJIER9AYvBdYZ6kzuRupjRVaDY oItw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from; bh=KLTpBA84rjueVwsHKfx0dqLUjgq7A9rq9g8maxTdxUY=; b=gcqOIQPObVwvy8AQ5Xd8AXGvVj3tkg9JJXHCGGtK5OTitzdc1xUxTK3gzHrN8oXTUc SBAJh3pZ8ZrxJtX9ShSycUQ8J9V/olTJcTFfnfsrPIRisGkvd83AX/+s53KhF9kY7Isf wSJ3A9wWp6+ok0YZ10DUxvjyen1nDiBZpu02lt6Mofn2FjQOmPP+mCVlfc2w4O347ySW SOaNUxNpuMdu5DVSAwW3/Au34oS+M/W3dHEZfMA01klAWUVkTW1cvbX7VQqPQNRFGgZI Rg9fl2ka/0/axkxndWctw3SDifsUmETbzaoCKw/HNXOIGJ0RPvHaXxLq8nd7qo6vLdS1 EmTg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f19si4767347otf.18.2020.03.02.10.19.03; Mon, 02 Mar 2020 10:19:15 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727414AbgCBSR2 (ORCPT + 99 others); Mon, 2 Mar 2020 13:17:28 -0500 Received: from mout.kundenserver.de ([217.72.192.75]:60683 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726451AbgCBSR2 (ORCPT ); Mon, 2 Mar 2020 13:17:28 -0500 Received: from methusalix.internal.home.lespocky.de ([109.250.99.45]) by mrelayeu.kundenserver.de (mreue107 [212.227.15.183]) with ESMTPSA (Nemesis) id 1MhCq4-1jeKsj2SoM-00eP3P; Mon, 02 Mar 2020 19:16:51 +0100 Received: from lemmy.internal.home.lespocky.de ([192.168.243.175] helo=lemmy.home.lespocky.de) by methusalix.internal.home.lespocky.de with esmtpsa (TLSv1.3:TLS_AES_256_GCM_SHA384:256) (Exim 4.92.3) (envelope-from ) id 1j8pcV-00019g-Di; Mon, 02 Mar 2020 19:16:48 +0100 Received: (nullmailer pid 21156 invoked by uid 2001); Mon, 02 Mar 2020 18:16:47 -0000 From: Alexander Dahl To: x86@kernel.org Cc: Thomas Gleixner , Ingo Molnar , Borislav Petkov , "H . Peter Anvin" , iommu@lists.linux-foundation.org, linux-kernel@vger.kernel.org, Alan Jenkins , Alexander Dahl Subject: [PATCH] dma: Fix max PFN arithmetic overflow on 32 bit systems Date: Mon, 2 Mar 2020 19:16:12 +0100 Message-Id: <20200302181612.20597-1-post@lespocky.de> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Scan-Signature: 7719f4cb0a203ae1a5f64d3866c1573d X-Spam-Score: -2.6 (--) X-Provags-ID: V03:K1:8B37tE9F2d8izwA/UGPTWbhBuKeo+jRutJy6I7/WLDKVHQsW/DV iO1kegFF2RaNOdoRni9TU0dRHbMUJ+9k6MAoADpjWanR5E/IJ3yKmUSHB9nQTMtU4j0mFzk Kj8TCvHP9wnYrUG2gIITeaGUAaDG8HcLt0iTCr9RT+VCz1KwuWOtQRu4sWCTBRz3y/XCza/ qxffYem9wHCi6lbSMMYnw== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1;V03:K0:rnpPttj3NGg=:Mr3Pecror39pfDvFqmoom6 luO0uKV28oTDMnPJSsBAGB6ck0JCdKr5UsxhuAhfrqHP8/Ug4fx7fqLE5I5PoXIxdyk4RBb4c sQ2g/vb2dfNGjVE8ZC1t9xzDrh8/jrwleIt2J8gr088eHfFLye226Fq3w8Xp7mz2eaOpcTxlz Q/7+dkqhvlpIY0shFQoHk8BzhH+5/+jHwd9BWqjEW/C7VPEtjET5eTkI6khDzaNRwZERw7Lwh FF+zjsG8pZm76Ki0+FEPvI2TZnAms6OM6McQ0Td7zlZr+ozp7DkQWOCQohhNtAYo51vclvD5v ESj38IweKQtfRghLkHZtKHDt9wiyxmtGa/pIBD4U2WyFkGP3gNveyWXfZ+3XBJRFQduYCuSBM T73MSBcA9NBpWeftQEz/Yf0Pu+C+O5vsaFWCuwosgjKBjSb0Dmsel7T3LBdVRV4jI1WPMwqxF ZXWjR9XFv61ZvTFccun7Km7XC7Jm5A7iGijSCveg7c+NpTiqKHM1uqBuUKcZSMCg/HBG7cC+W QDk32pSh6sM5Vxe8G6PxhIYwZbqGyARzNKX/pvs0R9YtsgfIHwKoEpC+3N4ruinC0la02SI7A Ng2Ro1Wels0uTkLmkWgpX7hYRSdU/i43v7ChE/yl5VTqgxRBQXZNZ1Af036uMCOXWDPuU8uQu 2JdIoizWvntYOa8xWQVaT7FN09C2J02b3j17NqZoTBwaaS6CMAcKfIGToJHvqPqm+SFgss/Ik VBFsKxx7gP+ay2uZiKOPIxuGq1XxWGUVP0C99d5S03q7Rh84neRUdnC2TNIM4QGZmhZYyVq/t V8AfUmMEM4wOJWXSyk74gM/NaPHKfuHJkhWwq0pXUDcPRB+duFXq14rYhuMjnjDksthzBLq Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org For ARCH=x86 (32 bit) when you set CONFIG_IOMMU_INTEL since c5a5dc4cbbf4 ("iommu/vt-d: Don't switch off swiotlb if bounce page is used") there's a dependency on CONFIG_SWIOTLB, which was not necessarily active before. The init code for swiotlb in 'pci_swiotlb_detect_4gb()' compares something against MAX_DMA32_PFN to decide if it should be active. However that define suffers from an arithmetic overflow since 1b7e03ef7570 ("x86, NUMA: Enable emulation on 32bit too") when it was first made visible to x86_32. The effect is at boot time 64 MiB (default size) were allocated for bounce buffers now, which is a noticeable amount of memory on small systems. We noticed this effect on the fli4l Linux distribution when migrating from kernel v4.19 (LTS) to v5.4 (LTS) on boards like pcengines ALIX 2D3 with 256 MiB memory for example: Linux version 5.4.22 (buildroot@buildroot) (gcc version 7.3.0 (Buildroot 2018.02.8)) #1 SMP Mon Nov 26 23:40:00 CET 2018 … Memory: 183484K/261756K available (4594K kernel code, 393K rwdata, 1660K rodata, 536K init, 456K bss , 78272K reserved, 0K cma-reserved, 0K highmem) … PCI-DMA: Using software bounce buffering for IO (SWIOTLB) software IO TLB: mapped [mem 0x0bb78000-0x0fb78000] (64MB) The initial analysis and the suggested fix was done by user 'sourcejedi' at stackoverflow and explicitly marked as GPLv2 for inclusion in the Linux kernel: https://unix.stackexchange.com/a/520525/50007 Fixes: https://web.nettworks.org/bugs/browse/FFL-2560 Fixes: https://unix.stackexchange.com/q/520065/50007 Suggested-by: Alan Jenkins Signed-off-by: Alexander Dahl --- We tested this in qemu and on real hardware with fli4l on top of v5.4, v5.5, and v5.6-rc kernels, but only as far as the reserved memory goes. The patch itself is based on v5.6-rc3 (IIRC). A quick grep over the kernel code showed me this define MAX_DMA32_PFN is used in other places as well. I would appreciate feedback on this, because I can not oversee all side effects this might have?! Thanks again to Alan who proposed the fix, and for his permission to send it upstream. Greets Alex --- arch/x86/include/asm/dma.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/x86/include/asm/dma.h b/arch/x86/include/asm/dma.h index 00f7cf45e699..e25514eca8d6 100644 --- a/arch/x86/include/asm/dma.h +++ b/arch/x86/include/asm/dma.h @@ -74,7 +74,7 @@ #define MAX_DMA_PFN ((16UL * 1024 * 1024) >> PAGE_SHIFT) /* 4GB broken PCI/AGP hardware bus master zone */ -#define MAX_DMA32_PFN ((4UL * 1024 * 1024 * 1024) >> PAGE_SHIFT) +#define MAX_DMA32_PFN (4UL * ((1024 * 1024 * 1024) >> PAGE_SHIFT)) #ifdef CONFIG_X86_32 /* The maximum address that we can perform a DMA transfer to on this platform */ -- 2.20.1