From: Yinghai Lu <yinghai@kernel.org> To: Ingo Molnar <mingo@elte.hu>, Thomas Gleixner <tglx@linutronix.de>, "H. Peter Anvin" <hpa@zytor.com>, Andrew Morton <akpm@linux-foundation.org>, David Miller <davem@davemloft.net>, Be Cc: Johannes Weiner <hannes@cmpxchg.org>, linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, Yinghai Lu <yinghai@kernel.org> Subject: [PATCH 18/24] lmb: Add reserve_lmb_overlap_ok() Date: Fri, 26 Mar 2010 15:21:48 -0700 [thread overview] Message-ID: <1269642114-16588-19-git-send-email-yinghai@kernel.org> (raw) In-Reply-To: <1269642114-16588-1-git-send-email-yinghai@kernel.org> Some areas from firmware could be reserved several times from different callers. If these area are overlapped, We may have overlapped entries in lmb.reserved. Try to free the area at first, before rerserve them again. Signed-off-by: Yinghai Lu <yinghai@kernel.org> --- include/linux/lmb.h | 1 + mm/lmb.c | 27 +++++++++++++++++++++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/include/linux/lmb.h b/include/linux/lmb.h index 285f287..1e11fe0 100644 --- a/include/linux/lmb.h +++ b/include/linux/lmb.h @@ -85,6 +85,7 @@ lmb_end_pfn(struct lmb_region *type, unsigned long region_nr) } void reserve_lmb(u64 start, u64 end, char *name); +void reserve_lmb_overlap_ok(u64 start, u64 end, char *name); void free_lmb(u64 start, u64 end); void add_lmb_memory(u64 start, u64 end); u64 __find_lmb_area(u64 ei_start, u64 ei_last, u64 start, u64 end, diff --git a/mm/lmb.c b/mm/lmb.c index 0dab3b6..20ab927 100644 --- a/mm/lmb.c +++ b/mm/lmb.c @@ -615,6 +615,12 @@ void __init add_lmb_memory(u64 start, u64 end) lmb_add(start, end - start); } +static void __init __reserve_lmb(u64 start, u64 end, char *name) +{ + __check_and_double_region_array(&lmb.reserved, &lmb_reserved_region[0], start, end); + lmb_reserve(start, end - start); +} + void __init reserve_lmb(u64 start, u64 end, char *name) { if (start == end) @@ -623,8 +629,25 @@ void __init reserve_lmb(u64 start, u64 end, char *name) if (WARN_ONCE(start > end, "reserve_lmb: wrong range [%#llx, %#llx]\n", start, end)) return; - __check_and_double_region_array(&lmb.reserved, &lmb_reserved_region[0], start, end); - lmb_reserve(start, end - start); + __reserve_lmb(start, end, name); +} + +/* + * Could be used to avoid having overlap entries in lmb.reserved.region. + * Don't need to use it with area that is from find_lmb_area() + * Only use it for the area that fw hidden area. + */ +void __init reserve_lmb_overlap_ok(u64 start, u64 end, char *name) +{ + if (start == end) + return; + + if (WARN_ONCE(start > end, "reserve_lmb_overlap_ok: wrong range [%#llx, %#llx]\n", start, end)) + return; + + /* Free that region at first */ + lmb_free(start, end - start); + __reserve_lmb(start, end, name); } void __init free_lmb(u64 start, u64 end) -- 1.6.4.2
WARNING: multiple messages have this Message-ID (diff)
From: Yinghai Lu <yinghai@kernel.org> To: Ingo Molnar <mingo@elte.hu>, Thomas Gleixner <tglx@linutronix.de>, "H. Peter Anvin" <hpa@zytor.com>, Andrew Morton <akpm@linux-foundation.org>, David Miller <davem@davemloft.net>, Benjamin Herrenschmidt <benh@kernel.crashing.org>, Linus Torvalds <torvalds@linux-foundation.org> Cc: Johannes Weiner <hannes@cmpxchg.org>, linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, Yinghai Lu <yinghai@kernel.org> Subject: [PATCH 18/24] lmb: Add reserve_lmb_overlap_ok() Date: Fri, 26 Mar 2010 15:21:48 -0700 [thread overview] Message-ID: <1269642114-16588-19-git-send-email-yinghai@kernel.org> (raw) Message-ID: <20100326222148.8oMyMafcP5NxKblVywWjlHomIMVy3cprDkTXip-YQSQ@z> (raw) In-Reply-To: <1269642114-16588-1-git-send-email-yinghai@kernel.org> Some areas from firmware could be reserved several times from different callers. If these area are overlapped, We may have overlapped entries in lmb.reserved. Try to free the area at first, before rerserve them again. Signed-off-by: Yinghai Lu <yinghai@kernel.org> --- include/linux/lmb.h | 1 + mm/lmb.c | 27 +++++++++++++++++++++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/include/linux/lmb.h b/include/linux/lmb.h index 285f287..1e11fe0 100644 --- a/include/linux/lmb.h +++ b/include/linux/lmb.h @@ -85,6 +85,7 @@ lmb_end_pfn(struct lmb_region *type, unsigned long region_nr) } void reserve_lmb(u64 start, u64 end, char *name); +void reserve_lmb_overlap_ok(u64 start, u64 end, char *name); void free_lmb(u64 start, u64 end); void add_lmb_memory(u64 start, u64 end); u64 __find_lmb_area(u64 ei_start, u64 ei_last, u64 start, u64 end, diff --git a/mm/lmb.c b/mm/lmb.c index 0dab3b6..20ab927 100644 --- a/mm/lmb.c +++ b/mm/lmb.c @@ -615,6 +615,12 @@ void __init add_lmb_memory(u64 start, u64 end) lmb_add(start, end - start); } +static void __init __reserve_lmb(u64 start, u64 end, char *name) +{ + __check_and_double_region_array(&lmb.reserved, &lmb_reserved_region[0], start, end); + lmb_reserve(start, end - start); +} + void __init reserve_lmb(u64 start, u64 end, char *name) { if (start == end) @@ -623,8 +629,25 @@ void __init reserve_lmb(u64 start, u64 end, char *name) if (WARN_ONCE(start > end, "reserve_lmb: wrong range [%#llx, %#llx]\n", start, end)) return; - __check_and_double_region_array(&lmb.reserved, &lmb_reserved_region[0], start, end); - lmb_reserve(start, end - start); + __reserve_lmb(start, end, name); +} + +/* + * Could be used to avoid having overlap entries in lmb.reserved.region. + * Don't need to use it with area that is from find_lmb_area() + * Only use it for the area that fw hidden area. + */ +void __init reserve_lmb_overlap_ok(u64 start, u64 end, char *name) +{ + if (start == end) + return; + + if (WARN_ONCE(start > end, "reserve_lmb_overlap_ok: wrong range [%#llx, %#llx]\n", start, end)) + return; + + /* Free that region at first */ + lmb_free(start, end - start); + __reserve_lmb(start, end, name); } void __init free_lmb(u64 start, u64 end) -- 1.6.4.2
next prev parent reply other threads:[~2010-03-26 22:26 UTC|newest] Thread overview: 72+ messages / expand[flat|nested] mbox.gz Atom feed top 2010-03-26 22:21 [PATCH -v8 00/24] use lmb with x86 Yinghai Lu 2010-03-26 22:21 ` Yinghai Lu 2010-03-26 22:21 ` [PATCH 01/24] x86: Make smp_locks end with page alignment Yinghai Lu 2010-03-26 22:21 ` Yinghai Lu 2010-03-26 23:33 ` Johannes Weiner 2010-03-26 22:21 ` [PATCH 02/24] x86: Make sure free_init_pages() free pages in boundary Yinghai Lu 2010-03-26 22:21 ` Yinghai Lu 2010-03-26 23:06 ` Johannes Weiner 2010-03-26 23:06 ` Johannes Weiner 2010-03-26 23:45 ` Yinghai Lu 2010-03-27 0:07 ` Johannes Weiner 2010-03-27 0:07 ` Johannes Weiner 2010-03-27 0:17 ` Yinghai Lu 2010-03-27 0:17 ` Yinghai Lu 2010-03-27 1:19 ` [PATCH -v3] " Yinghai Lu 2010-03-28 0:03 ` Johannes Weiner 2010-03-28 0:50 ` Yinghai Lu 2010-03-28 1:01 ` Johannes Weiner 2010-03-28 1:58 ` Yinghai Lu 2010-03-28 23:35 ` [patch v5] x86: page-alin initrd area size Johannes Weiner 2010-03-29 0:41 ` Yinghai Lu 2010-03-26 22:21 ` [PATCH 03/24] x86: Do not free zero sized per cpu areas Yinghai Lu 2010-03-26 22:21 ` Yinghai Lu 2010-03-26 23:42 ` Johannes Weiner 2010-03-26 23:42 ` Johannes Weiner 2010-03-26 23:49 ` Yinghai Lu 2010-03-26 23:49 ` Yinghai Lu 2010-03-26 23:54 ` Johannes Weiner 2010-03-26 23:56 ` Yinghai Lu 2010-03-27 1:18 ` [PATCH -v8] " Yinghai Lu 2010-03-26 22:21 ` [PATCH 04/24] lmb: Move lmb.c to mm/ Yinghai Lu 2010-03-26 22:21 ` Yinghai Lu 2010-03-26 22:21 ` [PATCH 05/24] lmb: Seperate region array from lmb_region struct Yinghai Lu 2010-03-26 22:21 ` Yinghai Lu 2010-03-26 22:21 ` [PATCH 06/24] lmb: Add find_lmb_area() Yinghai Lu 2010-03-26 22:21 ` Yinghai Lu 2010-03-26 22:21 ` [PATCH 07/24] lmb: Add reserve_lmb/free_lmb Yinghai Lu 2010-03-26 22:21 ` Yinghai Lu 2010-03-26 22:21 ` [PATCH 08/24] lmb: Add find_lmb_area_size() Yinghai Lu 2010-03-26 22:21 ` Yinghai Lu 2010-03-26 22:21 ` [PATCH 09/24] bootmem, x86: Add weak version of reserve_bootmem_generic Yinghai Lu 2010-03-26 22:21 ` Yinghai Lu 2010-03-26 22:21 ` [PATCH 10/24] lmb: Add lmb_to_bootmem() Yinghai Lu 2010-03-26 22:21 ` Yinghai Lu 2010-03-26 22:21 ` [PATCH 11/24] lmb: Add get_free_all_memory_range() Yinghai Lu 2010-03-26 22:21 ` Yinghai Lu 2010-03-26 22:21 ` [PATCH 12/24] lmb: Add lmb_register_active_regions() and lmb_hole_size() Yinghai Lu 2010-03-26 22:21 ` Yinghai Lu 2010-03-26 22:21 ` [PATCH 13/24] lmb: Prepare to include linux/lmb.h in core file Yinghai Lu 2010-03-26 22:21 ` Yinghai Lu 2010-03-26 22:21 ` [PATCH 14/24] lmb: Add find_memory_core_early() Yinghai Lu 2010-03-26 22:21 ` Yinghai Lu 2010-03-26 22:21 ` [PATCH 15/24] lmb: Add find_lmb_area_node() Yinghai Lu 2010-03-26 22:21 ` Yinghai Lu 2010-03-26 22:21 ` [PATCH 16/24] lmb: Add lmb_free_memory_size() Yinghai Lu 2010-03-26 22:21 ` Yinghai Lu 2010-03-26 22:21 ` [PATCH 17/24] lmb: Add lmb_memory_size() Yinghai Lu 2010-03-26 22:21 ` Yinghai Lu 2010-03-26 22:21 ` Yinghai Lu [this message] 2010-03-26 22:21 ` [PATCH 18/24] lmb: Add reserve_lmb_overlap_ok() Yinghai Lu 2010-03-26 22:21 ` [PATCH 19/24] x86: Add sanitize_e820_map() Yinghai Lu 2010-03-26 22:21 ` Yinghai Lu 2010-03-26 22:21 ` [PATCH 20/24] x86: Use lmb to replace early_res Yinghai Lu 2010-03-26 22:21 ` Yinghai Lu 2010-03-26 22:21 ` [PATCH 21/24] x86: Replace e820_/_early string with lmb_ Yinghai Lu 2010-03-26 22:21 ` Yinghai Lu 2010-03-26 22:21 ` [PATCH 22/24] x86: Remove not used early_res code Yinghai Lu 2010-03-26 22:21 ` Yinghai Lu 2010-03-26 22:21 ` [PATCH 23/24] x86, lmb: Use lmb_memory_size()/lmb_free_memory_size() to get correct dma_reserve Yinghai Lu 2010-03-26 22:21 ` Yinghai Lu 2010-03-26 22:21 ` [PATCH 24/24] x86: Align e820 ram range to page Yinghai Lu 2010-03-26 22:21 ` Yinghai Lu
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1269642114-16588-19-git-send-email-yinghai@kernel.org \ --to=yinghai@kernel.org \ --cc=akpm@linux-foundation.org \ --cc=davem@davemloft.net \ --cc=hannes@cmpxchg.org \ --cc=hpa@zytor.com \ --cc=linux-arch@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=mingo@elte.hu \ --cc=tglx@linutronix.de \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).