optimized alloc queue resources,<br />alloc queue resources during a hardware lock get and release period.<br /> <br />Signed-off-by: Junlong Wang <wang.junlong1@zte.com.cn> <br />---<br /> drivers/net/zxdh/zxdh_common.c | 75 ++++++----------------------------<br /> drivers/net/zxdh/zxdh_common.h |  2 +-<br /> drivers/net/zxdh/zxdh_ethdev.c | 24 +++++++----<br /> drivers/net/zxdh/zxdh_pci.h    |  2 +<br /> 4 files changed, 31 insertions(+), 72 deletions(-)<br /> <br />diff --git a/drivers/net/zxdh/zxdh_common.c b/drivers/net/zxdh/zxdh_common.c<br />index ce53ee8a05..ffc00ab3e6 100644<br />--- a/drivers/net/zxdh/zxdh_common.c<br />+++ b/drivers/net/zxdh/zxdh_common.c<br />@@ -354,76 +354,25 @@ zxdh_write_comm_reg(uint64_t pci_comm_cfg_baseaddr, uint32_t reg, uint32_t val)<br />     *((volatile uint32_t *)(pci_comm_cfg_baseaddr + reg)) = val;<br /> }<br />  <br />-static int32_t<br />-zxdh_common_table_write(struct zxdh_hw *hw, uint8_t field,<br />-            void *buff, uint16_t buff_size)<br />-{<br />-    struct zxdh_pci_bar_msg desc;<br />-    struct zxdh_msg_recviver_mem msg_rsp;<br />-    int32_t ret = 0;<br />-<br />-    if (!hw->msg_chan_init) {<br />-        PMD_DRV_LOG(ERR, "Bar messages channel not initialized");<br />-        return -1;<br />-    }<br />-    if (buff_size != 0 && buff == NULL) {<br />-        PMD_DRV_LOG(ERR, "Buff is invalid");<br />-        return -1;<br />-    }<br />-<br />-    ret = zxdh_fill_common_msg(hw, &desc, ZXDH_COMMON_TABLE_WRITE,<br />-                    field, buff, buff_size);<br />-<br />-    if (ret != 0) {<br />-        PMD_DRV_LOG(ERR, "Failed to fill common msg");<br />-        return ret;<br />-    }<br />-<br />-    ret = zxdh_send_command(hw, &desc, ZXDH_BAR_MODULE_TBL, &msg_rsp);<br />-    if (ret != 0)<br />-        goto free_msg_data;<br />-<br />-    ret = zxdh_common_rsp_check(&msg_rsp, NULL, 0);<br />-    if (ret != 0)<br />-        goto free_rsp_data;<br />-<br />-free_rsp_data:<br />-    rte_free(msg_rsp.recv_buffer);<br />-free_msg_data:<br />-    rte_free(desc.payload_addr);<br />-    return ret;<br />-}<br />-<br /> int32_t<br />-zxdh_datach_set(struct rte_eth_dev *dev)<br />+zxdh_datach_set(struct rte_eth_dev *dev, uint16_t ph_chno)<br /> {<br />     struct zxdh_hw *hw = dev->data->dev_private;<br />-    uint16_t nr_vq = hw->rx_qnum + hw->tx_qnum;<br />-    uint16_t buff_size = (nr_vq % ZXDH_QUEUES_NUM_MAX + 1) * sizeof(uint16_t);<br />-    int ret = 0;<br />-    uint16_t *pdata, i;<br />-<br />-    void *buff = rte_zmalloc(NULL, buff_size, 0);<br />+    uint64_t addr = 0;<br />+    uint64_t pcieid_addr = 0;<br />  <br />-    if (unlikely(buff == NULL)) {<br />-        PMD_DRV_LOG(ERR, "Failed to allocate buff");<br />+    if ((ph_chno) >=  ZXDH_QUEUES_PCIEID_SIZE) {<br />+        PMD_DRV_LOG(ERR, "ph_chno is greater than %08x", ph_chno);<br />         return -ENOMEM;<br />     }<br />  <br />-    pdata = (uint16_t *)buff;<br />-    *pdata++ = nr_vq;<br />-    for (i = 0; i < hw->rx_qnum; i++)<br />-        *(pdata + i) = hw->channel_context[i * 2].ph_chno;<br />-    for (i = 0; i < hw->tx_qnum; i++)<br />-        *(pdata + hw->rx_qnum + i) = hw->channel_context[i * 2 + 1].ph_chno;<br />-    ret = zxdh_common_table_write(hw, ZXDH_COMMON_FIELD_DATACH, (void *)buff, buff_size);<br />-<br />-    if (ret != 0)<br />-        PMD_DRV_LOG(ERR, "Failed to setup data channel of common table. code:%d", ret);<br />-    hw->queue_set_flag = 1;<br />-    rte_free(buff);<br />-<br />-    return ret;<br />+    pcieid_addr =<br />+        *((volatile uint64_t *)(hw->bar_addr[ZXDH_BAR0_INDEX] + ZXDH_QUEUES_PCIEID_ADDR));<br />+    addr = hw->bar_addr[ZXDH_BAR0_INDEX] + pcieid_addr + (ph_chno << 1);<br />+    *((volatile uint16_t *)(addr)) = hw->pcie_id;<br />+    PMD_DRV_LOG(DEBUG, "addr %lx pcie_id %04x, pcieid_addr %lx lch %d",<br />+        addr, hw->pcie_id, pcieid_addr, ph_chno);<br />+    return 0;<br /> }<br />  <br /> bool<br />diff --git a/drivers/net/zxdh/zxdh_common.h b/drivers/net/zxdh/zxdh_common.h<br />index 6d78ae0273..bbc6bed1df 100644<br />--- a/drivers/net/zxdh/zxdh_common.h<br />+++ b/drivers/net/zxdh/zxdh_common.h<br />@@ -125,7 +125,7 @@ void zxdh_release_lock(struct zxdh_hw *hw);<br /> int32_t zxdh_timedlock(struct zxdh_hw *hw, uint32_t us);<br /> uint32_t zxdh_read_comm_reg(uint64_t pci_comm_cfg_baseaddr, uint32_t reg);<br /> void zxdh_write_comm_reg(uint64_t pci_comm_cfg_baseaddr, uint32_t reg, uint32_t val);<br />-int32_t zxdh_datach_set(struct rte_eth_dev *dev);<br />+int32_t zxdh_datach_set(struct rte_eth_dev *dev, uint16_t ph_chno);<br />  <br /> bool zxdh_rx_offload_enabled(struct zxdh_hw *hw);<br /> bool zxdh_tx_offload_enabled(struct zxdh_hw *hw);<br />diff --git a/drivers/net/zxdh/zxdh_ethdev.c b/drivers/net/zxdh/zxdh_ethdev.c<br />index 80b992d4ad..2fc2d78aff 100644<br />--- a/drivers/net/zxdh/zxdh_ethdev.c<br />+++ b/drivers/net/zxdh/zxdh_ethdev.c<br />@@ -520,6 +520,9 @@ zxdh_get_available_channel(struct rte_eth_dev *dev, uint8_t queue_type)<br />     uint32_t res_bit = (total_queue_num + inval_bit) % 32;<br />     uint32_t vq_reg_num = (total_queue_num + inval_bit) / 32 + (res_bit ? 1 : 0);<br />     int32_t ret = 0;<br />+    uint32_t addr = 0;<br />+    uint32_t var = 0;<br />+    int32_t ph_chno = 0;<br />  <br />     ret = zxdh_timedlock(hw, 1000);<br />     if (ret) {<br />@@ -528,15 +531,14 @@ zxdh_get_available_channel(struct rte_eth_dev *dev, uint8_t queue_type)<br />     }<br />  <br />     for (phy_vq_reg = 0; phy_vq_reg < vq_reg_num; phy_vq_reg++) {<br />-        uint32_t addr = ZXDH_QUERES_SHARE_BASE +<br />-        (phy_vq_reg + phy_vq_reg_oft) * sizeof(uint32_t);<br />-        uint32_t var = zxdh_read_bar_reg(dev, ZXDH_BAR0_INDEX, addr);<br />+        addr = ZXDH_QUERES_SHARE_BASE +<br />+            (phy_vq_reg + phy_vq_reg_oft) * sizeof(uint32_t);<br />+        var = zxdh_read_bar_reg(dev, ZXDH_BAR0_INDEX, addr);<br />         if (phy_vq_reg == 0) {<br />             for (j = (inval_bit + base); j < 32; j += 2) {<br />                 /* Got the available channel & update COI table */<br />                 if ((var & (1 << j)) == 0) {<br />                     var |= (1 << j);<br />-                    zxdh_write_bar_reg(dev, ZXDH_BAR0_INDEX, addr, var);<br />                     done = 1;<br />                     break;<br />                 }<br />@@ -548,7 +550,6 @@ zxdh_get_available_channel(struct rte_eth_dev *dev, uint8_t queue_type)<br />                 /* Got the available channel & update COI table */<br />                 if ((var & (1 << j)) == 0) {<br />                     var |= (1 << j);<br />-                    zxdh_write_bar_reg(dev, ZXDH_BAR0_INDEX, addr, var);<br />                     done = 1;<br />                     break;<br />                 }<br />@@ -560,7 +561,6 @@ zxdh_get_available_channel(struct rte_eth_dev *dev, uint8_t queue_type)<br />                 /* Got the available channel & update COI table */<br />                 if ((var & (1 << j)) == 0) {<br />                     var |= (1 << j);<br />-                    zxdh_write_bar_reg(dev, ZXDH_BAR0_INDEX, addr, var);<br />                     done = 1;<br />                     break;<br />                 }<br />@@ -570,6 +570,16 @@ zxdh_get_available_channel(struct rte_eth_dev *dev, uint8_t queue_type)<br />         }<br />     }<br />  <br />+    if (done) {<br />+        ph_chno = (phy_vq_reg + phy_vq_reg_oft) * 32 + j;<br />+        if (zxdh_datach_set(dev, ph_chno) != 0) {<br />+            zxdh_release_lock(hw);<br />+            PMD_DRV_LOG(ERR, "zxdh_datach_set queue pcie addr failed");<br />+            return -1;<br />+        }<br />+        zxdh_write_bar_reg(dev, ZXDH_BAR0_INDEX, addr, var);<br />+    }<br />+<br />     zxdh_release_lock(hw);<br />     /* check for no channel condition */<br />     if (done != 1) {<br />@@ -1333,8 +1343,6 @@ static int32_t zxdh_reconfig_queues(struct rte_eth_dev *dev)<br />     if (ret < 0)<br />         return ret;<br />  <br />-    zxdh_datach_set(dev);<br />-<br />     if (zxdh_configure_intr(dev) < 0) {<br />         PMD_DRV_LOG(ERR, "Failed to configure interrupt");<br />         zxdh_free_queues(dev);<br />diff --git a/drivers/net/zxdh/zxdh_pci.h b/drivers/net/zxdh/zxdh_pci.h<br />index a1834f6615..d0f4ff6398 100644<br />--- a/drivers/net/zxdh/zxdh_pci.h<br />+++ b/drivers/net/zxdh/zxdh_pci.h<br />@@ -65,6 +65,8 @@ enum zxdh_msix_status {<br /> #define ZXDH_CONFIG_STATUS_DEV_NEED_RESET  0x40<br /> #define ZXDH_CONFIG_STATUS_FAILED          0x80<br /> #define ZXDH_PCI_QUEUE_ADDR_SHIFT          12<br />+#define ZXDH_QUEUES_PCIEID_ADDR            0x1BF8<br />+#define ZXDH_QUEUES_PCIEID_SIZE            4096<br />  <br /> struct __rte_packed_begin zxdh_net_config {<br />     /* The config defining mac address (if ZXDH_NET_F_MAC) */<br />--  <br />2.27.0<br />