• David Rientjes's avatar
    net, skbuff: do not prefer skb allocation fails early · f8c468e8
    David Rientjes authored
    Commit dcda9b04 ("mm, tree wide: replace __GFP_REPEAT by
    __GFP_RETRY_MAYFAIL with more useful semantic") replaced __GFP_REPEAT in
    alloc_skb_with_frags() with __GFP_RETRY_MAYFAIL when the allocation may
    directly reclaim.
    
    The previous behavior would require reclaim up to 1 << order pages for
    skb aligned header_len of order > PAGE_ALLOC_COSTLY_ORDER before failing,
    otherwise the allocations in alloc_skb() would loop in the page allocator
    looking for memory.  __GFP_RETRY_MAYFAIL makes both allocations failable
    under memory pressure, including for the HEAD allocation.
    
    This can cause, among many other things, write() to fail with ENOTCONN
    during RPC when under memory pressure.
    
    These allocations should succeed as they did previous to dcda9b04
    even if it requires calling the oom killer and additional looping in the
    page allocator to find memory.  There is no way to specify the previous
    behavior of __GFP_REPEAT, but it's unlikely to be necessary since the
    previous behavior only guaranteed that 1 << order pages would be reclaimed
    before failing for order > PAGE_ALLOC_COSTLY_ORDER.  That reclaim is not
    guaranteed to be contiguous memory, so repeating for such large orders is
    usually not beneficial.
    
    Removing the setting of __GFP_RETRY_MAYFAIL to restore the previous
    behavior, specifically not allowing alloc_skb() to fail for small orders
    and oom kill if necessary rather than allowing RPCs to fail.
    
    Fixes: dcda9b04 ("mm, tree wide: replace __GFP_REPEAT by __GFP_RETRY_MAYFAIL with more useful semantic")
    Signed-off-by: default avatarDavid Rientjes <rientjes@google.com>
    Reviewed-by: default avatarEric Dumazet <edumazet@google.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    f8c468e8
skbuff.c 141 KB