Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932149Ab3D3JTs (ORCPT ); Tue, 30 Apr 2013 05:19:48 -0400 Received: from cn.fujitsu.com ([222.73.24.84]:50842 "EHLO song.cn.fujitsu.com" rhost-flags-OK-FAIL-OK-OK) by vger.kernel.org with ESMTP id S1759939Ab3D3JSp (ORCPT ); Tue, 30 Apr 2013 05:18:45 -0400 X-IronPort-AV: E=Sophos;i="4.87,580,1363104000"; d="scan'208";a="7159156" From: Tang Chen To: mingo@redhat.com, hpa@zytor.com, akpm@linux-foundation.org, yinghai@kernel.org, jiang.liu@huawei.com, wency@cn.fujitsu.com, isimatu.yasuaki@jp.fujitsu.com, tj@kernel.org, laijs@cn.fujitsu.com, davem@davemloft.net, mgorman@suse.de, minchan@kernel.org, mina86@mina86.com Cc: x86@kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: [PATCH v2 09/13] x86, numa, memblock: Introduce MEMBLK_LOCAL_NODE to mark and reserve node-life-cycle data. Date: Tue, 30 Apr 2013 17:21:19 +0800 Message-Id: <1367313683-10267-10-git-send-email-tangchen@cn.fujitsu.com> X-Mailer: git-send-email 1.7.10.1 In-Reply-To: <1367313683-10267-1-git-send-email-tangchen@cn.fujitsu.com> References: <1367313683-10267-1-git-send-email-tangchen@cn.fujitsu.com> X-MIMETrack: Itemize by SMTP Server on mailserver/fnst(Release 8.5.3|September 15, 2011) at 2013/04/30 17:16:51, Serialize by Router on mailserver/fnst(Release 8.5.3|September 15, 2011) at 2013/04/30 17:16:52, Serialize complete at 2013/04/30 17:16:52 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3105 Lines: 92 node-life-cycle data (whose life cycle is the same as a node) allocated by memblock should be marked so that when we free usable memory to buddy system, we can skip them. This patch introduces a flag MEMBLK_LOCAL_NODE for memblock to reserve node-life-cycle data. For now, it is only kernel direct mapping pagetable pages, based on Yinghai's patch. Signed-off-by: Tang Chen --- arch/x86/mm/init.c | 16 ++++++++++++---- include/linux/memblock.h | 2 ++ mm/memblock.c | 7 +++++++ 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/arch/x86/mm/init.c b/arch/x86/mm/init.c index 8d0007a..002d487 100644 --- a/arch/x86/mm/init.c +++ b/arch/x86/mm/init.c @@ -62,14 +62,22 @@ __ref void *alloc_low_pages(unsigned int num) low_min_pfn_mapped << PAGE_SHIFT, low_max_pfn_mapped << PAGE_SHIFT, PAGE_SIZE * num , PAGE_SIZE); - } else + if (!ret) + panic("alloc_low_page: can not alloc memory"); + + memblock_reserve(ret, PAGE_SIZE * num); + } else { ret = memblock_find_in_range( local_min_pfn_mapped << PAGE_SHIFT, local_max_pfn_mapped << PAGE_SHIFT, PAGE_SIZE * num , PAGE_SIZE); - if (!ret) - panic("alloc_low_page: can not alloc memory"); - memblock_reserve(ret, PAGE_SIZE * num); + if (!ret) + panic("alloc_low_page: can not alloc memory"); + + memblock_reserve_local_node(ret, PAGE_SIZE * num, + memory_add_physaddr_to_nid(ret)); + } + pfn = ret >> PAGE_SHIFT; } else { pfn = pgt_buf_end; diff --git a/include/linux/memblock.h b/include/linux/memblock.h index 5064eed..3b2d1c4 100644 --- a/include/linux/memblock.h +++ b/include/linux/memblock.h @@ -23,6 +23,7 @@ /* Definition of memblock flags. */ enum memblock_flags { + MEMBLK_LOCAL_NODE, /* node-life-cycle data */ __NR_MEMBLK_FLAGS, /* number of flags */ }; @@ -65,6 +66,7 @@ int memblock_add(phys_addr_t base, phys_addr_t size); int memblock_remove(phys_addr_t base, phys_addr_t size); int memblock_free(phys_addr_t base, phys_addr_t size); int memblock_reserve(phys_addr_t base, phys_addr_t size); +int memblock_reserve_local_node(phys_addr_t base, phys_addr_t size, int nid); void memblock_trim_memory(phys_addr_t align); void memblock_mark_kernel_nodes(void); diff --git a/mm/memblock.c b/mm/memblock.c index 1b93a5d..edde4c2 100644 --- a/mm/memblock.c +++ b/mm/memblock.c @@ -589,6 +589,13 @@ int __init_memblock memblock_reserve(phys_addr_t base, phys_addr_t size) MEMBLK_FLAGS_DEFAULT); } +int __init_memblock memblock_reserve_local_node(phys_addr_t base, + phys_addr_t size, int nid) +{ + unsigned long flags = 1 << MEMBLK_LOCAL_NODE; + return memblock_reserve_region(base, size, nid, flags); +} + /** * __next_free_mem_range - next function for for_each_free_mem_range() * @idx: pointer to u64 loop variable -- 1.7.1 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/