net: hns3: unify the page reusing for page size 4K and 64K
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>hifive-unleashed-5.2
parent
ce74370c2c
commit
389ca14615
|
@ -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()))
|
||||
/* 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;
|
||||
|
||||
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);
|
||||
}
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue