From patchwork Fri Jan 20 00:05:52 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Morton X-Patchwork-Id: 9527129 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 E6D7F6045D for ; Fri, 20 Jan 2017 00:05:55 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D98542866C for ; Fri, 20 Jan 2017 00:05:55 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id CE4AB28678; Fri, 20 Jan 2017 00:05:55 +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.9 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_NONE autolearn=ham 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 C032228679 for ; Fri, 20 Jan 2017 00:05:54 +0000 (UTC) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 5459B81E9D; Thu, 19 Jan 2017 16:05:54 -0800 (PST) X-Original-To: linux-nvdimm@ml01.01.org Delivered-To: linux-nvdimm@ml01.01.org Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (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 AEF9981E9C for ; Thu, 19 Jan 2017 16:05:53 -0800 (PST) Received: from akpm3.mtv.corp.google.com (unknown [104.132.1.73]) by mail.linuxfoundation.org (Postfix) with ESMTPSA id 2CB7CB55; Fri, 20 Jan 2017 00:05:53 +0000 (UTC) Date: Thu, 19 Jan 2017 16:05:52 -0800 From: Andrew Morton To: Dan Williams Subject: Re: [PATCH v3 06/12] mm: track active portions of a section at boot Message-Id: <20170119160552.7bdc2e41f19bd52987a752bc@linux-foundation.org> In-Reply-To: <148486363375.19694.14661926204436340901.stgit@dwillia2-desk3.amr.corp.intel.com> References: <148486359570.19694.18265063120757801811.stgit@dwillia2-desk3.amr.corp.intel.com> <148486363375.19694.14661926204436340901.stgit@dwillia2-desk3.amr.corp.intel.com> X-Mailer: Sylpheed 3.4.1 (GTK+ 2.24.23; x86_64-pc-linux-gnu) Mime-Version: 1.0 X-BeenThere: linux-nvdimm@lists.01.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: "Linux-nvdimm developer list." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Michal Hocko , Mel Gorman , linux-nvdimm@ml01.01.org, linux-kernel@vger.kernel.org, Stephen Bates , linux-mm@kvack.org, Johannes Weiner , Vlastimil Babka Errors-To: linux-nvdimm-bounces@lists.01.org Sender: "Linux-nvdimm" X-Virus-Scanned: ClamAV using ClamSMTP On Thu, 19 Jan 2017 14:07:13 -0800 Dan Williams wrote: > Prepare for hot{plug,remove} of sub-ranges of a section by tracking a > section active bitmask, each bit representing 2MB (SECTION_SIZE (128M) / > map_active bitmask length (64)). > > --- a/include/linux/mmzone.h > +++ b/include/linux/mmzone.h > @@ -1083,6 +1083,8 @@ struct mem_section_usage { > unsigned long pageblock_flags[0]; > }; > > +void section_active_init(unsigned long pfn, unsigned long nr_pages); > + > struct page; > struct page_ext; > struct mem_section { > @@ -1224,6 +1226,7 @@ void sparse_init(void); > #else > #define sparse_init() do {} while (0) > #define sparse_index_init(_sec, _nid) do {} while (0) > +#define section_active_init(_pfn, _nr_pages) do {} while (0) Using a #define for this is crappy. A static inline does typechecking and can suppress unused-var warnings in callers. > #endif /* CONFIG_SPARSEMEM */ > > /* > diff --git a/mm/page_alloc.c b/mm/page_alloc.c > index 68ccf5bcdbb2..9a3ab6c245a8 100644 > --- a/mm/page_alloc.c > +++ b/mm/page_alloc.c > @@ -6352,10 +6352,12 @@ void __init free_area_init_nodes(unsigned long *max_zone_pfn) > > /* Print out the early node map */ > pr_info("Early memory node ranges\n"); > - for_each_mem_pfn_range(i, MAX_NUMNODES, &start_pfn, &end_pfn, &nid) > + for_each_mem_pfn_range(i, MAX_NUMNODES, &start_pfn, &end_pfn, &nid) { > pr_info(" node %3d: [mem %#018Lx-%#018Lx]\n", nid, > (u64)start_pfn << PAGE_SHIFT, > ((u64)end_pfn << PAGE_SHIFT) - 1); > + section_active_init(start_pfn, end_pfn - start_pfn); section_active_init() can be __init, methinks. We don't want to carry the extra .text after boot. --- a/include/linux/mmzone.h~mm-track-active-portions-of-a-section-at-boot-fix +++ a/include/linux/mmzone.h @@ -1083,7 +1083,7 @@ struct mem_section_usage { unsigned long pageblock_flags[0]; }; -void section_active_init(unsigned long pfn, unsigned long nr_pages); +void __init section_active_init(unsigned long pfn, unsigned long nr_pages); struct page; struct page_ext; @@ -1226,6 +1226,10 @@ void sparse_init(void); #else #define sparse_init() do {} while (0) #define sparse_index_init(_sec, _nid) do {} while (0) +static inline void section_active_init(unsigned long pfn, + unsigned long nr_pages) +{ +} #define section_active_init(_pfn, _nr_pages) do {} while (0) #endif /* CONFIG_SPARSEMEM */ --- a/mm/sparse.c~mm-track-active-portions-of-a-section-at-boot-fix +++ a/mm/sparse.c @@ -168,13 +168,13 @@ void __meminit mminit_validate_memmodel_ } } -static int section_active_index(phys_addr_t phys) +static int __init section_active_index(phys_addr_t phys) { return (phys & ~(PA_SECTION_MASK)) / SECTION_ACTIVE_SIZE; } -static unsigned long section_active_mask(unsigned long pfn, - unsigned long nr_pages) +static unsigned long __init section_active_mask(unsigned long pfn, + unsigned long nr_pages) { int idx_start, idx_size; phys_addr_t start, size; @@ -195,7 +195,7 @@ static unsigned long section_active_mask return ((1UL << idx_size) - 1) << idx_start; } -void section_active_init(unsigned long pfn, unsigned long nr_pages) +void __init section_active_init(unsigned long pfn, unsigned long nr_pages) { int end_sec = pfn_to_section_nr(pfn + nr_pages - 1); int i, start_sec = pfn_to_section_nr(pfn);