net: hns3: unify the page reusing for page size 4K and 64K
authorYunsheng Lin <linyunsheng@huawei.com>
Mon, 6 May 2019 02:48:50 +0000 (10:48 +0800)
committerDavid S. Miller <davem@davemloft.net>
Tue, 7 May 2019 17:37:14 +0000 (10:37 -0700)
When page size is 64K, RX buffer is currently not reused when the
page_offset is moved to last buffer. This patch adds checking to
decide whether the buffer page can be reused when last_offset is
moved beyond last offset.

If the driver is the only user of page when page_offset is moved
to beyond last offset, then buffer can be reused and page_offset
is set to zero.

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 25d607c7a8ab2f933e578e2088eb812b062264c0..b6e73feae45d2afb6dcb05d58342503c39c72a49 100644 (file)
@@ -2328,50 +2328,31 @@ 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)
 {
-       struct hns3_desc *desc;
-       u32 truesize;
-       int size;
-       int last_offset;
-       bool twobufs;
-
-       twobufs = ((PAGE_SIZE < 8192) &&
-               hnae3_buf_size(ring) == HNS3_BUFFER_SIZE_2048);
-
-       desc = &ring->desc[ring->next_to_clean];
-       size = le16_to_cpu(desc->rx.size);
-
-       truesize = hnae3_buf_size(ring);
-
-       if (!twobufs)
-               last_offset = hnae3_page_size(ring) - hnae3_buf_size(ring);
+       struct hns3_desc *desc = &ring->desc[ring->next_to_clean];
+       int size = le16_to_cpu(desc->rx.size);
+       u32 truesize = hnae3_buf_size(ring);
 
        skb_add_rx_frag(skb, i, desc_cb->priv, desc_cb->page_offset + pull_len,
                        size - pull_len, truesize);
 
-        /* Avoid re-using remote pages,flag default unreuse */
-       if (unlikely(page_to_nid(desc_cb->priv) != numa_node_id()))
-               return;
-
-       if (twobufs) {
-               /* If we are only owner of page we can reuse it */
-               if (likely(page_count(desc_cb->priv) == 1)) {
-                       /* Flip page offset to other buffer */
-                       desc_cb->page_offset ^= truesize;
-
-                       desc_cb->reuse_flag = 1;
-                       /* bump ref count on page before it is given*/
-                       get_page(desc_cb->priv);
-               }
+       /* 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_node_id()) ||
+           (!desc_cb->page_offset && page_count(desc_cb->priv) > 1))
                return;
-       }
 
        /* Move offset up to the next cache line */
        desc_cb->page_offset += truesize;
 
-       if (desc_cb->page_offset <= last_offset) {
+       if (desc_cb->page_offset + truesize <= hnae3_page_size(ring)) {
                desc_cb->reuse_flag = 1;
                /* Bump ref count on page before it is given*/
                get_page(desc_cb->priv);
+       } else if (page_count(desc_cb->priv) == 1) {
+               desc_cb->reuse_flag = 1;
+               desc_cb->page_offset = 0;
+               get_page(desc_cb->priv);
        }
 }