From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
To: linux-mm@kvack.org
Cc: linux-kernel@vger.kernel.org, tglx@linuxtronix.de, mingo@elte.hu,
davem@davemloft.net, lethal@linux-sh.org,
Benjamin Herrenschmidt <benh@kernel.crashing.org>
Subject: [PATCH 21/25] lmb: Add "start" argument to lmb_find_base()
Date: Mon, 10 May 2010 19:38:55 +1000 [thread overview]
Message-ID: <1273484339-28911-22-git-send-email-benh@kernel.crashing.org> (raw)
In-Reply-To: <1273484339-28911-21-git-send-email-benh@kernel.crashing.org>
To constraint the search of a region between two boundaries,
which will be used by the new NUMA aware allocator among others.
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
---
lib/lmb.c | 27 ++++++++++++++++-----------
1 files changed, 16 insertions(+), 11 deletions(-)
diff --git a/lib/lmb.c b/lib/lmb.c
index 84ac3a9..848f908 100644
--- a/lib/lmb.c
+++ b/lib/lmb.c
@@ -117,19 +117,18 @@ static phys_addr_t __init lmb_find_region(phys_addr_t start, phys_addr_t end,
return LMB_ERROR;
}
-static phys_addr_t __init lmb_find_base(phys_addr_t size, phys_addr_t align, phys_addr_t max_addr)
+static phys_addr_t __init lmb_find_base(phys_addr_t size, phys_addr_t align,
+ phys_addr_t start, phys_addr_t end)
{
long i;
- phys_addr_t base = 0;
- phys_addr_t res_base;
BUG_ON(0 == size);
size = lmb_align_up(size, align);
/* Pump up max_addr */
- if (max_addr == LMB_ALLOC_ACCESSIBLE)
- max_addr = lmb.current_limit;
+ if (end == LMB_ALLOC_ACCESSIBLE)
+ end = lmb.current_limit;
/* We do a top-down search, this tends to limit memory
* fragmentation by keeping early boot allocs near the
@@ -138,13 +137,19 @@ static phys_addr_t __init lmb_find_base(phys_addr_t size, phys_addr_t align, phy
for (i = lmb.memory.cnt - 1; i >= 0; i--) {
phys_addr_t lmbbase = lmb.memory.regions[i].base;
phys_addr_t lmbsize = lmb.memory.regions[i].size;
+ phys_addr_t bottom, top, found;
if (lmbsize < size)
continue;
- base = min(lmbbase + lmbsize, max_addr);
- res_base = lmb_find_region(lmbbase, base, size, align);
- if (res_base != LMB_ERROR)
- return res_base;
+ if ((lmbbase + lmbsize) <= start)
+ break;
+ bottom = max(lmbbase, start);
+ top = min(lmbbase + lmbsize, end);
+ if (bottom >= top)
+ continue;
+ found = lmb_find_region(lmbbase, top, size, align);
+ if (found != LMB_ERROR)
+ return found;
}
return 0;
}
@@ -198,7 +203,7 @@ static int lmb_double_array(struct lmb_type *type)
new_array = kmalloc(new_size, GFP_KERNEL);
addr = new_array == NULL ? LMB_ERROR : __pa(new_array);
} else
- addr = lmb_find_base(new_size, sizeof(phys_addr_t), LMB_ALLOC_ACCESSIBLE);
+ addr = lmb_find_base(new_size, sizeof(phys_addr_t), 0, LMB_ALLOC_ACCESSIBLE);
if (addr == LMB_ERROR) {
pr_err("lmb: Failed to double %s array from %ld to %ld entries !\n",
lmb_type_name(type), type->max, type->max * 2);
@@ -403,7 +408,7 @@ long __init lmb_reserve(phys_addr_t base, phys_addr_t size)
phys_addr_t __init __lmb_alloc_base(phys_addr_t size, phys_addr_t align, phys_addr_t max_addr)
{
- phys_addr_t found = lmb_find_base(size, align, max_addr);
+ phys_addr_t found = lmb_find_base(size, align, 0, max_addr);
if (found != LMB_ERROR &&
lmb_add_region(&lmb.reserved, found, size) >= 0)
--
1.6.3.3
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2010-05-10 10:57 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-05-10 9:38 [PATCH/WIP] lmb cleanups and additions Benjamin Herrenschmidt
2010-05-10 9:38 ` [PATCH 01/25] lmb: Rename lmb_region to lmb_type and lmb_property to lmb_region Benjamin Herrenschmidt
2010-05-10 9:38 ` [PATCH 02/25] lmb: No reason to include asm/lmb.h late Benjamin Herrenschmidt
2010-05-10 9:38 ` [PATCH 03/25] lmb: Introduce for_each_lmb() and new accessors, and use it Benjamin Herrenschmidt
2010-05-10 9:38 ` [PATCH 04/25] lmb: Remove nid_range argument, arch provides lmb_nid_range() instead Benjamin Herrenschmidt
2010-05-10 9:38 ` [PATCH 05/25] lmb: Factor the lowest level alloc function Benjamin Herrenschmidt
2010-05-10 9:38 ` [PATCH 06/25] lmb: Expose LMB_ALLOC_ANYWHERE Benjamin Herrenschmidt
2010-05-10 9:38 ` [PATCH 07/25] lmb: Introduce default allocation limit and use it to replace explicit ones Benjamin Herrenschmidt
2010-05-10 9:38 ` [PATCH 08/25] lmb: Remove rmo_size, burry it in arch/powerpc where it belongs Benjamin Herrenschmidt
2010-05-10 9:38 ` [PATCH 09/25] lmb: Change u64 to phys_addr_t Benjamin Herrenschmidt
2010-05-10 9:38 ` [PATCH 10/25] lmb: Remove unused lmb.debug struct member Benjamin Herrenschmidt
2010-05-10 9:38 ` [PATCH 11/25] lmb: Remove lmb_type.size and add lmb.memory_size instead Benjamin Herrenschmidt
2010-05-10 9:38 ` [PATCH 12/25] lmb: Move lmb arrays to static storage in lmb.c and make their size a variable Benjamin Herrenschmidt
2010-05-10 9:38 ` [PATCH 13/25] lmb: Add debug markers at the end of the array Benjamin Herrenschmidt
2010-05-10 9:38 ` [PATCH 14/25] lmb: Make lmb_find_region() out of lmb_alloc_region() Benjamin Herrenschmidt
2010-05-10 9:38 ` [PATCH 15/25] lmb: Define LMB_ERROR internally instead of using ~(phys_addr_t)0 Benjamin Herrenschmidt
2010-05-10 9:38 ` [PATCH 16/25] lmb: Move lmb_init() to the bottom of the file Benjamin Herrenschmidt
2010-05-10 9:38 ` [PATCH 17/25] lmb: split lmb_find_base() out of __lmb_alloc_base() Benjamin Herrenschmidt
2010-05-10 9:38 ` [PATCH 18/25] lmb: Move functions around into a more sensible order Benjamin Herrenschmidt
2010-05-10 9:38 ` [PATCH 19/25] lmb: Add array resizing support Benjamin Herrenschmidt
2010-05-10 9:38 ` [PATCH 20/25] lmb: Add arch function to control coalescing of lmb memory regions Benjamin Herrenschmidt
2010-05-10 9:38 ` Benjamin Herrenschmidt [this message]
2010-05-10 9:38 ` [PATCH 22/25] lmb: NUMA allocate can now use early_pfn_map Benjamin Herrenschmidt
2010-05-10 9:38 ` [PATCH 23/25] lmb: Separate lmb_alloc_nid() and lmb_alloc_try_nid() Benjamin Herrenschmidt
2010-05-10 23:37 ` [PATCH 21/25] lmb: Add "start" argument to lmb_find_base() Yinghai Lu
2010-05-11 4:56 ` Benjamin Herrenschmidt
2010-05-10 23:59 ` [PATCH 19/25] lmb: Add array resizing support Yinghai Lu
2010-05-11 4:56 ` Benjamin Herrenschmidt
2010-05-11 17:54 ` Yinghai Lu
2010-05-10 10:44 ` [PATCH 12/25] lmb: Move lmb arrays to static storage in lmb.c and make their size a variable Paul Mundt
2010-05-10 11:46 ` Benjamin Herrenschmidt
2010-05-11 12:30 ` [PATCH 05/25] lmb: Factor the lowest level alloc function Thomas Gleixner
2010-05-11 22:24 ` Benjamin Herrenschmidt
2010-05-12 5:24 ` Benjamin Herrenschmidt
2010-05-10 15:39 ` [PATCH 03/25] lmb: Introduce for_each_lmb() and new accessors, and use it Thomas Gleixner
2010-05-10 21:52 ` Benjamin Herrenschmidt
2010-05-12 5:20 ` Benjamin Herrenschmidt
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=1273484339-28911-22-git-send-email-benh@kernel.crashing.org \
--to=benh@kernel.crashing.org \
--cc=davem@davemloft.net \
--cc=lethal@linux-sh.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mingo@elte.hu \
--cc=tglx@linuxtronix.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: link
Be 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).