Skip to content
  • Daniel Pieczko's avatar
    sfc: reuse pages to avoid DMA mapping/unmapping costs · 2768935a
    Daniel Pieczko authored
    
    
    On POWER systems, DMA mapping/unmapping operations are very expensive.
    These changes reduce these costs by trying to reuse DMA mapped pages.
    
    After all the buffers associated with a page have been processed and
    passed up, the page is placed into a ring (if there is room).  For
    each page that is required for a refill operation, a page in the ring
    is examined to determine if its page count has fallen to 1, ie. the
    kernel has released its reference to these packets.  If this is the
    case, the page can be immediately added back into the RX descriptor
    ring, without having to re-map it for DMA.
    
    If the kernel is still holding a reference to this page, it is removed
    from the ring and unmapped for DMA.  Then a new page, which can
    immediately be used by RX buffers in the descriptor ring, is allocated
    and DMA mapped.
    
    The time a page needs to spend in the recycle ring before the kernel
    has released its page references is based on the number of buffers
    that use this page.  As large pages can hold more RX buffers, the RX
    recycle ring can be shorter.  This reduces memory usage on POWER
    systems, while maintaining the performance gain achieved by recycling
    pages, following the driver change to pack more than two RX buffers
    into large pages.
    
    When an IOMMU is not present, the recycle ring can be small to reduce
    memory usage, since DMA mapping operations are inexpensive.
    
    With a small recycle ring, attempting to refill the descriptor queue
    with more buffers than the equivalent size of the recycle ring could
    ultimately lead to memory leaks if page entries in the recycle ring
    were overwritten.  To prevent this, the check to see if the recycle
    ring is full is changed to check if the next entry to be written is
    NULL.
    
    [bwh: Combine and rebase several commits so this is complete
     before the following buffer-packing changes.  Remove module
     parameter.]
    Signed-off-by: default avatarBen Hutchings <bhutchings@solarflare.com>
    2768935a