• Keith Busch's avatar
    dmapool: link blocks across pages · da9619a3
    Keith Busch authored
    The allocated dmapool pages are never freed for the lifetime of the pool. 
    There is no need for the two level list+stack lookup for finding a free
    block since nothing is ever removed from the list.  Just use a simple
    stack, reducing time complexity to constant.
    
    The implementation inserts the stack linking elements and the dma handle
    of the block within itself when freed.  This means the smallest possible
    dmapool block is increased to at most 16 bytes to accommodate these
    fields, but there are no exisiting users requesting a dma pool smaller
    than that anyway.
    
    Removing the list has a significant change in performance. Using the
    kernel's micro-benchmarking self test:
    
    Before:
    
      # modprobe dmapool_test
      dmapool test: size:16   blocks:8192   time:57282
      dmapool test: size:64   blocks:8192   time:172562
      dmapool test: size:256  blocks:8192   time:789247
      dmapool test: size:1024 blocks:2048   time:371823
      dmapool test: size:4096 blocks:1024   time:362237
    
    After:
    
      # modprobe dmapool_test
      dmapool test: size:16   blocks:8192   time:24997
      dmapool test: size:64   blocks:8192   time:26584
      dmapool test: size:256  blocks:8192   time:33542
      dmapool test: size:1024 blocks:2048   time:9022
      dmapool test: size:4096 blocks:1024   time:6045
    
    The module test allocates quite a few blocks that may not accurately
    represent how these pools are used in real life.  For a more marco level
    benchmark, running fio high-depth + high-batched on nvme, this patch shows
    submission and completion latency reduced by ~100usec each, 1% IOPs
    improvement, and perf record's time spent in dma_pool_alloc/free were
    reduced by half.
    
    [kbusch@kernel.org: push new blocks in ascending order]
      Link: https://lkml.kernel.org/r/20230221165400.1595247-1-kbusch@meta.com
    Link: https://lkml.kernel.org/r/20230126215125.4069751-12-kbusch@meta.com
    Fixes: 2d55c16c ("dmapool: create/destroy cleanup")
    Signed-off-by: default avatarKeith Busch <kbusch@kernel.org>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    Tested-by: default avatarBryan O'Donoghue <bryan.odonoghue@linaro.org>
    Cc: Matthew Wilcox <willy@infradead.org>
    Cc: Tony Battersby <tonyb@cybernetics.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    da9619a3
dmapool.c 13.1 KB