• Alexander Duyck's avatar
    net: Split netdev_alloc_frag into __alloc_page_frag and add __napi_alloc_frag · ffde7328
    Alexander Duyck authored
    This patch splits the netdev_alloc_frag function up so that it can be used
    on one of two page frag pools instead of being fixed on the
    netdev_alloc_cache.  By doing this we can add a NAPI specific function
    __napi_alloc_frag that accesses a pool that is only used from softirq
    context.  The advantage to this is that we do not need to call
    local_irq_save/restore which can be a significant savings.
    
    I also took the opportunity to refactor the core bits that were placed in
    __alloc_page_frag.  First I updated the allocation to do either a 32K
    allocation or an order 0 page.  This is based on the changes in commmit
    d9b2938a where it was found that latencies could be reduced in case of
    failures.  Then I also rewrote the logic to work from the end of the page to
    the start.  By doing this the size value doesn't have to be used unless we
    have run out of space for page fragments.  Finally I cleaned up the atomic
    bits so that we just do an atomic_sub_and_test and if that returns true then
    we set the page->_count via an atomic_set.  This way we can remove the extra
    conditional for the atomic_read since it would have led to an atomic_inc in
    the case of success anyway.
    Signed-off-by: default avatarAlexander Duyck <alexander.h.duyck@redhat.com>
    Acked-by: default avatarAlexei Starovoitov <ast@plumgrid.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    ffde7328
skbuff.c 108 KB