mirror of https://gitee.com/openkylin/linux.git
net: hns3: optimize the barrier using when cleaning TX BD
Currently, a barrier is used when cleaning each TX BD, which may cause performance degradation. This patch optimizes it to use one barrier when cleaning TX BD each round. 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>
This commit is contained in:
parent
aa9d22dd45
commit
ce74370c2c
|
@ -2186,20 +2186,25 @@ static void hns3_reuse_buffer(struct hns3_enet_ring *ring, int i)
|
|||
ring->desc[i].rx.bd_base_info = 0;
|
||||
}
|
||||
|
||||
static void hns3_nic_reclaim_one_desc(struct hns3_enet_ring *ring, int *bytes,
|
||||
int *pkts)
|
||||
static void hns3_nic_reclaim_desc(struct hns3_enet_ring *ring, int head,
|
||||
int *bytes, int *pkts)
|
||||
{
|
||||
int ntc = ring->next_to_clean;
|
||||
struct hns3_desc_cb *desc_cb;
|
||||
|
||||
desc_cb = &ring->desc_cb[ntc];
|
||||
(*pkts) += (desc_cb->type == DESC_TYPE_SKB);
|
||||
(*bytes) += desc_cb->length;
|
||||
/* desc_cb will be cleaned, after hnae3_free_buffer_detach*/
|
||||
hns3_free_buffer_detach(ring, ntc);
|
||||
while (head != ntc) {
|
||||
desc_cb = &ring->desc_cb[ntc];
|
||||
(*pkts) += (desc_cb->type == DESC_TYPE_SKB);
|
||||
(*bytes) += desc_cb->length;
|
||||
/* desc_cb will be cleaned, after hnae3_free_buffer_detach */
|
||||
hns3_free_buffer_detach(ring, ntc);
|
||||
|
||||
if (++ntc == ring->desc_num)
|
||||
ntc = 0;
|
||||
if (++ntc == ring->desc_num)
|
||||
ntc = 0;
|
||||
|
||||
/* Issue prefetch for next Tx descriptor */
|
||||
prefetch(&ring->desc_cb[ntc]);
|
||||
}
|
||||
|
||||
/* This smp_store_release() pairs with smp_load_acquire() in
|
||||
* ring_space called by hns3_nic_net_xmit.
|
||||
|
@ -2244,11 +2249,7 @@ void hns3_clean_tx_ring(struct hns3_enet_ring *ring)
|
|||
|
||||
bytes = 0;
|
||||
pkts = 0;
|
||||
while (head != ring->next_to_clean) {
|
||||
hns3_nic_reclaim_one_desc(ring, &bytes, &pkts);
|
||||
/* Issue prefetch for next Tx descriptor */
|
||||
prefetch(&ring->desc_cb[ring->next_to_clean]);
|
||||
}
|
||||
hns3_nic_reclaim_desc(ring, head, &bytes, &pkts);
|
||||
|
||||
ring->tqp_vector->tx_group.total_bytes += bytes;
|
||||
ring->tqp_vector->tx_group.total_packets += pkts;
|
||||
|
|
Loading…
Reference in New Issue