From patchwork Thu Sep 1 06:55:02 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Leizhen \(ThunderTown\)" X-Patchwork-Id: 75173 Delivered-To: patch@linaro.org Received: by 10.140.29.8 with SMTP id a8csp130881qga; Wed, 31 Aug 2016 23:59:11 -0700 (PDT) X-Received: by 10.98.77.70 with SMTP id a67mr23890178pfb.151.1472713151584; Wed, 31 Aug 2016 23:59:11 -0700 (PDT) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id d131si4157265pfg.5.2016.08.31.23.59.11; Wed, 31 Aug 2016 23:59:11 -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 S1752756AbcIAG7G (ORCPT + 27 others); Thu, 1 Sep 2016 02:59:06 -0400 Received: from szxga01-in.huawei.com ([58.251.152.64]:61093 "EHLO szxga01-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753079AbcIAG4h (ORCPT ); Thu, 1 Sep 2016 02:56:37 -0400 Received: from 172.24.1.60 (EHLO szxeml422-hub.china.huawei.com) ([172.24.1.60]) by szxrg01-dlp.huawei.com (MOS 4.3.7-GA FastPath queued) with ESMTP id DQL43241; Thu, 01 Sep 2016 14:56:22 +0800 (CST) Received: from localhost (10.177.23.164) by szxeml422-hub.china.huawei.com (10.82.67.152) with Microsoft SMTP Server id 14.3.235.1; Thu, 1 Sep 2016 14:56:15 +0800 From: Zhen Lei To: Catalin Marinas , Will Deacon , linux-arm-kernel , linux-kernel , Rob Herring , "Frank Rowand" , devicetree , Andrew Morton , linux-mm CC: Zefan Li , Xinwei Hu , "Tianhong Ding" , Hanjun Guo , Zhen Lei Subject: [PATCH v8 11/16] arm64/numa: support HAVE_MEMORYLESS_NODES Date: Thu, 1 Sep 2016 14:55:02 +0800 Message-ID: <1472712907-12700-12-git-send-email-thunder.leizhen@huawei.com> X-Mailer: git-send-email 1.9.5.msysgit.1 In-Reply-To: <1472712907-12700-1-git-send-email-thunder.leizhen@huawei.com> References: <1472712907-12700-1-git-send-email-thunder.leizhen@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.177.23.164] X-CFilter-Loop: Reflected X-Mirapoint-Virus-RAPID-Raw: score=unknown(0), refid=str=0001.0A020206.57C7D118.013C, ss=1, re=0.000, recu=0.000, reip=0.000, cl=1, cld=1, fgs=0, ip=0.0.0.0, so=2013-06-18 04:22:30, dmn=2013-03-21 17:37:32 X-Mirapoint-Loop-Id: 53c8441e431923890864b13d15022fbf Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Some numa nodes may have no memory. For example: 1. cpu0 on node0 2. cpu1 on node1 3. device0 access the momory from node0 and node1 take the same time. So, we can not simply classify device0 to node0 or node1, but we can define a node2 which distances to node0 and node1 are the same. Signed-off-by: Zhen Lei --- arch/arm64/Kconfig | 4 ++++ arch/arm64/mm/numa.c | 11 ++++++----- 2 files changed, 10 insertions(+), 5 deletions(-) -- 2.5.0 diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index 2815af6..3a2b6ed 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -611,6 +611,10 @@ config NEED_PER_CPU_EMBED_FIRST_CHUNK def_bool y depends on NUMA +config HAVE_MEMORYLESS_NODES + def_bool y + depends on NUMA + source kernel/Kconfig.preempt source kernel/Kconfig.hz diff --git a/arch/arm64/mm/numa.c b/arch/arm64/mm/numa.c index 087064d..891bdaa 100644 --- a/arch/arm64/mm/numa.c +++ b/arch/arm64/mm/numa.c @@ -149,10 +149,11 @@ static int __init pcpu_cpu_distance(unsigned int from, unsigned int to) static void * __init pcpu_fc_alloc(unsigned int cpu, size_t size, size_t align) { - int nid = early_cpu_to_node(cpu); + phys_addr_t alloc; - return memblock_virt_alloc_try_nid(size, align, - __pa(MAX_DMA_ADDRESS), MEMBLOCK_ALLOC_ACCESSIBLE, nid); + alloc = memblock_alloc_near_nid(size, align, early_cpu_to_node(cpu)); + + return phys_to_virt(alloc); } static void __init pcpu_fc_free(void *ptr, size_t size) @@ -222,7 +223,7 @@ static void __init setup_node_data(int nid, u64 start_pfn, u64 end_pfn) pr_info("Initmem setup node %d [mem %#010Lx-%#010Lx]\n", nid, start_pfn << PAGE_SHIFT, (end_pfn << PAGE_SHIFT) - 1); - nd_pa = memblock_alloc_try_nid(nd_size, SMP_CACHE_BYTES, nid); + nd_pa = memblock_alloc_near_nid(nd_size, SMP_CACHE_BYTES, nid); nd = __va(nd_pa); /* report and initialize */ @@ -232,7 +233,7 @@ static void __init setup_node_data(int nid, u64 start_pfn, u64 end_pfn) if (tnid != nid) pr_info("NODE_DATA(%d) on node %d\n", nid, tnid); - node_data[nid] = nd; + NODE_DATA(nid) = nd; memset(NODE_DATA(nid), 0, sizeof(pg_data_t)); NODE_DATA(nid)->node_id = nid; NODE_DATA(nid)->node_start_pfn = start_pfn;