• Robin Holt's avatar
    [PATCH] mm: ZAP_BLOCK causes redundant work · 51c6f666
    Robin Holt authored
    The address based work estimate for unmapping (for lockbreak) is and always
    was horribly inefficient for sparse mappings.  The problem is most simply
    explained with an example:
    
    If we find a pgd is clear, we still have to call into unmap_page_range
    PGDIR_SIZE / ZAP_BLOCK_SIZE times, each time checking the clear pgd, in
    order to progress the working address to the next pgd.
    
    The fundamental way to solve the problem is to keep track of the end
    address we've processed and pass it back to the higher layers.
    
    From: Nick Piggin <npiggin@suse.de>
    
      Modification to completely get away from address based work estimate
      and instead use an abstract count, with a very small cost for empty
      entries as opposed to present pages.
    
      On 2.6.14-git2, ppc64, and CONFIG_PREEMPT=y, mapping and unmapping 1TB
      of virtual address space takes 1.69s; with the following patch applied,
      this operation can be done 1000 times in less than 0.01s
    
    From: Andrew Morton <akpm@osdl.org>
    
    With CONFIG_HUTETLB_PAGE=n:
    
    mm/memory.c: In function `unmap_vmas':
    mm/memory.c:779: warning: division by zero
    
    Due to
    
    			zap_work -= (end - start) /
    					(HPAGE_SIZE / PAGE_SIZE);
    
    So make the dummy HPAGE_SIZE non-zero
    Signed-off-by: default avatarRobin Holt <holt@sgi.com>
    Signed-off-by: default avatarNick Piggin <npiggin@suse.de>
    Cc: Hugh Dickins <hugh@veritas.com>
    Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
    51c6f666
memory.c 58.9 KB