• N
    slob: rework freelist handling · 95b35127
    Nick Piggin 提交于
    Improve slob by turning the freelist into a list of pages using struct page
    fields, then each page has a singly linked freelist of slob blocks via a
    pointer in the struct page.
    
    - The first benefit is that the slob freelists can be indexed by a smaller
      type (2 bytes, if the PAGE_SIZE is reasonable).
    
    - Next is that freeing is much quicker because it does not have to traverse
      the entire freelist. Allocation can be slightly faster too, because we can
      skip almost-full freelist pages completely.
    
    - Slob pages are then freed immediately when they become empty, rather than
      having a periodic timer try to free them. This gives efficiency and memory
      consumption improvement.
    
    Then, we don't encode seperate size and next fields into each slob block,
    rather we use the sign bit to distinguish between "size" or "next". Then
    size 1 blocks contain a "next" offset, and others contain the "size" in
    the first unit and "next" in the second unit.
    
    - This allows minimum slob allocation alignment to go from 8 bytes to 2
      bytes on 32-bit and 12 bytes to 2 bytes on 64-bit. In practice, it is
      best to align them to word size, however some architectures (eg. cris)
      could gain space savings from turning off this extra alignment.
    
    Then, make kmalloc use its own slob_block at the front of the allocation
    in order to encode allocation size, rather than rely on not overwriting
    slob's existing header block.
    
    - This reduces kmalloc allocation overhead similarly to alignment reductions.
    
    - Decouples kmalloc layer from the slob allocator.
    
    Then, add a page flag specific to slob pages.
    
    - This means kfree of a page aligned slob block doesn't have to traverse
      the bigblock list.
    
    I would get benchmarks, but my test box's network doesn't come up with
    slob before this patch. I think something is timing out. Anyway, things
    are faster after the patch.
    
    Code size goes up about 1K, however dynamic memory usage _should_ be
    lower even on relatively small memory systems.
    
    Future todo item is to restore the cyclic free list search, rather than
    to always begin at the start.
    Signed-off-by: NNick Piggin <npiggin@suse.de>
    Acked-by: NMatt Mackall <mpm@selenic.com>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    95b35127
slob.c 14.8 KB