• Roman Gushchin's avatar
    igb: don't reuse pages with pfmemalloc flag · bc16e47f
    Roman Gushchin authored
    Incoming packet is dropped silently by sk_filter(), if the skb was
    allocated from pfmemalloc reserves and the corresponding socket is
    not marked with the SOCK_MEMALLOC flag.
    
    Igb driver allocates pages for DMA with __skb_alloc_page(), which
    calls alloc_pages_node() with the __GFP_MEMALLOC flag. So, in case
    of OOM condition, igb can get pages with pfmemalloc flag set.
    
    If an incoming packet hits the pfmemalloc page and is large enough
    (small packets are copying into the memory, allocated with
    netdev_alloc_skb_ip_align(), so they are not affected), it will be
    dropped.
    
    This behavior is ok under high memory pressure, but the problem is
    that the igb driver reuses these mapped pages. So, packets are still
    dropping even if all memory issues are gone and there is a plenty
    of free memory.
    
    In my case, some TCP sessions hang on a small percentage (< 0.1%)
    of machines days after OOMs.
    
    Fix this by avoiding reuse of such pages.
    Signed-off-by: default avatarRoman Gushchin <klamm@yandex-team.ru>
    Tested-by: Aaron Brown "aaron.f.brown@intel.com"
    Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
    bc16e47f
igb_main.c 215 KB