From patchwork Wed Nov 14 08:22:41 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 10682105 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 50AF71747 for ; Wed, 14 Nov 2018 08:23:46 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 431462A654 for ; Wed, 14 Nov 2018 08:23:46 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 35A602B020; Wed, 14 Nov 2018 08:23:46 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.7 required=2.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 704F22A654 for ; Wed, 14 Nov 2018 08:23:45 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 7FF6A6B000C; Wed, 14 Nov 2018 03:23:42 -0500 (EST) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 786276B000D; Wed, 14 Nov 2018 03:23:42 -0500 (EST) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 58F236B000E; Wed, 14 Nov 2018 03:23:42 -0500 (EST) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-pf1-f199.google.com (mail-pf1-f199.google.com [209.85.210.199]) by kanga.kvack.org (Postfix) with ESMTP id 105BE6B000C for ; Wed, 14 Nov 2018 03:23:42 -0500 (EST) Received: by mail-pf1-f199.google.com with SMTP id j9-v6so12633665pfn.20 for ; Wed, 14 Nov 2018 00:23:42 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:dkim-signature:from:to:cc:subject:date :message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=myR/cwXzcA/VYB1gW1Z2qOHtz5a1jt+CXG/0fJrNc+0=; b=KvNFvOYWHSI4afpiOaUWWDpVn5sXeeyldJdiFHpOH/PRVE1oyqIR1KbXejfhDPOi9l M7rRnyXsNiddvxz29CQnUlRqjRv1jwe2DTu553yiA7HLB4/8/uMctI254NXxCHj3I9Hv tgqC+b/AnkgXuTLFeC1AznVUq61l1ZCRQszmPadvXIpvUbFZ9E09v86v4pQ50ft45enw W16gWmLm1vvI1uXXnLOyl71CGf2+aYVbMmXTI0vCR2E+wmbZ+q2MuxSLv1Q6w19PBcfW s4h0zfy3lspeNiH+4T8KQlng+F2tQlFvB5zqgXrjpdxCGc/z/yiDrXf0SdNhO38z/C9g L5aA== X-Gm-Message-State: AGRZ1gJBgYRNCfnEwU5q7iVfc2wrC+W8LSR5iz6TLhJ/5lZGFKPOl64s O+LBZqtBpbqk9e5cc8rs9tnASXV3ZAl5Y3sD5kttTlNhqgap6Dq1zBLnC/JnoachNnsCnLQwWa0 OYBfE/IAhRWjLAEGNJUoBxbz80oC/92wHIyweLZwRRiSDSLXDDfQQz1y/1fAxAHA= X-Received: by 2002:a63:3858:: with SMTP id h24mr867212pgn.300.1542183821690; Wed, 14 Nov 2018 00:23:41 -0800 (PST) X-Google-Smtp-Source: AJdET5dvvNQ/ScZt6pUxHx/NPj9NmNA2GwYXSaHPGgkA6H5O5XL6mJQZJZLMi5aYbGHkhZ21AI5X X-Received: by 2002:a63:3858:: with SMTP id h24mr867173pgn.300.1542183820585; Wed, 14 Nov 2018 00:23:40 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1542183820; cv=none; d=google.com; s=arc-20160816; b=ivqe6HCjnrFWG2exECfE1bnnIrEJyoMnME4iBNccJ3tXda+wNxpbuWMkXFCif039qW /iXccfs8B7dX2m9uoIlBlfUJlW+pdKW8MJ2Ky/dsDn1hC0UEHBXMWv3pO3bRi/7GCFAi H44i4kroI7FEgDBpYgHvDcN65ceSDd+kltIHcnMaXhpmPMFdKbQzgeEOd0O7hHWYGcCg XVVfjqFGPbZbFzs1qb2Q1qir4lAwW9vi7X9hBoYFqjZgc5DlSRBN+gwBdrDTvui8KBvS OIAe/L7K42qdMckiexdK7gzYqM/BVEisB36sty+4BiWumLuhCgkUdV9pWuJ6T6ttQ/f+ uoPg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:dkim-signature; bh=myR/cwXzcA/VYB1gW1Z2qOHtz5a1jt+CXG/0fJrNc+0=; b=HnVaVyqVf6T/yZSasw113KXSZD4Z/jcjyQjIOoPqplxaTtXMpGe3jgncJFckj9axQw GsTzYKAYsoNPoVoZ8h6Xgd7eH3sSPcX2XNNmxj5FGl8UZU964UNmE/4hDBpTYQJh7AdW AvJX8cO9SLDmhuWEtfEZ7jtvaH1fM33ERdaQYtKQYJOX8s4Cv0VogwsrjFlGrCkwmoGV 0wc4FADTLt+b+iXNl+RW1ZGM0T0uweKJzBNeNvYGHotseQR0hx4XweprDM6dGyj7P9TT amcr3Qnsjwqmg2SVtW8y6CcGd7rPR/KQC8N+NYdnqoNFyWjmHnpJHQRwKIUJ7sZp1avT i62w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@infradead.org header.s=bombadil.20170209 header.b=k9XmMmXp; spf=pass (google.com: best guess record for domain of batv+ddbc6e1cf1a82b64ebec+5561+infradead.org+hch@bombadil.srs.infradead.org designates 2607:7c80:54:e::133 as permitted sender) smtp.mailfrom=BATV+ddbc6e1cf1a82b64ebec+5561+infradead.org+hch@bombadil.srs.infradead.org Received: from bombadil.infradead.org (bombadil.infradead.org. [2607:7c80:54:e::133]) by mx.google.com with ESMTPS id 62-v6si23863435pla.217.2018.11.14.00.23.40 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 14 Nov 2018 00:23:40 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of batv+ddbc6e1cf1a82b64ebec+5561+infradead.org+hch@bombadil.srs.infradead.org designates 2607:7c80:54:e::133 as permitted sender) client-ip=2607:7c80:54:e::133; Authentication-Results: mx.google.com; dkim=pass header.i=@infradead.org header.s=bombadil.20170209 header.b=k9XmMmXp; spf=pass (google.com: best guess record for domain of batv+ddbc6e1cf1a82b64ebec+5561+infradead.org+hch@bombadil.srs.infradead.org designates 2607:7c80:54:e::133 as permitted sender) smtp.mailfrom=BATV+ddbc6e1cf1a82b64ebec+5561+infradead.org+hch@bombadil.srs.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From :Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=myR/cwXzcA/VYB1gW1Z2qOHtz5a1jt+CXG/0fJrNc+0=; b=k9XmMmXpq0fvUEXO9rRp+6JOz2 Er6kOMP2FW1ytcLZTZV0cEc+HT7ZvLVZv/dkrEGeR1hOngKvHgyVeQtCdwT1y/KhOGTFRTjcDf54J NwsY/FwOHj/EnfTL+5TGUV4CAFhK6Ua//4JpqMHxCZ+vQ72ygWszhXBO9UqmP/1SV5jAMzoeNcY4R IiRbkgURkEout/XIhXAkIkAxpTNmfOj9lOP9CseuY8mumitnR+XvOxz5NLdcBqrexBazaUJAYvvmA 6/hcUx000PDvv4bb/q44cUIcy2bQZ/ZS+OVLVAP3uHEvdQ98ySNwJcW/GCcqCGzbExd0RltMxDZcx 7e5LN/IA==; Received: from 089144211136.atnat0020.highway.a1.net ([89.144.211.136] helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.90_1 #2 (Red Hat Linux)) id 1gMqSF-0004ak-3H; Wed, 14 Nov 2018 08:23:19 +0000 From: Christoph Hellwig To: Benjamin Herrenschmidt , Paul Mackerras , Michael Ellerman Cc: linuxppc-dev@lists.ozlabs.org, iommu@lists.linux-foundation.org, linux-mm@kvack.org, linux-arch@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 01/34] powerpc: use mm zones more sensibly Date: Wed, 14 Nov 2018 09:22:41 +0100 Message-Id: <20181114082314.8965-2-hch@lst.de> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20181114082314.8965-1-hch@lst.de> References: <20181114082314.8965-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: X-Virus-Scanned: ClamAV using ClamSMTP Powerpc has somewhat odd usage where ZONE_DMA is used for all memory on common 64-bit configfs, and ZONE_DMA32 is used for 31-bit schemes. Move to a scheme closer to what other architectures use (and I dare to say the intent of the system): - ZONE_DMA: optionally for memory < 31-bit (64-bit embedded only) - ZONE_NORMAL: everything addressable by the kernel - ZONE_HIGHMEM: memory > 32-bit for 32-bit kernels Also provide information on how ZONE_DMA is used by defining ARCH_ZONE_DMA_BITS. Contains various fixes from Benjamin Herrenschmidt. Signed-off-by: Christoph Hellwig --- arch/powerpc/Kconfig | 8 +--- arch/powerpc/include/asm/page.h | 2 + arch/powerpc/include/asm/pgtable.h | 1 - arch/powerpc/kernel/dma-swiotlb.c | 6 +-- arch/powerpc/kernel/dma.c | 7 +-- arch/powerpc/mm/mem.c | 47 +++++++------------ arch/powerpc/platforms/85xx/corenet_generic.c | 10 ---- arch/powerpc/platforms/85xx/qemu_e500.c | 9 ---- include/linux/mmzone.h | 2 +- 9 files changed, 25 insertions(+), 67 deletions(-) diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index 8be31261aec8..cffff3613bc1 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig @@ -374,9 +374,9 @@ config PPC_ADV_DEBUG_DAC_RANGE depends on PPC_ADV_DEBUG_REGS && 44x default y -config ZONE_DMA32 +config ZONE_DMA bool - default y if PPC64 + default y if PPC_BOOK3E_64 config PGTABLE_LEVELS int @@ -869,10 +869,6 @@ config ISA have an IBM RS/6000 or pSeries machine, say Y. If you have an embedded board, consult your board documentation. -config ZONE_DMA - bool - default y - config GENERIC_ISA_DMA bool depends on ISA_DMA_API diff --git a/arch/powerpc/include/asm/page.h b/arch/powerpc/include/asm/page.h index f6a1265face2..fc8c9ac0c6be 100644 --- a/arch/powerpc/include/asm/page.h +++ b/arch/powerpc/include/asm/page.h @@ -354,4 +354,6 @@ typedef struct page *pgtable_t; #endif /* __ASSEMBLY__ */ #include +#define ARCH_ZONE_DMA_BITS 31 + #endif /* _ASM_POWERPC_PAGE_H */ diff --git a/arch/powerpc/include/asm/pgtable.h b/arch/powerpc/include/asm/pgtable.h index 9679b7519a35..8af32ce93c7f 100644 --- a/arch/powerpc/include/asm/pgtable.h +++ b/arch/powerpc/include/asm/pgtable.h @@ -66,7 +66,6 @@ extern unsigned long empty_zero_page[]; extern pgd_t swapper_pg_dir[]; -void limit_zone_pfn(enum zone_type zone, unsigned long max_pfn); int dma_pfn_limit_to_zone(u64 pfn_limit); extern void paging_init(void); diff --git a/arch/powerpc/kernel/dma-swiotlb.c b/arch/powerpc/kernel/dma-swiotlb.c index 5fc335f4d9cd..678811abccfc 100644 --- a/arch/powerpc/kernel/dma-swiotlb.c +++ b/arch/powerpc/kernel/dma-swiotlb.c @@ -108,12 +108,8 @@ int __init swiotlb_setup_bus_notifier(void) void __init swiotlb_detect_4g(void) { - if ((memblock_end_of_DRAM() - 1) > 0xffffffff) { + if ((memblock_end_of_DRAM() - 1) > 0xffffffff) ppc_swiotlb_enable = 1; -#ifdef CONFIG_ZONE_DMA32 - limit_zone_pfn(ZONE_DMA32, (1ULL << 32) >> PAGE_SHIFT); -#endif - } } static int __init check_swiotlb_enabled(void) diff --git a/arch/powerpc/kernel/dma.c b/arch/powerpc/kernel/dma.c index dbfc7056d7df..6551685a4ed0 100644 --- a/arch/powerpc/kernel/dma.c +++ b/arch/powerpc/kernel/dma.c @@ -50,7 +50,7 @@ static int dma_nommu_dma_supported(struct device *dev, u64 mask) return 1; #ifdef CONFIG_FSL_SOC - /* Freescale gets another chance via ZONE_DMA/ZONE_DMA32, however + /* Freescale gets another chance via ZONE_DMA, however * that will have to be refined if/when they support iommus */ return 1; @@ -94,13 +94,10 @@ void *__dma_nommu_alloc_coherent(struct device *dev, size_t size, } switch (zone) { +#ifdef CONFIG_ZONE_DMA case ZONE_DMA: flag |= GFP_DMA; break; -#ifdef CONFIG_ZONE_DMA32 - case ZONE_DMA32: - flag |= GFP_DMA32; - break; #endif }; #endif /* CONFIG_FSL_SOC */ diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c index 0a64fffabee1..c0b676c3a5ba 100644 --- a/arch/powerpc/mm/mem.c +++ b/arch/powerpc/mm/mem.c @@ -246,35 +246,19 @@ static int __init mark_nonram_nosave(void) } #endif -static bool zone_limits_final; - /* - * The memory zones past TOP_ZONE are managed by generic mm code. - * These should be set to zero since that's what every other - * architecture does. + * Zones usage: + * + * We setup ZONE_DMA to be 31-bits on all platforms and ZONE_NORMAL to be + * everything else. GFP_DMA32 page allocations automatically fall back to + * ZONE_DMA. + * + * By using 31-bit unconditionally, we can exploit ARCH_ZONE_DMA_BITS to + * inform the generic DMA mapping code. 32-bit only devices (if not handled + * by an IOMMU anyway) will take a first dip into ZONE_NORMAL and get + * otherwise served by ZONE_DMA. */ -static unsigned long max_zone_pfns[MAX_NR_ZONES] = { - [0 ... TOP_ZONE ] = ~0UL, - [TOP_ZONE + 1 ... MAX_NR_ZONES - 1] = 0 -}; - -/* - * Restrict the specified zone and all more restrictive zones - * to be below the specified pfn. May not be called after - * paging_init(). - */ -void __init limit_zone_pfn(enum zone_type zone, unsigned long pfn_limit) -{ - int i; - - if (WARN_ON(zone_limits_final)) - return; - - for (i = zone; i >= 0; i--) { - if (max_zone_pfns[i] > pfn_limit) - max_zone_pfns[i] = pfn_limit; - } -} +static unsigned long max_zone_pfns[MAX_NR_ZONES]; /* * Find the least restrictive zone that is entirely below the @@ -324,11 +308,14 @@ void __init paging_init(void) printk(KERN_DEBUG "Memory hole size: %ldMB\n", (long int)((top_of_ram - total_ram) >> 20)); +#ifdef CONFIG_ZONE_DMA + max_zone_pfns[ZONE_DMA] = min(max_low_pfn, 0x7fffffffUL >> PAGE_SHIFT); +#endif + max_zone_pfns[ZONE_NORMAL] = max_low_pfn; #ifdef CONFIG_HIGHMEM - limit_zone_pfn(ZONE_NORMAL, lowmem_end_addr >> PAGE_SHIFT); + max_zone_pfns[ZONE_HIGHMEM] = max_pfn; #endif - limit_zone_pfn(TOP_ZONE, top_of_ram >> PAGE_SHIFT); - zone_limits_final = true; + free_area_init_nodes(max_zone_pfns); mark_nonram_nosave(); diff --git a/arch/powerpc/platforms/85xx/corenet_generic.c b/arch/powerpc/platforms/85xx/corenet_generic.c index ac191a7a1337..b0dac307bebf 100644 --- a/arch/powerpc/platforms/85xx/corenet_generic.c +++ b/arch/powerpc/platforms/85xx/corenet_generic.c @@ -68,16 +68,6 @@ void __init corenet_gen_setup_arch(void) swiotlb_detect_4g(); -#if defined(CONFIG_FSL_PCI) && defined(CONFIG_ZONE_DMA32) - /* - * Inbound windows don't cover the full lower 4 GiB - * due to conflicts with PCICSRBAR and outbound windows, - * so limit the DMA32 zone to 2 GiB, to allow consistent - * allocations to succeed. - */ - limit_zone_pfn(ZONE_DMA32, 1UL << (31 - PAGE_SHIFT)); -#endif - pr_info("%s board\n", ppc_md.name); mpc85xx_qe_init(); diff --git a/arch/powerpc/platforms/85xx/qemu_e500.c b/arch/powerpc/platforms/85xx/qemu_e500.c index b63a8548366f..27631c607f3d 100644 --- a/arch/powerpc/platforms/85xx/qemu_e500.c +++ b/arch/powerpc/platforms/85xx/qemu_e500.c @@ -45,15 +45,6 @@ static void __init qemu_e500_setup_arch(void) fsl_pci_assign_primary(); swiotlb_detect_4g(); -#if defined(CONFIG_FSL_PCI) && defined(CONFIG_ZONE_DMA32) - /* - * Inbound windows don't cover the full lower 4 GiB - * due to conflicts with PCICSRBAR and outbound windows, - * so limit the DMA32 zone to 2 GiB, to allow consistent - * allocations to succeed. - */ - limit_zone_pfn(ZONE_DMA32, 1UL << (31 - PAGE_SHIFT)); -#endif mpc85xx_smp_init(); } diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index 847705a6d0ec..e2d01ccd071d 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h @@ -314,7 +314,7 @@ enum zone_type { * Architecture Limit * --------------------------- * parisc, ia64, sparc <4G - * s390 <2G + * s390, powerpc <2G * arm Various * alpha Unlimited or 0-16MB. *