]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
driver core: Convert link_mem_sections to use find_memory_block_hinted.
authorRobin Holt <holt@sgi.com>
Wed, 29 Sep 2010 19:00:56 +0000 (14:00 -0500)
committerGreg Kroah-Hartman <gregkh@suse.de>
Fri, 22 Oct 2010 17:16:44 +0000 (10:16 -0700)
Modify link_mem_sections() to pass in the previous mem_block as a hint to
locating the next mem_block.  Since they are typically added in order this
results in a massive saving in time during boot of a very large system.
For example, on a 16TB x86_64 machine, it reduced the total time spent
linking all node's memory sections from 1 hour, 27 minutes to 46 seconds.

Signed-off-by: Robin Holt <holt@sgi.com>
To: Gary Hade <garyhade@us.ibm.com>
To: Badari Pulavarty <pbadari@us.ibm.com>
To: Ingo Molnar <mingo@elte.hu>
Reviewed-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/base/node.c

index 2872e86837b2bb0013b1d2ea9b7d1095d17cd33c..ee53558b452fb1076867e595820faf9f07909014 100644 (file)
@@ -409,25 +409,27 @@ static int link_mem_sections(int nid)
        unsigned long start_pfn = NODE_DATA(nid)->node_start_pfn;
        unsigned long end_pfn = start_pfn + NODE_DATA(nid)->node_spanned_pages;
        unsigned long pfn;
+       struct memory_block *mem_blk = NULL;
        int err = 0;
 
        for (pfn = start_pfn; pfn < end_pfn; pfn += PAGES_PER_SECTION) {
                unsigned long section_nr = pfn_to_section_nr(pfn);
                struct mem_section *mem_sect;
-               struct memory_block *mem_blk;
                int ret;
 
                if (!present_section_nr(section_nr))
                        continue;
                mem_sect = __nr_to_section(section_nr);
-               mem_blk = find_memory_block(mem_sect);
+               mem_blk = find_memory_block_hinted(mem_sect, mem_blk);
                ret = register_mem_sect_under_node(mem_blk, nid);
                if (!err)
                        err = ret;
 
                /* discard ref obtained in find_memory_block() */
-               kobject_put(&mem_blk->sysdev.kobj);
        }
+
+       if (mem_blk)
+               kobject_put(&mem_blk->sysdev.kobj);
        return err;
 }