Received: by 2002:ac0:a581:0:0:0:0:0 with SMTP id m1-v6csp4123705imm; Mon, 25 Jun 2018 10:06:03 -0700 (PDT) X-Google-Smtp-Source: ADUXVKIjGcWqW4lNZN76bZCzesbvG94iYlzvw4ubSZ7R5vAPCrsdHsXLTn4pC6J4CqEHyeNAy/oM X-Received: by 2002:a62:c809:: with SMTP id z9-v6mr13764233pff.5.1529946363911; Mon, 25 Jun 2018 10:06:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1529946363; cv=none; d=google.com; s=arc-20160816; b=E+8pmUvVnLgh/Dgp5eQ0M6Rn3ZWhPm/+Cajk3U1PJyjurUdGBb6dsCjN+zSQM2P6BW 8B5Bt+A01ru8palZOzJt9Dqsv7SmumM/hfEK6DruTxrvNW+UFoL/yK8hQbw2MI+rzPoK /jehieGHiducDku6/sY/EwnsqhY/kQZJ7AoyK5BqNcpDIbT19H1QqcHDfyL3y4QODn3k Qg0nF0J6Fa80efkl4/t4NTh+HMmqXa+/sdb635QGx5KmzLth1/mlUwYkDIj6zVMfqwQl qrm7DDXif1REe/j6o1+gVvrZ9CLtncTCb4rHEdXuiOxiUYRzI1gyOIsqN72bXGf2+B8n hx+A== 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 :organization:references:in-reply-to:message-id:subject:cc:to:from :date:arc-authentication-results; bh=ngRxBj03xnGOy6VwACN9s8n7wA7Kd+125WukgK4icFE=; b=i0WMEq0R9NA0FWdTGkZFYJ86cyF+S1MU3K32XipPlMlTfgx8B3hw0b5BPGPDc81cNH /a7g/ufDvBPaiE0MwtzBQuczohBhOHiGmPVXuShzPJlWGhFJz4r/aLa92w5yUZ/3rHqg A2xYzrTY4aF/rxeLLOq0JwvxtceixZAy4OG09fN8QGK3VqWO8tizk3+1iQekAs+2LiCc sNGZf+UK3ViIT9velRlmVhM1QY0XhdTl9rulVG7uJ5k1f0u4khYIRHLDtA9x3UuwTZo3 RE9fgb2H0ETz32+zBz7r2wDdBOMKUl9ZdCxJlkiRLO5h19aZpMxF0Y8C6EF7+ql5sSZU D76A== 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 c12-v6si11991094pgu.26.2018.06.25.10.05.48; Mon, 25 Jun 2018 10:06:03 -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 S1755498AbeFYRFD (ORCPT + 99 others); Mon, 25 Jun 2018 13:05:03 -0400 Received: from szxga05-in.huawei.com ([45.249.212.191]:8732 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752588AbeFYRFC (ORCPT ); Mon, 25 Jun 2018 13:05:02 -0400 Received: from DGGEMS403-HUB.china.huawei.com (unknown [172.30.72.60]) by Forcepoint Email with ESMTP id C6E14885FF8DD; Tue, 26 Jun 2018 01:04:46 +0800 (CST) Received: from localhost (10.202.226.43) by DGGEMS403-HUB.china.huawei.com (10.3.19.203) with Microsoft SMTP Server id 14.3.382.0; Tue, 26 Jun 2018 01:04:46 +0800 Date: Mon, 25 Jun 2018 18:04:36 +0100 From: Jonathan Cameron To: CC: , , , , , , Oscar Salvador Subject: Re: [PATCH 3/4] mm/memory_hotplug: Get rid of link_mem_sections Message-ID: <20180625180436.000049ac@huawei.com> In-Reply-To: <20180601125321.30652-4-osalvador@techadventures.net> References: <20180601125321.30652-1-osalvador@techadventures.net> <20180601125321.30652-4-osalvador@techadventures.net> Organization: Huawei X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.32; i686-w64-mingw32) MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit X-Originating-IP: [10.202.226.43] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, 1 Jun 2018 14:53:20 +0200 wrote: > From: Oscar Salvador > > link_mem_sections() and walk_memory_range() share most of the code, > so we can use walk_memory_range() with a callback to register_mem_sect_under_node() > instead of using link_mem_sections(). > > To control whether the node id must be check, two new functions has been added: > > register_mem_sect_under_node_nocheck_node() > and > register_mem_sect_under_node_check_node() > > They both call register_mem_sect_under_node_check() with > the parameter check_nid set to true or false. > > Signed-off-by: Oscar Salvador > --- > drivers/base/node.c | 47 ++++++++++------------------------------------- > include/linux/node.h | 21 +++++++++------------ > mm/memory_hotplug.c | 8 ++++---- > 3 files changed, 23 insertions(+), 53 deletions(-) > > diff --git a/drivers/base/node.c b/drivers/base/node.c > index a5e821d09656..248c712e8de5 100644 > --- a/drivers/base/node.c > +++ b/drivers/base/node.c > @@ -398,6 +398,16 @@ static int __ref get_nid_for_pfn(unsigned long pfn) > return pfn_to_nid(pfn); > } > > +int register_mem_sect_under_node_check_node(struct memory_block *mem_blk, void *nid) > +{ > + return register_mem_sect_under_node (mem_blk, *(int *)nid, true); > +} > + > +int register_mem_sect_under_node_nocheck_node(struct memory_block *mem_blk, void *nid) > +{ > + return register_mem_sect_under_node (mem_blk, *(int *)nid, false); > +} > + > /* register memory section under specified node if it spans that node */ > int register_mem_sect_under_node(struct memory_block *mem_blk, int nid, > bool check_nid) > @@ -490,43 +500,6 @@ int unregister_mem_sect_under_nodes(struct memory_block *mem_blk, > return 0; > } > > -int link_mem_sections(int nid, unsigned long start_pfn, unsigned long nr_pages, > - bool check_nid) > -{ > - unsigned long end_pfn = start_pfn + nr_pages; > - unsigned long pfn; > - struct memory_block *mem_blk = NULL; > - int err = 0; > - > - for (pfn = start_pfn; pfn < end_pfn; pfn += PAGES_PER_SECTION) { > - unsigned long section_nr = pfn_to_section_nr(pfn); > - struct mem_section *mem_sect; > - int ret; > - > - if (!present_section_nr(section_nr)) > - continue; > - mem_sect = __nr_to_section(section_nr); > - > - /* same memblock ? */ > - if (mem_blk) > - if ((section_nr >= mem_blk->start_section_nr) && > - (section_nr <= mem_blk->end_section_nr)) > - continue; > - > - mem_blk = find_memory_block_hinted(mem_sect, mem_blk); > - > - ret = register_mem_sect_under_node(mem_blk, nid, check_nid); > - if (!err) > - err = ret; > - > - /* discard ref obtained in find_memory_block() */ > - } > - > - if (mem_blk) > - kobject_put(&mem_blk->dev.kobj); > - return err; > -} > - > #ifdef CONFIG_HUGETLBFS > /* > * Handle per node hstate attribute [un]registration on transistions > diff --git a/include/linux/node.h b/include/linux/node.h > index 6d336e38d155..1158bea9be52 100644 > --- a/include/linux/node.h > +++ b/include/linux/node.h > @@ -31,19 +31,11 @@ struct memory_block; > extern struct node *node_devices[]; > typedef void (*node_registration_func_t)(struct node *); > > -#if defined(CONFIG_MEMORY_HOTPLUG_SPARSE) && defined(CONFIG_NUMA) > -extern int link_mem_sections(int nid, unsigned long start_pfn, > - unsigned long nr_pages, bool check_nid); > -#else > -static inline int link_mem_sections(int nid, unsigned long start_pfn, > - unsigned long nr_pages, bool check_nid) > -{ > - return 0; > -} > -#endif > - > extern void unregister_node(struct node *node); > #ifdef CONFIG_NUMA > +#if defined(CONFIG_MEMORY_HOTPLUG_SPARSE) > +extern int register_mem_sect_under_node_check_node(struct memory_block *mem_blk, void *nid); > +#endif > /* Core of the node registration - only memory hotplug should use this */ > extern int __register_one_node(int nid); > > @@ -54,12 +46,17 @@ static inline int register_one_node(int nid) > > if (node_online(nid)) { > struct pglist_data *pgdat = NODE_DATA(nid); > + unsigned long start = pgdat->node_start_pfn; > + unsigned long size = pgdat->node_spanned_pages; > > error = __register_one_node(nid); > if (error) > return error; > /* link memory sections under this node */ > - error = link_mem_sections(nid, pgdat->node_start_pfn, pgdat->node_spanned_pages, true); > +#if defined(CONFIG_MEMORY_HOTPLUG_SPARSE) > + error = walk_memory_range(PFN_DOWN(start), PFN_UP(start + size - 1), > + (void *)&nid, register_mem_sect_under_node_check_node); > +#endif Apologies, my previous testing was clearly garbage. Looks like we take the node pfns then shift them again. Result on my system is we only get as far as pfn 22 which is still in the first memory block so rest of them are never successfully added. Replacing with error = walk_memory_range(start, start + size - 1, ... works much better and lets me test Lorenzo's patch which is what I was really trying to do today. Sorry again for the incorrect previous tested-by. Thanks, Jonathan > } > > return error; > diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c > index f84ef96175ab..ac21dc506b84 100644 > --- a/mm/memory_hotplug.c > +++ b/mm/memory_hotplug.c > @@ -40,6 +40,8 @@ > > #include "internal.h" > > +extern int register_mem_sect_under_node_nocheck_node(struct memory_block *mem_blk, void *nid); > + > /* > * online_page_callback contains pointer to current page onlining function. > * Initially it is generic_online_page(). If it is required it could be > @@ -1118,7 +1120,6 @@ int __ref add_memory_resource(int nid, struct resource *res, bool online) > u64 start, size; > bool new_node; > int ret; > - unsigned long start_pfn, nr_pages; > > start = res->start; > size = resource_size(res); > @@ -1157,9 +1158,8 @@ int __ref add_memory_resource(int nid, struct resource *res, bool online) > } > > /* link memory sections under this node.*/ > - start_pfn = start >> PAGE_SHIFT; > - nr_pages = size >> PAGE_SHIFT; > - ret = link_mem_sections(nid, start_pfn, nr_pages, false); > + ret = walk_memory_range(PFN_DOWN(start), PFN_UP(start + size - 1), > + (void *)&nid, register_mem_sect_under_node_nocheck_node); > if (ret) > goto register_fail; >