Received: by 2002:a25:e74b:0:0:0:0:0 with SMTP id e72csp394449ybh; Sun, 12 Jul 2020 09:44:06 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwI0G3gUCLDap9f2r10C1Xi5cRob/7vOjS6L1Z6HgGZFToqj2gvmnSuP8SpGQBJQAEwcOVR X-Received: by 2002:a17:906:eb4b:: with SMTP id mc11mr68948965ejb.5.1594572246484; Sun, 12 Jul 2020 09:44:06 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1594572246; cv=none; d=google.com; s=arc-20160816; b=PL/FLfwkB9FIlFRXvbmhVCKt5yjmxN8Zbpv4xZFUxdhkLb8PBbNqzrCJwgZVyQqdkq 33zQLFBWO5MycoIj1cLuMTKoK9BK5pl5D2EBuUnglPFMNtn+JiciJmJS8CrTockceqZw UCFw82MCcwueEHkItlg/YD7y6YCXgD2aRNVNKERitDhUdHgU1PIsU2gI3YKWHuOTWvUK Cb/Dp/EAF5ptnle2DvVICBC7YNrwFpHVinT1sEoWWmq3Vqvx5mkNYIMFW2Io7tAHl7T0 t4CXrpBBYCn0ToTM4Pz8QiB2zTy4TLeUHXRtd7cXqQK4OG1nFgkZRTfUWI3rTxOxB5wm 7vhQ== 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 :user-agent:references:in-reply-to:message-id:date:cc:to:from :subject:ironport-sdr:ironport-sdr; bh=J0p9YglT9WjwRowSjJHmoJTgtI824yzPRvNlUhiblWs=; b=NVHBGr9mIxZTCVG3Py9u2fKM8xi618nPCcO7PQ3p2WuRfdjRbvxqxvhiOrdrvB/jB9 LdKLRqrOleP+24K1UQcaoauw6+8HtsE9fIDvfnDphrZNL1Cse30C9ihvc8uVwKvIc8Yf OYHBTpp1kHqJtwE+oLgc+n3TncJWvU7ln34nW7jrzeMHbtXiSkyNuMaq+eeyUn/drDz7 veFn/R4eH9GVsYgS5few9oHVeoIcljKQ5MGW0aR4608tKuUKEhbiELcx+j/rzEfCV5iI pIfGB90zBTQF8ZO1OCAL9IeROWggieuvV8ejkevSF85cfe9e/67p46LAof5/jLhb8J1u Hwfw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id i10si7672184edy.414.2020.07.12.09.43.43; Sun, 12 Jul 2020 09:44:06 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729213AbgGLQnE (ORCPT + 99 others); Sun, 12 Jul 2020 12:43:04 -0400 Received: from mga04.intel.com ([192.55.52.120]:7753 "EHLO mga04.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729199AbgGLQnA (ORCPT ); Sun, 12 Jul 2020 12:43:00 -0400 IronPort-SDR: vkQA7bbzumS73cBCu5qTbjMk6ysD1bVNyBUK32xBdwXTsYzGGtYEjaYddK3889uGy/hzgbttUV WXX5bBIl3lGQ== X-IronPort-AV: E=McAfee;i="6000,8403,9680"; a="145998863" X-IronPort-AV: E=Sophos;i="5.75,344,1589266800"; d="scan'208";a="145998863" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jul 2020 09:42:59 -0700 IronPort-SDR: wKh/mkWpfbLzS/7XA/a+hOZMMV8DFeGdi9/Hom+z8d2kEX+RFAYAHlZYGDznOwJngG0SVv6zF8 30sN3xvpN09g== X-IronPort-AV: E=Sophos;i="5.75,344,1589266800"; d="scan'208";a="485205254" Received: from dwillia2-desk3.jf.intel.com (HELO dwillia2-desk3.amr.corp.intel.com) ([10.54.39.16]) by fmsmga005-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jul 2020 09:42:59 -0700 Subject: [PATCH v2 07/22] numa: Introduce a generic memory_add_physaddr_to_nid() From: Dan Williams To: linux-nvdimm@lists.01.org Cc: Mike Rapoport , Jia He , Will Deacon , David Hildenbrand , Andrew Morton , peterz@infradead.org, vishal.l.verma@intel.com, dave.hansen@linux.intel.com, ard.biesheuvel@linaro.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-acpi@vger.kernel.org, hch@lst.de, joao.m.martins@oracle.com Date: Sun, 12 Jul 2020 09:26:43 -0700 Message-ID: <159457120334.754248.12908401960465408733.stgit@dwillia2-desk3.amr.corp.intel.com> In-Reply-To: <159457116473.754248.7879464730875147365.stgit@dwillia2-desk3.amr.corp.intel.com> References: <159457116473.754248.7879464730875147365.stgit@dwillia2-desk3.amr.corp.intel.com> User-Agent: StGit/0.18-3-g996c MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org For architectures that opt into storing their numa data in memblock (only ARM64 currently), add a memblock generic way to interrogate that data for memory_add_physaddr_to_nid(). This requires ARCH_KEEP_MEMBLOCK to keep memblock text and data around after boot. Cc: Mike Rapoport Cc: Jia He Cc: Will Deacon Cc: David Hildenbrand Cc: Andrew Morton Signed-off-by: Dan Williams --- include/linux/mm.h | 11 +++++++++++ mm/Kconfig | 6 ++++++ mm/page_alloc.c | 23 ++++++++++++++++++++++- 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/include/linux/mm.h b/include/linux/mm.h index dc7b87310c10..1e76ee5da20b 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -2425,6 +2425,17 @@ unsigned long __absent_pages_in_range(int nid, unsigned long start_pfn, unsigned long end_pfn); extern unsigned long absent_pages_in_range(unsigned long start_pfn, unsigned long end_pfn); + +/* + * Allow archs to opt-in to keeping get_pfn_range_for_nid() available + * after boot. + */ +#ifdef CONFIG_ARCH_KEEP_MEMBLOCK +#define __init_or_memblock +#else +#define __init_or_memblock __init +#endif + extern void get_pfn_range_for_nid(unsigned int nid, unsigned long *start_pfn, unsigned long *end_pfn); extern unsigned long find_min_pfn_with_active_regions(void); diff --git a/mm/Kconfig b/mm/Kconfig index 0051f735ad98..178ed76cae1b 100644 --- a/mm/Kconfig +++ b/mm/Kconfig @@ -139,6 +139,12 @@ config HAVE_FAST_GUP config ARCH_KEEP_MEMBLOCK bool +# If the arch populates numa data into memblock, it can use memblock +# apis to interrogate that data at runtime. +config MEMBLOCK_NUMA_INFO + bool + depends on ARCH_KEEP_MEMBLOCK + config MEMORY_ISOLATION bool diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 48eb0f1410d4..df8bd169dbb4 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -6351,7 +6351,7 @@ void __init sparse_memory_present_with_active_regions(int nid) * with no available memory, a warning is printed and the start and end * PFNs will be 0. */ -void __init get_pfn_range_for_nid(unsigned int nid, +void __init_or_memblock get_pfn_range_for_nid(unsigned int nid, unsigned long *start_pfn, unsigned long *end_pfn) { unsigned long this_start_pfn, this_end_pfn; @@ -6369,6 +6369,27 @@ void __init get_pfn_range_for_nid(unsigned int nid, *start_pfn = 0; } +/* + * Generic implementation of memory_add_physaddr_to_nid() depends on + * architecture using memblock data for numa information. + */ +#ifdef CONFIG_MEMBLOCK_NUMA_INFO +int __init_or_memblock memory_add_physaddr_to_nid(u64 addr) +{ + unsigned long start_pfn, end_pfn, pfn = PHYS_PFN(addr); + int nid; + + for_each_online_node(nid) { + get_pfn_range_for_nid(nid, &start_pfn, &end_pfn); + if (pfn >= start_pfn && pfn <= end_pfn) + return nid; + } + /* Default to node0 as not all callers are prepared for this to fail */ + return 0; +} +EXPORT_SYMBOL_GPL(memory_add_physaddr_to_nid); +#endif /* CONFIG_MEMBLOCK_NUMA_INFO */ + /* * This finds a zone that can be used for ZONE_MOVABLE pages. The * assumption is made that zones within a node are ordered in monotonic