• David Arinzon's avatar
    net: ena: Add dynamic recycling mechanism for rx buffers · f7d625ad
    David Arinzon authored
    The current implementation allocates page-sized rx buffers.
    As traffic may consist of different types and sizes of packets,
    in various cases, buffers are not fully used.
    
    This change (Dynamic RX Buffers - DRB) uses part of the allocated rx
    page needed for the incoming packet, and returns the rest of the
    unused page to be used again as an rx buffer for future packets.
    A threshold of 2K for unused space has been set in order to declare
    whether the remainder of the page can be reused again as an rx buffer.
    
    As a page may be reused, dma_sync_single_for_cpu() is added in order
    to sync the memory to the CPU side after it was owned by the HW.
    In addition, when the rx page can no longer be reused, it is being
    unmapped using dma_page_unmap(), which implicitly syncs and then
    unmaps the entire page. In case the kernel still handles the skbs
    pointing to the previous buffers from that rx page, it may access
    garbage pointers, caused by the implicit sync overwriting them.
    The implicit dma sync is removed by replacing dma_page_unmap() with
    dma_unmap_page_attrs() with DMA_ATTR_SKIP_CPU_SYNC flag.
    
    The functionality is disabled for XDP traffic to avoid handling
    several descriptors per packet.
    Signed-off-by: default avatarArthur Kiyanovski <akiyano@amazon.com>
    Signed-off-by: default avatarShay Agroskin <shayagr@amazon.com>
    Signed-off-by: default avatarDavid Arinzon <darinzon@amazon.com>
    Link: https://lore.kernel.org/r/20230612121448.28829-1-darinzon@amazon.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    f7d625ad
ena_netdev.c 129 KB