Skip to content
  • Russ Anderson's avatar
    mm: speedup in __early_pfn_to_nid · 7c243c71
    Russ Anderson authored
    
    
    When booting on a large memory system, the kernel spends considerable
    time in memmap_init_zone() setting up memory zones.  Analysis shows
    significant time spent in __early_pfn_to_nid().
    
    The routine memmap_init_zone() checks each PFN to verify the nid is
    valid.  __early_pfn_to_nid() sequentially scans the list of pfn ranges
    to find the right range and returns the nid.  This does not scale well.
    On a 4 TB (single rack) system there are 308 memory ranges to scan.  The
    higher the PFN the more time spent sequentially spinning through memory
    ranges.
    
    Since memmap_init_zone() increments pfn, it will almost always be
    looking for the same range as the previous pfn, so check that range
    first.  If it is in the same range, return that nid.  If not, scan the
    list as before.
    
    A 4 TB (single rack) UV1 system takes 512 seconds to get through the
    zone code.  This performance optimization reduces the time by 189
    seconds, a 36% improvement.
    
    A 2 TB (single rack) UV2 system goes from 212.7 seconds to 99.8 seconds,
    a 112.9 second (53%) reduction.
    
    [akpm@linux-foundation.org: make the statics __meminitdata]
    [akpm@linux-foundation.org: fix comment formatting]
    [akpm@linux-foundation.org: fix ia64, per yinghai]
    [akpm@linux-foundation.org: add missing semicolon, per Tony]
    Signed-off-by: default avatarRuss Anderson <rja@sgi.com>
    Cc: David Rientjes <rientjes@google.com>
    Cc: Ingo Molnar <mingo@elte.hu>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: "H. Peter Anvin" <hpa@zytor.com>
    Tested-by: default avatar"Luck, Tony" <tony.luck@intel.com>
    Cc: Yinghai Lu <yinghai@kernel.org>
    Cc: Lin Feng <linfeng@cn.fujitsu.com>
    Cc: KOSAKI Motohiro <kosaki.motohiro@gmail.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    7c243c71