From patchwork Thu Dec 7 15:08:34 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 10099385 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 39A6360325 for ; Thu, 7 Dec 2017 15:08:59 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 285D4294AF for ; Thu, 7 Dec 2017 15:08:59 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 1D6BF2969E; Thu, 7 Dec 2017 15:08:59 +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=-1.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_NONE,T_DKIM_INVALID autolearn=no version=3.3.1 Received: from ml01.01.org (ml01.01.org [198.145.21.10]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id C4F77294AF for ; Thu, 7 Dec 2017 15:08:58 +0000 (UTC) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 195B7221EA0C3; Thu, 7 Dec 2017 07:04:20 -0800 (PST) X-Original-To: linux-nvdimm@lists.01.org Delivered-To: linux-nvdimm@lists.01.org Received-SPF: None (no SPF record) identity=mailfrom; client-ip=65.50.211.133; helo=bombadil.infradead.org; envelope-from=batv+66a8023ffb5c76db3fb6+5219+infradead.org+hch@bombadil.srs.infradead.org; receiver=linux-nvdimm@lists.01.org Received: from bombadil.infradead.org (bombadil.infradead.org [65.50.211.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id D732F221EA0A6 for ; Thu, 7 Dec 2017 07:04:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=References:In-Reply-To:Message-Id: Date:Subject:Cc:To:From:Sender:Reply-To:MIME-Version:Content-Type: Content-Transfer-Encoding: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=YIshqItr0orJIKSvYMxIqvCSaobshWRc0WEWMp0/l4E=; b=Ijhz/Ck90ySz7YMVkckA2pLrB E5J1FmUMrY33YOZdIovVDu7cLnxM6f1lLlt7T7YJBDkOABZD+aYj6evqtBtQfxFPyhVe/p86Z2/iM dH2zK/hh+e8xD9Y970SXHW/VpTEeAtqQPI5sZl1uAxIy67ZZcK7qtcRc/O8rq0vERTIr61DkILEKJ fRgr1Ksrn4xIArXCLExdsLhu3CygOT28ia8vV63R+PoilhThpNd7xf8ZRMrvqd8UGiqToMavqoHXJ mfydESzNOKs5C6EgMYSt1CXROYzYtirW70OnujMMIZEwH4Bk6NiFVrW78CAdGYXmo2qd194z6S2PG 0n8AO6IXQ==; Received: from [38.126.112.130] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.87 #1 (Red Hat Linux)) id 1eMxn0-0007Yq-Av; Thu, 07 Dec 2017 15:08:42 +0000 From: Christoph Hellwig To: Dan Williams Subject: [PATCH 08/14] mm: merge vmem_altmap_alloc into dev_pagemap_alloc_block_buf Date: Thu, 7 Dec 2017 07:08:34 -0800 Message-Id: <20171207150840.28409-9-hch@lst.de> X-Mailer: git-send-email 2.14.2 In-Reply-To: <20171207150840.28409-1-hch@lst.de> References: <20171207150840.28409-1-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-BeenThere: linux-nvdimm@lists.01.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: "Linux-nvdimm developer list." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linux-mm@kvack.org, =?UTF-8?q?J=C3=A9r=C3=B4me=20Glisse?= , linux-nvdimm@lists.01.org MIME-Version: 1.0 Errors-To: linux-nvdimm-bounces@lists.01.org Sender: "Linux-nvdimm" X-Virus-Scanned: ClamAV using ClamSMTP There is no clear separation between the two, so merge them. Also move the device page map argument first for the more natural calling convention. Signed-off-by: Christoph Hellwig Reviewed-by: Logan Gunthorpe --- arch/powerpc/mm/init_64.c | 2 +- arch/x86/mm/init_64.c | 2 +- include/linux/mm.h | 4 ++-- mm/sparse-vmemmap.c | 51 ++++++++++++++++++----------------------------- 4 files changed, 23 insertions(+), 36 deletions(-) diff --git a/arch/powerpc/mm/init_64.c b/arch/powerpc/mm/init_64.c index 3a39a644e96c..ec706857bdd6 100644 --- a/arch/powerpc/mm/init_64.c +++ b/arch/powerpc/mm/init_64.c @@ -203,7 +203,7 @@ int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node) /* altmap lookups only work at section boundaries */ altmap = to_vmem_altmap(SECTION_ALIGN_DOWN(start)); if (altmap) - p = dev_pagemap_alloc_block_buf(page_size, altmap); + p = dev_pagemap_alloc_block_buf(altmap, page_size); else p = vmemmap_alloc_block_buf(page_size, node); if (!p) diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index 9e1b489aa826..131749080874 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c @@ -1372,7 +1372,7 @@ static int __meminit vmemmap_populate_hugepages(unsigned long start, void *p; if (altmap) - p = dev_pagemap_alloc_block_buf(PMD_SIZE, altmap); + p = dev_pagemap_alloc_block_buf(altmap, PMD_SIZE); else p = vmemmap_alloc_block_buf(PMD_SIZE, node); if (p) { diff --git a/include/linux/mm.h b/include/linux/mm.h index 856869e2c119..cd3d1c00f6a3 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -2547,8 +2547,8 @@ pte_t *vmemmap_pte_populate(pmd_t *pmd, unsigned long addr, int node); void *vmemmap_alloc_block(unsigned long size, int node); struct vmem_altmap; void *vmemmap_alloc_block_buf(unsigned long size, int node); -void *dev_pagemap_alloc_block_buf(unsigned long size, - struct vmem_altmap *altmap); +void *dev_pagemap_alloc_block_buf(struct vmem_altmap *pgmap, + unsigned long size); void vmemmap_verify(pte_t *, int, unsigned long, unsigned long); int vmemmap_populate_basepages(unsigned long start, unsigned long end, int node); diff --git a/mm/sparse-vmemmap.c b/mm/sparse-vmemmap.c index 268b6c7dfdf4..fef41a6a9f64 100644 --- a/mm/sparse-vmemmap.c +++ b/mm/sparse-vmemmap.c @@ -107,33 +107,16 @@ static unsigned long __meminit vmem_altmap_nr_free(struct vmem_altmap *altmap) } /** - * vmem_altmap_alloc - allocate pages from the vmem_altmap reservation - * @altmap - reserved page pool for the allocation - * @nr_pfns - size (in pages) of the allocation + * dev_pagemap_alloc_block_buf - allocate pages from the device page map + * @pgmap: device page map + * @size: size (in bytes) of the allocation * - * Allocations are aligned to the size of the request + * Allocations are aligned to the size of the request. */ -static unsigned long __meminit vmem_altmap_alloc(struct vmem_altmap *altmap, - unsigned long nr_pfns) +void * __meminit dev_pagemap_alloc_block_buf(struct vmem_altmap *pgmap, + unsigned long size) { - unsigned long pfn = vmem_altmap_next_pfn(altmap); - unsigned long nr_align; - - nr_align = 1UL << find_first_bit(&nr_pfns, BITS_PER_LONG); - nr_align = ALIGN(pfn, nr_align) - pfn; - - if (nr_pfns + nr_align > vmem_altmap_nr_free(altmap)) - return ULONG_MAX; - altmap->alloc += nr_pfns; - altmap->align += nr_align; - return pfn + nr_align; -} - -void * __meminit dev_pagemap_alloc_block_buf(unsigned long size, - struct vmem_altmap *altmap) -{ - unsigned long pfn, nr_pfns; - void *ptr; + unsigned long pfn, nr_pfns, nr_align; if (size & ~PAGE_MASK) { pr_warn_once("%s: allocations must be multiple of PAGE_SIZE (%ld)\n", @@ -141,16 +124,20 @@ void * __meminit dev_pagemap_alloc_block_buf(unsigned long size, return NULL; } + pfn = vmem_altmap_next_pfn(pgmap); nr_pfns = size >> PAGE_SHIFT; - pfn = vmem_altmap_alloc(altmap, nr_pfns); - if (pfn < ULONG_MAX) - ptr = __va(__pfn_to_phys(pfn)); - else - ptr = NULL; - pr_debug("%s: pfn: %#lx alloc: %ld align: %ld nr: %#lx\n", - __func__, pfn, altmap->alloc, altmap->align, nr_pfns); + nr_align = 1UL << find_first_bit(&nr_pfns, BITS_PER_LONG); + nr_align = ALIGN(pfn, nr_align) - pfn; + if (nr_pfns + nr_align > vmem_altmap_nr_free(pgmap)) + return NULL; - return ptr; + pgmap->alloc += nr_pfns; + pgmap->align += nr_align; + pfn += nr_align; + + pr_debug("%s: pfn: %#lx alloc: %ld align: %ld nr: %#lx\n", + __func__, pfn, pgmap->alloc, pgmap->align, nr_pfns); + return __va(__pfn_to_phys(pfn)); } void __meminit vmemmap_verify(pte_t *pte, int node,