Update DPDK version from 19.11 to 20.11 and also support hns3 PMD for Kunpeng 920 and Kunpeng 930. Signed-off-by: speech_white <humin29@huawei.com>
191 lines
6.2 KiB
Diff
191 lines
6.2 KiB
Diff
From badcc5f38dcf223578f870574653fdd20e00c6f8 Mon Sep 17 00:00:00 2001
|
|
From: Chengchang Tang <tangchengchang@huawei.com>
|
|
Date: Fri, 22 Jan 2021 18:18:43 +0800
|
|
Subject: [PATCH 023/189] net/hns3: reconstruct Rx interrupt map
|
|
|
|
This patch reconstruct the Rx interrupt map to reduce the cyclic
|
|
complexity and improve readability and maintainability.
|
|
|
|
Signed-off-by: Chengchang Tang <tangchengchang@huawei.com>
|
|
Signed-off-by: Lijun Ou <oulijun@huawei.com>
|
|
---
|
|
drivers/net/hns3/hns3_ethdev.c | 59 +++++++++++++++++++--------------------
|
|
drivers/net/hns3/hns3_ethdev_vf.c | 55 ++++++++++++++++++------------------
|
|
2 files changed, 56 insertions(+), 58 deletions(-)
|
|
|
|
diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c
|
|
index 7c51e83..f3ce639 100644
|
|
--- a/drivers/net/hns3/hns3_ethdev.c
|
|
+++ b/drivers/net/hns3/hns3_ethdev.c
|
|
@@ -4782,27 +4782,28 @@ hns3_map_rx_interrupt(struct rte_eth_dev *dev)
|
|
uint16_t q_id;
|
|
int ret;
|
|
|
|
- if (dev->data->dev_conf.intr_conf.rxq == 0)
|
|
+ /*
|
|
+ * hns3 needs a separate interrupt to be used as event interrupt which
|
|
+ * could not be shared with task queue pair, so KERNEL drivers need
|
|
+ * support multiple interrupt vectors.
|
|
+ */
|
|
+ if (dev->data->dev_conf.intr_conf.rxq == 0 ||
|
|
+ !rte_intr_cap_multiple(intr_handle))
|
|
return 0;
|
|
|
|
- /* disable uio/vfio intr/eventfd mapping */
|
|
rte_intr_disable(intr_handle);
|
|
+ intr_vector = hw->used_rx_queues;
|
|
+ /* creates event fd for each intr vector when MSIX is used */
|
|
+ if (rte_intr_efd_enable(intr_handle, intr_vector))
|
|
+ return -EINVAL;
|
|
|
|
- /* check and configure queue intr-vector mapping */
|
|
- if (rte_intr_cap_multiple(intr_handle) ||
|
|
- !RTE_ETH_DEV_SRIOV(dev).active) {
|
|
- intr_vector = hw->used_rx_queues;
|
|
- /* creates event fd for each intr vector when MSIX is used */
|
|
- if (rte_intr_efd_enable(intr_handle, intr_vector))
|
|
- return -EINVAL;
|
|
- }
|
|
- if (rte_intr_dp_is_en(intr_handle) && !intr_handle->intr_vec) {
|
|
+ if (intr_handle->intr_vec == NULL) {
|
|
intr_handle->intr_vec =
|
|
rte_zmalloc("intr_vec",
|
|
hw->used_rx_queues * sizeof(int), 0);
|
|
if (intr_handle->intr_vec == NULL) {
|
|
- hns3_err(hw, "Failed to allocate %u rx_queues"
|
|
- " intr_vec", hw->used_rx_queues);
|
|
+ hns3_err(hw, "failed to allocate %u rx_queues intr_vec",
|
|
+ hw->used_rx_queues);
|
|
ret = -ENOMEM;
|
|
goto alloc_intr_vec_error;
|
|
}
|
|
@@ -4812,28 +4813,26 @@ hns3_map_rx_interrupt(struct rte_eth_dev *dev)
|
|
vec = RTE_INTR_VEC_RXTX_OFFSET;
|
|
base = RTE_INTR_VEC_RXTX_OFFSET;
|
|
}
|
|
- if (rte_intr_dp_is_en(intr_handle)) {
|
|
- for (q_id = 0; q_id < hw->used_rx_queues; q_id++) {
|
|
- ret = hns3_bind_ring_with_vector(hw, vec, true,
|
|
- HNS3_RING_TYPE_RX,
|
|
- q_id);
|
|
- if (ret)
|
|
- goto bind_vector_error;
|
|
- intr_handle->intr_vec[q_id] = vec;
|
|
- if (vec < base + intr_handle->nb_efd - 1)
|
|
- vec++;
|
|
- }
|
|
+
|
|
+ for (q_id = 0; q_id < hw->used_rx_queues; q_id++) {
|
|
+ ret = hns3_bind_ring_with_vector(hw, vec, true,
|
|
+ HNS3_RING_TYPE_RX, q_id);
|
|
+ if (ret)
|
|
+ goto bind_vector_error;
|
|
+ intr_handle->intr_vec[q_id] = vec;
|
|
+ /*
|
|
+ * If there are not enough efds (e.g. not enough interrupt),
|
|
+ * remaining queues will be bond to the last interrupt.
|
|
+ */
|
|
+ if (vec < base + intr_handle->nb_efd - 1)
|
|
+ vec++;
|
|
}
|
|
rte_intr_enable(intr_handle);
|
|
return 0;
|
|
|
|
bind_vector_error:
|
|
- rte_intr_efd_disable(intr_handle);
|
|
- if (intr_handle->intr_vec) {
|
|
- free(intr_handle->intr_vec);
|
|
- intr_handle->intr_vec = NULL;
|
|
- }
|
|
- return ret;
|
|
+ rte_free(intr_handle->intr_vec);
|
|
+ intr_handle->intr_vec = NULL;
|
|
alloc_intr_vec_error:
|
|
rte_intr_efd_disable(intr_handle);
|
|
return ret;
|
|
diff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c
|
|
index 37135d7..3a1d4cb 100644
|
|
--- a/drivers/net/hns3/hns3_ethdev_vf.c
|
|
+++ b/drivers/net/hns3/hns3_ethdev_vf.c
|
|
@@ -2085,21 +2085,22 @@ hns3vf_map_rx_interrupt(struct rte_eth_dev *dev)
|
|
uint16_t q_id;
|
|
int ret;
|
|
|
|
- if (dev->data->dev_conf.intr_conf.rxq == 0)
|
|
+ /*
|
|
+ * hns3 needs a separate interrupt to be used as event interrupt which
|
|
+ * could not be shared with task queue pair, so KERNEL drivers need
|
|
+ * support multiple interrupt vectors.
|
|
+ */
|
|
+ if (dev->data->dev_conf.intr_conf.rxq == 0 ||
|
|
+ !rte_intr_cap_multiple(intr_handle))
|
|
return 0;
|
|
|
|
- /* disable uio/vfio intr/eventfd mapping */
|
|
rte_intr_disable(intr_handle);
|
|
+ intr_vector = hw->used_rx_queues;
|
|
+ /* It creates event fd for each intr vector when MSIX is used */
|
|
+ if (rte_intr_efd_enable(intr_handle, intr_vector))
|
|
+ return -EINVAL;
|
|
|
|
- /* check and configure queue intr-vector mapping */
|
|
- if (rte_intr_cap_multiple(intr_handle) ||
|
|
- !RTE_ETH_DEV_SRIOV(dev).active) {
|
|
- intr_vector = hw->used_rx_queues;
|
|
- /* It creates event fd for each intr vector when MSIX is used */
|
|
- if (rte_intr_efd_enable(intr_handle, intr_vector))
|
|
- return -EINVAL;
|
|
- }
|
|
- if (rte_intr_dp_is_en(intr_handle) && !intr_handle->intr_vec) {
|
|
+ if (intr_handle->intr_vec == NULL) {
|
|
intr_handle->intr_vec =
|
|
rte_zmalloc("intr_vec",
|
|
hw->used_rx_queues * sizeof(int), 0);
|
|
@@ -2115,28 +2116,26 @@ hns3vf_map_rx_interrupt(struct rte_eth_dev *dev)
|
|
vec = RTE_INTR_VEC_RXTX_OFFSET;
|
|
base = RTE_INTR_VEC_RXTX_OFFSET;
|
|
}
|
|
- if (rte_intr_dp_is_en(intr_handle)) {
|
|
- for (q_id = 0; q_id < hw->used_rx_queues; q_id++) {
|
|
- ret = hns3vf_bind_ring_with_vector(hw, vec, true,
|
|
- HNS3_RING_TYPE_RX,
|
|
- q_id);
|
|
- if (ret)
|
|
- goto vf_bind_vector_error;
|
|
- intr_handle->intr_vec[q_id] = vec;
|
|
- if (vec < base + intr_handle->nb_efd - 1)
|
|
- vec++;
|
|
- }
|
|
+
|
|
+ for (q_id = 0; q_id < hw->used_rx_queues; q_id++) {
|
|
+ ret = hns3vf_bind_ring_with_vector(hw, vec, true,
|
|
+ HNS3_RING_TYPE_RX, q_id);
|
|
+ if (ret)
|
|
+ goto vf_bind_vector_error;
|
|
+ intr_handle->intr_vec[q_id] = vec;
|
|
+ /*
|
|
+ * If there are not enough efds (e.g. not enough interrupt),
|
|
+ * remaining queues will be bond to the last interrupt.
|
|
+ */
|
|
+ if (vec < base + intr_handle->nb_efd - 1)
|
|
+ vec++;
|
|
}
|
|
rte_intr_enable(intr_handle);
|
|
return 0;
|
|
|
|
vf_bind_vector_error:
|
|
- rte_intr_efd_disable(intr_handle);
|
|
- if (intr_handle->intr_vec) {
|
|
- free(intr_handle->intr_vec);
|
|
- intr_handle->intr_vec = NULL;
|
|
- }
|
|
- return ret;
|
|
+ free(intr_handle->intr_vec);
|
|
+ intr_handle->intr_vec = NULL;
|
|
vf_alloc_intr_vec_error:
|
|
rte_intr_efd_disable(intr_handle);
|
|
return ret;
|
|
--
|
|
2.7.4
|
|
|