From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754665Ab0CZW3I (ORCPT ); Fri, 26 Mar 2010 18:29:08 -0400 Received: from acsinet11.oracle.com ([141.146.126.233]:49652 "EHLO acsinet11.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754442Ab0CZWZi (ORCPT ); Fri, 26 Mar 2010 18:25:38 -0400 From: Yinghai Lu To: Ingo Molnar , Thomas Gleixner , "H. Peter Anvin" , Andrew Morton , David Miller , Benjamin Herrenschmidt , Linus Torvalds Cc: Johannes Weiner , linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, Yinghai Lu Subject: [PATCH 10/24] lmb: Add lmb_to_bootmem() Date: Fri, 26 Mar 2010 15:21:40 -0700 Message-Id: <1269642114-16588-11-git-send-email-yinghai@kernel.org> X-Mailer: git-send-email 1.6.4.2 In-Reply-To: <1269642114-16588-1-git-send-email-yinghai@kernel.org> References: <1269642114-16588-1-git-send-email-yinghai@kernel.org> X-Source-IP: acsmt354.oracle.com [141.146.40.154] X-Auth-Type: Internal IP X-CT-RefId: str=0001.0A090202.4BAD343B.00F8,ss=1,fgs=0 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org lmb_to_bootmem() will reserve lmb.reserved.region in bootmem We can use it to with all arches that support lmb. Signed-off-by: Yinghai Lu --- include/linux/lmb.h | 2 ++ mm/lmb.c | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 0 deletions(-) diff --git a/include/linux/lmb.h b/include/linux/lmb.h index 7301072..f5071e1 100644 --- a/include/linux/lmb.h +++ b/include/linux/lmb.h @@ -92,6 +92,8 @@ u64 find_lmb_area(u64 start, u64 end, u64 size, u64 align); u64 find_lmb_area_size(u64 start, u64 *sizep, u64 align); u64 get_max_mapped(void); +void lmb_to_bootmem(u64 start, u64 end); + #include #endif /* __KERNEL__ */ diff --git a/mm/lmb.c b/mm/lmb.c index a91f48d..7a34f4a 100644 --- a/mm/lmb.c +++ b/mm/lmb.c @@ -640,6 +640,38 @@ void __init free_lmb(u64 start, u64 end) lmb_free(start, end - start); } +#ifndef CONFIG_NO_BOOTMEM +void __init lmb_to_bootmem(u64 start, u64 end) +{ + int i, count; + u64 final_start, final_end; + + /* Take out region array itself */ + if (lmb.reserved.region != lmb_reserved_region) + lmb_free(__pa(lmb.reserved.region), sizeof(struct lmb_property) * lmb.reserved.nr_regions); + + count = lmb.reserved.cnt; + pr_info( "(%d early reservations) ==> bootmem [%010llx - %010llx]\n", count, start, end); + for (i = 0; i < count; i++) { + struct lmb_property *r = &lmb.reserved.region[i]; + pr_info(" #%d [%010llx - %010llx] ", i, r->base, r->base + r->size); + final_start = max(start, r->base); + final_end = min(end, r->base + r->size); + if (final_start >= final_end) { + pr_cont("\n"); + continue; + } + pr_cont(" ==> [%010llx - %010llx]\n", final_start, final_end); + reserve_bootmem_generic(final_start, final_end - final_start, BOOTMEM_DEFAULT); + } + /* Clear them to avoid misusing ? */ + memset(&lmb.reserved.region[0], 0, sizeof(struct lmb_property) * lmb.reserved.nr_regions); + lmb.reserved.region = NULL; + lmb.reserved.nr_regions = 0; + lmb.reserved.cnt = 0; +} +#endif + static int __init find_overlapped_early(u64 start, u64 end) { int i; -- 1.6.4.2