• Emil Medve's avatar
    [POWERPC] Optimize counting distinct entries in the relocation sections · eda09fbd
    Emil Medve authored
    When a module has relocation sections with tens of thousands of
    entries, counting the distinct/unique entries only (i.e. no
    duplicates) at load time can take tens of seconds and up to minutes.
    The sore point is the count_relocs() function which is called as part
    of the architecture specific module loading processing path:
    
    	-> load_module()			generic
    	   -> module_frob_arch_sections()	arch specific
    	      -> get_plt_size()		32-bit
    	      -> get_stubs_size()	64-bit
    		 -> count_relocs()
    
    Here count_relocs is being called to find out how many distinct
    targets of R_PPC_REL24 relocations there are, since each distinct
    target needs a PLT entry or a stub created for it.
    
    The previous counting algorithm has O(n^2) complexity.  Basically two
    solutions were proposed on the e-mail list: a hash based approach and
    a sort based approach.
    
    The hash based approach is the fastest (O(n)) but the has it needs
    additional memory and for certain corner cases it could take lots of
    memory due to the degeneration of the hash.  One such proposal was
    submitted here:
    
    http://ozlabs.org/pipermail/linuxppc-dev/2007-June/037641.html
    
    The sort based approach is slower (O(n * log n + n)) but if the
    sorting is done "in place" it doesn't need additional memory.
    This has O(n + n * log n) complexity with no additional memory
    requirements.
    
    This commit implements the in-place sort option.
    Signed-off-by: default avatarEmil Medve <Emilian.Medve@Freescale.com>
    Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
    eda09fbd
module_64.c 14.6 KB