net/hns3: remove one IO barrier in Rx
authorWei Hu (Xavier) <xavier.huwei@huawei.com>
Thu, 9 Jan 2020 03:15:52 +0000 (11:15 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 17 Jan 2020 18:46:26 +0000 (19:46 +0100)
When receiving a packet, hns3 hardware network engine firstly writes the
packet content to the memory pointed by the 'addr' field of the Rx
Buffer Descriptor, secondly fills the result of parsing the packet
include the valid field into the Rx Buffer Descriptor in one write
operation, and thirdly writes the number of the Buffer Descriptor not
processed by the driver to the HNS3_RING_RX_FBDNUM_REG register.

This patch optimizes the Rx performance by removing one rte_io_rmb call
in the '.rx_pkt_burst' ops implementation function named hns3_recv_pkts.
The change as follows:
1. Driver no longer read HNS3_RING_RX_FBDNUM_REG register, so remove one
   rte_io_rmb call, and directly read the valid flag of Rx Buffer
   Descriptor to check whether the BD is ready.
2. Delete the non_vld_descs field from the statistic information of the
   hns3 driver because now it has become a common case that the valid
   flag of Rx Buffer Descriptor read by the driver is invalid.

Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
Signed-off-by: Wei Hu (Xavier) <xavier.huwei@huawei.com>
drivers/net/hns3/hns3_rxtx.c
drivers/net/hns3/hns3_rxtx.h
drivers/net/hns3/hns3_stats.c

index 34919cd..a1655e2 100644 (file)
@@ -1174,7 +1174,6 @@ hns3_rx_queue_setup(struct rte_eth_dev *dev, uint16_t idx, uint16_t nb_desc,
        rxq->io_base = (void *)((char *)hw->io_base + HNS3_TQP_REG_OFFSET +
                                idx * HNS3_TQP_REG_SIZE);
        rxq->rx_buf_len = hw->rx_buf_len;
-       rxq->non_vld_descs = 0;
        rxq->l2_errors = 0;
        rxq->pkt_len_errors = 0;
        rxq->l3_csum_erros = 0;
@@ -1421,7 +1420,6 @@ hns3_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
        uint16_t pkt_len;
        uint16_t nb_rx;
        uint16_t rx_id;
-       int num;                        /* num of desc in ring */
        int ret;
 
        nb_rx = 0;
@@ -1435,15 +1433,11 @@ hns3_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
        last_seg = rxq->pkt_last_seg;
        sw_ring = rxq->sw_ring;
 
-       /* Get num of packets in descriptor ring */
-       num = hns3_read_dev(rxq, HNS3_RING_RX_FBDNUM_REG);
-       while (nb_rx_bd < num && nb_rx < nb_pkts) {
+       while (nb_rx < nb_pkts) {
                rxdp = &rx_ring[rx_id];
                bd_base_info = rte_le_to_cpu_32(rxdp->rx.bd_base_info);
-               if (unlikely(!hns3_get_bit(bd_base_info, HNS3_RXD_VLD_B))) {
-                       rxq->non_vld_descs++;
+               if (unlikely(!hns3_get_bit(bd_base_info, HNS3_RXD_VLD_B)))
                        break;
-               }
 
                nmb = rte_mbuf_raw_alloc(rxq->mb_pool);
                if (unlikely(nmb == NULL)) {
@@ -1454,7 +1448,7 @@ hns3_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
                nb_rx_bd++;
                rxe = &sw_ring[rx_id];
                rx_id++;
-               if (rx_id == rxq->nb_rx_desc)
+               if (unlikely(rx_id == rxq->nb_rx_desc))
                        rx_id = 0;
 
                rte_prefetch0(sw_ring[rx_id].mbuf);
index a042c99..943c6d8 100644 (file)
@@ -245,7 +245,6 @@ struct hns3_rx_queue {
        bool rx_deferred_start; /* don't start this queue in dev start */
        bool configured;        /* indicate if rx queue has been configured */
 
-       uint64_t non_vld_descs; /* num of non valid rx descriptors */
        uint64_t l2_errors;
        uint64_t pkt_len_errors;
        uint64_t l3_csum_erros;
index 9948beb..b3797ec 100644 (file)
@@ -219,8 +219,6 @@ static const struct hns3_xstats_name_offset hns3_reset_stats_strings[] = {
 
 /* The statistic of errors in Rx BD */
 static const struct hns3_xstats_name_offset hns3_rx_bd_error_strings[] = {
-       {"NONE_VALIDATED_DESCRIPTORS",
-               HNS3_RX_BD_ERROR_STATS_FIELD_OFFSET(non_vld_descs)},
        {"RX_PKT_LEN_ERRORS",
                HNS3_RX_BD_ERROR_STATS_FIELD_OFFSET(pkt_len_errors)},
        {"L2_RX_ERRORS",
@@ -510,7 +508,6 @@ hns3_stats_reset(struct rte_eth_dev *eth_dev)
                rxq = eth_dev->data->rx_queues[i];
                if (rxq) {
                        rxq->pkt_len_errors = 0;
-                       rxq->non_vld_descs = 0;
                        rxq->l2_errors = 0;
                        rxq->l3_csum_erros = 0;
                        rxq->l4_csum_erros = 0;