• Ilias Apalodimas's avatar
    page_pool: Allow drivers to hint on SKB recycling · 6a5bcd84
    Ilias Apalodimas authored
    Up to now several high speed NICs have custom mechanisms of recycling
    the allocated memory they use for their payloads.
    Our page_pool API already has recycling capabilities that are always
    used when we are running in 'XDP mode'. So let's tweak the API and the
    kernel network stack slightly and allow the recycling to happen even
    during the standard operation.
    The API doesn't take into account 'split page' policies used by those
    drivers currently, but can be extended once we have users for that.
    
    The idea is to be able to intercept the packet on skb_release_data().
    If it's a buffer coming from our page_pool API recycle it back to the
    pool for further usage or just release the packet entirely.
    
    To achieve that we introduce a bit in struct sk_buff (pp_recycle:1) and
    a field in struct page (page->pp) to store the page_pool pointer.
    Storing the information in page->pp allows us to recycle both SKBs and
    their fragments.
    We could have skipped the skb bit entirely, since identical information
    can bederived from struct page. However, in an effort to affect the free path
    as less as possible, reading a single bit in the skb which is already
    in cache, is better that trying to derive identical information for the
    page stored data.
    
    The driver or page_pool has to take care of the sync operations on it's own
    during the buffer recycling since the buffer is, after opting-in to the
    recycling, never unmapped.
    
    Since the gain on the drivers depends on the architecture, we are not
    enabling recycling by default if the page_pool API is used on a driver.
    In order to enable recycling the driver must call skb_mark_for_recycle()
    to store the information we need for recycling in page->pp and
    enabling the recycling bit, or page_pool_store_mem_info() for a fragment.
    Co-developed-by: default avatarJesper Dangaard Brouer <brouer@redhat.com>
    Signed-off-by: default avatarJesper Dangaard Brouer <brouer@redhat.com>
    Co-developed-by: default avatarMatteo Croce <mcroce@microsoft.com>
    Signed-off-by: default avatarMatteo Croce <mcroce@microsoft.com>
    Signed-off-by: default avatarIlias Apalodimas <ilias.apalodimas@linaro.org>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    6a5bcd84
page_pool.c 17.3 KB