Received: by 2002:a25:6193:0:0:0:0:0 with SMTP id v141csp3142068ybb; Mon, 30 Mar 2020 22:12:46 -0700 (PDT) X-Google-Smtp-Source: ADFU+vvfcZ/KX3teurgPoEKp1OM9hB48GBKyrXRysNltfpEWITByVnMrK9xUXi/SG71sZ2VNOIiD X-Received: by 2002:a4a:d00d:: with SMTP id h13mr12061320oor.80.1585631565988; Mon, 30 Mar 2020 22:12:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1585631565; cv=none; d=google.com; s=arc-20160816; b=wDDhhxsx8AxtZn1MvoWoggR/vpu+arrkauECrzRHOTauaV8D9jieC61GFoszOKXtTw dvQvWaR9GKqmvmMmXZ/Ukh/upCLWTHM6soFqSHeiZv5USgVXBTh0fZPnG/Yp2FzbJsLu Z8OXrDi5+qlALHlSRq2/0dT/E2E9k7Dc0f8wXMK9lw4amdFs9UpDzgIi0WyQhd9Sy7cb 3z+fjKclpf0F8MA+VTlljAm6fi6WKTSsD7rdXpi0ovjRJQDoMod9HIwwgtuPzSmkUDLW YnEvU/U575vcua9PRQR2SQzfBgbAzOqJbzPCgb39MZBa1ZQ2MnqsOUjA4CAG7F21WmFS D5RQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=wqVZJmRapmDD/FftdzI7KUURBtAJOw+XsIebjUMgSyA=; b=KtGDVrmCLnRGC5O+AAfEJ5f/nxw9hT4E6nwQGrnQbc//FmhguUBiwUt2dsdAMGayGA AXk+FWqtujrtVaGJN5vAxRZHzsa2+nXS7L2PVtQ1REq+sxp2OCCSyNtp6BACIxawkX3Z EeNqm8OKyObIFsV+GCzwAPPLe/aJoSmj5bXg4hVjiF6cb3lKtJ275rux+tGQ9coh7JtR oP2vqDNAFUg/bggp/P1pBOJO73f2zaeQqSao6gKszdK8w0FigAsrMe9WwWhIUYKEXvnp lZNbuH3HdIn+Dh/R93TdttsG4SESmFMvKnPrJbdJPr78HYUrN7RCA3xObcNxGQiIo+EF yghw== 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 k92si7497729otk.261.2020.03.30.22.12.34; Mon, 30 Mar 2020 22:12:45 -0700 (PDT) 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 S1726461AbgCaFKv (ORCPT + 99 others); Tue, 31 Mar 2020 01:10:51 -0400 Received: from foss.arm.com ([217.140.110.172]:43708 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725809AbgCaFKu (ORCPT ); Tue, 31 Mar 2020 01:10:50 -0400 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id F354B1FB; Mon, 30 Mar 2020 22:10:49 -0700 (PDT) Received: from p8cg001049571a15.arm.com (unknown [10.163.1.70]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id CA48B3F71E; Mon, 30 Mar 2020 22:10:38 -0700 (PDT) From: Anshuman Khandual To: linux-mm@kvack.org Cc: robin.murphy@arm.com, dan.j.williams@intel.com, jglisse@redhat.com, jgg@mellanox.com, rcampbell@nvidia.com, aneesh.kumar@linux.ibm.com, Anshuman Khandual , Catalin Marinas , Will Deacon , Benjamin Herrenschmidt , Paul Mackerras , Michael Ellerman , Dave Hansen , Andy Lutomirski , Peter Zijlstra , Thomas Gleixner , Ingo Molnar , Borislav Petkov , "H. Peter Anvin" , Andrew Morton , x86@kernel.org, linux-arm-kernel@lists.infradead.org, linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org Subject: [PATCH V3 2/3] mm/sparsemem: Enable vmem_altmap support in vmemmap_alloc_block_buf() Date: Tue, 31 Mar 2020 10:39:46 +0530 Message-Id: <1585631387-18819-3-git-send-email-anshuman.khandual@arm.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1585631387-18819-1-git-send-email-anshuman.khandual@arm.com> References: <1585631387-18819-1-git-send-email-anshuman.khandual@arm.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org There are many instances where vmemap allocation is often switched between regular memory and device memory just based on whether altmap is available or not. vmemmap_alloc_block_buf() is used in various platforms to allocate vmemmap mappings. Lets also enable it to handle altmap based device memory allocation along with existing regular memory allocations. This will help in avoiding the altmap based allocation switch in many places. While here also implement a regular memory allocation fallback mechanism when the first preferred device memory allocation fails. This will ensure preserving the existing semantics on powerpc platform. To summarize there are three different methods to call vmemmap_alloc_block_buf(). (., NULL, false) /* Allocate from system RAM */ (., altmap, false) /* Allocate from altmap without any fallback */ (., altmap, true) /* Allocate from altmap with fallback (system RAM) */ Cc: Catalin Marinas Cc: Will Deacon Cc: Benjamin Herrenschmidt Cc: Paul Mackerras Cc: Michael Ellerman Cc: Dave Hansen Cc: Andy Lutomirski Cc: Peter Zijlstra Cc: Thomas Gleixner Cc: Ingo Molnar Cc: Borislav Petkov Cc: "H. Peter Anvin" Cc: Andrew Morton Cc: x86@kernel.org Cc: linux-arm-kernel@lists.infradead.org Cc: linuxppc-dev@lists.ozlabs.org Cc: linux-mm@kvack.org Cc: linux-kernel@vger.kernel.org Suggested-by: Robin Murphy Signed-off-by: Anshuman Khandual --- arch/arm64/mm/mmu.c | 3 ++- arch/powerpc/mm/init_64.c | 10 +++++----- arch/x86/mm/init_64.c | 6 ++---- include/linux/mm.h | 3 ++- mm/sparse-vmemmap.c | 30 ++++++++++++++++++++++++------ 5 files changed, 35 insertions(+), 17 deletions(-) diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c index 2feed38106d6..81f88c88484f 100644 --- a/arch/arm64/mm/mmu.c +++ b/arch/arm64/mm/mmu.c @@ -1063,7 +1063,8 @@ int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node, if (pmd_none(READ_ONCE(*pmdp))) { void *p = NULL; - p = vmemmap_alloc_block_buf(PMD_SIZE, node); + p = vmemmap_alloc_block_buf(PMD_SIZE, node, + NULL, false); if (!p) return -ENOMEM; diff --git a/arch/powerpc/mm/init_64.c b/arch/powerpc/mm/init_64.c index 4002ced3596f..f67f2b909fe5 100644 --- a/arch/powerpc/mm/init_64.c +++ b/arch/powerpc/mm/init_64.c @@ -226,12 +226,12 @@ int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node, * fall back to system memory if the altmap allocation fail. */ if (altmap && !altmap_cross_boundary(altmap, start, page_size)) { - p = altmap_alloc_block_buf(page_size, altmap); - if (!p) - pr_debug("altmap block allocation failed, falling back to system memory"); + p = vmemmap_alloc_block_buf(page_size, node, + altmap, true); + } else { + p = vmemmap_alloc_block_buf(page_size, node, + NULL, false); } - if (!p) - p = vmemmap_alloc_block_buf(page_size, node); if (!p) return -ENOMEM; diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index c22677571619..35cc0c9d9578 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c @@ -1444,10 +1444,8 @@ static int __meminit vmemmap_populate_hugepages(unsigned long start, if (pmd_none(*pmd)) { void *p; - if (altmap) - p = altmap_alloc_block_buf(PMD_SIZE, altmap); - else - p = vmemmap_alloc_block_buf(PMD_SIZE, node); + p = vmemmap_alloc_block_buf(PMD_SIZE, node, + altmap, false); if (p) { pte_t entry; diff --git a/include/linux/mm.h b/include/linux/mm.h index 955be0331833..b8d3d90c9c47 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -2991,7 +2991,8 @@ pte_t *vmemmap_pte_populate(pmd_t *pmd, unsigned long addr, int node, struct vmem_altmap *altmap); void *vmemmap_alloc_block(unsigned long size, int node); struct vmem_altmap; -void *vmemmap_alloc_block_buf(unsigned long size, int node); +void *vmemmap_alloc_block_buf(unsigned long size, int node, + struct vmem_altmap *altmap, bool sysram_fallback); void *altmap_alloc_block_buf(unsigned long size, struct vmem_altmap *altmap); void vmemmap_verify(pte_t *, int, unsigned long, unsigned long); int vmemmap_populate_basepages(unsigned long start, unsigned long end, diff --git a/mm/sparse-vmemmap.c b/mm/sparse-vmemmap.c index a407abc9b46c..ff5adc233e38 100644 --- a/mm/sparse-vmemmap.c +++ b/mm/sparse-vmemmap.c @@ -71,10 +71,31 @@ void * __meminit vmemmap_alloc_block(unsigned long size, int node) } /* need to make sure size is all the same during early stage */ -void * __meminit vmemmap_alloc_block_buf(unsigned long size, int node) +void * __meminit vmemmap_alloc_block_buf(unsigned long size, int node, + struct vmem_altmap *altmap, + bool sysram_fallback) { - void *ptr = sparse_buffer_alloc(size); + void *ptr; + /* + * There is no point in asking for sysram fallback + * without an altmap request to begin with. So just + * warn here to catch potential call sites that may + * be violating this. + */ + WARN_ON(!altmap && sysram_fallback); + + if (altmap) { + ptr = altmap_alloc_block_buf(size, altmap); + if (ptr) + return ptr; + pr_debug("altmap block allocation failed\n"); + if (!sysram_fallback) + return NULL; + pr_debug("falling back to system memory\n"); + } + + ptr = sparse_buffer_alloc(size); if (!ptr) ptr = vmemmap_alloc_block(size, node); return ptr; @@ -148,10 +169,7 @@ pte_t * __meminit vmemmap_pte_populate(pmd_t *pmd, unsigned long addr, int node, pte_t entry; void *p; - if (altmap) - p = altmap_alloc_block_buf(PAGE_SIZE, altmap); - else - p = vmemmap_alloc_block_buf(PAGE_SIZE, node); + p = vmemmap_alloc_block_buf(PAGE_SIZE, node, altmap, false); if (!p) return NULL; entry = pfn_pte(__pa(p) >> PAGE_SHIFT, PAGE_KERNEL); -- 2.20.1