net: hns3: do not reuse pfmemalloc pages
authorYunsheng Lin <linyunsheng@huawei.com>
Tue, 21 Jan 2020 08:42:06 +0000 (16:42 +0800)
committerDavid S. Miller <davem@davemloft.net>
Tue, 21 Jan 2020 10:46:20 +0000 (11:46 +0100)
HNS3 driver allocates pages for DMA with dev_alloc_pages(), which
calls alloc_pages_node() with the __GFP_MEMALLOC flag. So, in case
of OOM condition, HNS3 can get pages with pfmemalloc flag set.

So do not reuse the pages with pfmemalloc flag set because those
pages are reserved for special cases, such as low memory case.

Signed-off-by: Yunsheng Lin <linyunsheng@huawei.com>
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/hisilicon/hns3/hns3_enet.c

index f5790282bd1900f04f45261deda449ac02d5f657..06c58ed3c45e9a67ba9cb7a20d835f0a1c67284b 100644 (file)
@@ -2627,6 +2627,12 @@ static void hns3_nic_alloc_rx_buffers(struct hns3_enet_ring *ring,
        writel_relaxed(i, ring->tqp->io_base + HNS3_RING_RX_RING_HEAD_REG);
 }
 
+static bool hns3_page_is_reusable(struct page *page)
+{
+       return page_to_nid(page) == numa_mem_id() &&
+               !page_is_pfmemalloc(page);
+}
+
 static void hns3_nic_reuse_page(struct sk_buff *skb, int i,
                                struct hns3_enet_ring *ring, int pull_len,
                                struct hns3_desc_cb *desc_cb)
@@ -2641,7 +2647,7 @@ static void hns3_nic_reuse_page(struct sk_buff *skb, int i,
        /* Avoid re-using remote pages, or the stack is still using the page
         * when page_offset rollback to zero, flag default unreuse
         */
-       if (unlikely(page_to_nid(desc_cb->priv) != numa_mem_id()) ||
+       if (unlikely(!hns3_page_is_reusable(desc_cb->priv)) ||
            (!desc_cb->page_offset && page_count(desc_cb->priv) > 1))
                return;
 
@@ -2860,7 +2866,7 @@ static int hns3_alloc_skb(struct hns3_enet_ring *ring, unsigned int length,
                memcpy(__skb_put(skb, length), va, ALIGN(length, sizeof(long)));
 
                /* We can reuse buffer as-is, just make sure it is local */
-               if (likely(page_to_nid(desc_cb->priv) == numa_mem_id()))
+               if (likely(hns3_page_is_reusable(desc_cb->priv)))
                        desc_cb->reuse_flag = 1;
                else /* This page cannot be reused so discard it */
                        put_page(desc_cb->priv);