summaryrefslogtreecommitdiff
path: root/mm/bootmem.c
diff options
context:
space:
mode:
authorJohannes Weiner <hannes@saeurebad.de>2008-07-23 21:28:03 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2008-07-24 10:47:20 -0700
commit636cc40cb79f511d9caa27ef098a83e4fa4971fb (patch)
treec1090aa1a56bfc1ddb3de2f17447b98c20515646 /mm/bootmem.c
parentdf049a5f41a3b2eee2131221959e3b558ba7c705 (diff)
bootmem: revisit bootmem descriptor list handling
link_bootmem handles an insertion of a new descriptor into the sorted list in more or less three explicit branches; empty list, insert in between and append. These cases can be expressed implicite. Also mark the sorted list as initdata as it can be thrown away after boot as well. Signed-off-by: Johannes Weiner <hannes@saeurebad.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/bootmem.c')
-rw-r--r--mm/bootmem.c23
1 files changed, 10 insertions, 13 deletions
diff --git a/mm/bootmem.c b/mm/bootmem.c
index 484849bfc8c4..9da7d4097810 100644
--- a/mm/bootmem.c
+++ b/mm/bootmem.c
@@ -23,7 +23,6 @@ unsigned long max_low_pfn;
unsigned long min_low_pfn;
unsigned long max_pfn;
-static LIST_HEAD(bdata_list);
#ifdef CONFIG_CRASH_DUMP
/*
* If we have booted due to a crash, max_pfn will be a very low value. We need
@@ -34,6 +33,8 @@ unsigned long saved_max_pfn;
bootmem_data_t bootmem_node_data[MAX_NUMNODES] __initdata;
+static struct list_head bdata_list __initdata = LIST_HEAD_INIT(bdata_list);
+
static int bootmem_debug;
static int __init bootmem_debug_setup(char *buf)
@@ -73,20 +74,16 @@ unsigned long __init bootmem_bootmap_pages(unsigned long pages)
*/
static void __init link_bootmem(bootmem_data_t *bdata)
{
- bootmem_data_t *ent;
+ struct list_head *iter;
- if (list_empty(&bdata_list)) {
- list_add(&bdata->list, &bdata_list);
- return;
- }
- /* insert in order */
- list_for_each_entry(ent, &bdata_list, list) {
- if (bdata->node_boot_start < ent->node_boot_start) {
- list_add_tail(&bdata->list, &ent->list);
- return;
- }
+ list_for_each(iter, &bdata_list) {
+ bootmem_data_t *ent;
+
+ ent = list_entry(iter, bootmem_data_t, list);
+ if (bdata->node_boot_start < ent->node_boot_start)
+ break;
}
- list_add_tail(&bdata->list, &bdata_list);
+ list_add_tail(&bdata->list, iter);
}
/*