summaryrefslogtreecommitdiff
path: root/drivers/net/iavf/iavf_rxtx.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/iavf/iavf_rxtx.c')
-rw-r--r--drivers/net/iavf/iavf_rxtx.c141
1 files changed, 54 insertions, 87 deletions
diff --git a/drivers/net/iavf/iavf_rxtx.c b/drivers/net/iavf/iavf_rxtx.c
index 22d7bb6..3ee92e8 100644
--- a/drivers/net/iavf/iavf_rxtx.c
+++ b/drivers/net/iavf/iavf_rxtx.c
@@ -92,7 +92,6 @@ check_tx_thresh(uint16_t nb_desc, uint16_t tx_rs_thresh,
return 0;
}
-#ifdef RTE_LIBRTE_IAVF_INC_VECTOR
static inline bool
check_rx_vec_allow(struct iavf_rx_queue *rxq)
{
@@ -118,7 +117,6 @@ check_tx_vec_allow(struct iavf_tx_queue *txq)
PMD_INIT_LOG(DEBUG, "Vector Tx cannot be enabled on this txq.");
return FALSE;
}
-#endif
static inline bool
check_rx_bulk_allow(struct iavf_rx_queue *rxq)
@@ -413,10 +411,9 @@ iavf_dev_rx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx,
ad->rx_bulk_alloc_allowed = false;
}
-#ifdef RTE_LIBRTE_IAVF_INC_VECTOR
if (check_rx_vec_allow(rxq) == FALSE)
ad->rx_vec_allowed = false;
-#endif
+
return 0;
}
@@ -511,13 +508,11 @@ iavf_dev_tx_queue_setup(struct rte_eth_dev *dev,
txq->qtx_tail = hw->hw_addr + IAVF_QTX_TAIL1(queue_idx);
txq->ops = &def_txq_ops;
-#ifdef RTE_LIBRTE_IAVF_INC_VECTOR
if (check_tx_vec_allow(txq) == FALSE) {
struct iavf_adapter *ad =
IAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
ad->tx_vec_allowed = false;
}
-#endif
return 0;
}
@@ -1666,27 +1661,6 @@ end_of_tx:
return nb_tx;
}
-static uint16_t
-iavf_xmit_pkts_vec(void *tx_queue, struct rte_mbuf **tx_pkts,
- uint16_t nb_pkts)
-{
- uint16_t nb_tx = 0;
- struct iavf_tx_queue *txq = (struct iavf_tx_queue *)tx_queue;
-
- while (nb_pkts) {
- uint16_t ret, num;
-
- num = (uint16_t)RTE_MIN(nb_pkts, txq->rs_thresh);
- ret = iavf_xmit_fixed_burst_vec(tx_queue, &tx_pkts[nb_tx], num);
- nb_tx += ret;
- nb_pkts -= ret;
- if (ret < num)
- break;
- }
-
- return nb_tx;
-}
-
/* TX prep functions */
uint16_t
iavf_prep_pkts(__rte_unused void *tx_queue, struct rte_mbuf **tx_pkts,
@@ -1741,26 +1715,43 @@ iavf_set_rx_function(struct rte_eth_dev *dev)
{
struct iavf_adapter *adapter =
IAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
+#ifdef RTE_ARCH_X86
struct iavf_rx_queue *rxq;
int i;
+ bool use_avx2 = false;
- if (adapter->rx_vec_allowed) {
- if (dev->data->scattered_rx) {
- PMD_DRV_LOG(DEBUG, "Using Vector Scattered Rx callback"
- " (port=%d).", dev->data->port_id);
- dev->rx_pkt_burst = iavf_recv_scattered_pkts_vec;
- } else {
- PMD_DRV_LOG(DEBUG, "Using Vector Rx callback"
- " (port=%d).", dev->data->port_id);
- dev->rx_pkt_burst = iavf_recv_pkts_vec;
- }
+ if (!iavf_rx_vec_dev_check(dev)) {
for (i = 0; i < dev->data->nb_rx_queues; i++) {
rxq = dev->data->rx_queues[i];
- if (!rxq)
- continue;
- iavf_rxq_vec_setup(rxq);
+ (void)iavf_rxq_vec_setup(rxq);
+ }
+
+ if (rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX2) == 1 ||
+ rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX512F) == 1)
+ use_avx2 = true;
+
+ if (dev->data->scattered_rx) {
+ PMD_DRV_LOG(DEBUG,
+ "Using %sVector Scattered Rx (port %d).",
+ use_avx2 ? "avx2 " : "",
+ dev->data->port_id);
+ dev->rx_pkt_burst = use_avx2 ?
+ iavf_recv_scattered_pkts_vec_avx2 :
+ iavf_recv_scattered_pkts_vec;
+ } else {
+ PMD_DRV_LOG(DEBUG, "Using %sVector Rx (port %d).",
+ use_avx2 ? "avx2 " : "",
+ dev->data->port_id);
+ dev->rx_pkt_burst = use_avx2 ?
+ iavf_recv_pkts_vec_avx2 :
+ iavf_recv_pkts_vec;
}
- } else if (dev->data->scattered_rx) {
+
+ return;
+ }
+#endif
+
+ if (dev->data->scattered_rx) {
PMD_DRV_LOG(DEBUG, "Using a Scattered Rx callback (port=%d).",
dev->data->port_id);
dev->rx_pkt_burst = iavf_recv_scattered_pkts;
@@ -1779,28 +1770,39 @@ iavf_set_rx_function(struct rte_eth_dev *dev)
void
iavf_set_tx_function(struct rte_eth_dev *dev)
{
- struct iavf_adapter *adapter =
- IAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
+#ifdef RTE_ARCH_X86
struct iavf_tx_queue *txq;
int i;
+ bool use_avx2 = false;
- if (adapter->tx_vec_allowed) {
- PMD_DRV_LOG(DEBUG, "Using Vector Tx callback (port=%d).",
- dev->data->port_id);
- dev->tx_pkt_burst = iavf_xmit_pkts_vec;
- dev->tx_pkt_prepare = NULL;
+ if (!iavf_tx_vec_dev_check(dev)) {
for (i = 0; i < dev->data->nb_tx_queues; i++) {
txq = dev->data->tx_queues[i];
if (!txq)
continue;
iavf_txq_vec_setup(txq);
}
- } else {
- PMD_DRV_LOG(DEBUG, "Using Basic Tx callback (port=%d).",
+
+ if (rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX2) == 1 ||
+ rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX512F) == 1)
+ use_avx2 = true;
+
+ PMD_DRV_LOG(DEBUG, "Using %sVector Tx (port %d).",
+ use_avx2 ? "avx2 " : "",
dev->data->port_id);
- dev->tx_pkt_burst = iavf_xmit_pkts;
- dev->tx_pkt_prepare = iavf_prep_pkts;
+ dev->tx_pkt_burst = use_avx2 ?
+ iavf_xmit_pkts_vec_avx2 :
+ iavf_xmit_pkts_vec;
+ dev->tx_pkt_prepare = NULL;
+
+ return;
}
+#endif
+
+ PMD_DRV_LOG(DEBUG, "Using Basic Tx callback (port=%d).",
+ dev->data->port_id);
+ dev->tx_pkt_burst = iavf_xmit_pkts;
+ dev->tx_pkt_prepare = iavf_prep_pkts;
}
void
@@ -1923,38 +1925,3 @@ iavf_dev_tx_desc_status(void *tx_queue, uint16_t offset)
return RTE_ETH_TX_DESC_FULL;
}
-__rte_weak uint16_t
-iavf_recv_pkts_vec(__rte_unused void *rx_queue,
- __rte_unused struct rte_mbuf **rx_pkts,
- __rte_unused uint16_t nb_pkts)
-{
- return 0;
-}
-
-__rte_weak uint16_t
-iavf_recv_scattered_pkts_vec(__rte_unused void *rx_queue,
- __rte_unused struct rte_mbuf **rx_pkts,
- __rte_unused uint16_t nb_pkts)
-{
- return 0;
-}
-
-__rte_weak uint16_t
-iavf_xmit_fixed_burst_vec(__rte_unused void *tx_queue,
- __rte_unused struct rte_mbuf **tx_pkts,
- __rte_unused uint16_t nb_pkts)
-{
- return 0;
-}
-
-__rte_weak int
-iavf_rxq_vec_setup(__rte_unused struct iavf_rx_queue *rxq)
-{
- return -1;
-}
-
-__rte_weak int
-iavf_txq_vec_setup(__rte_unused struct iavf_tx_queue *txq)
-{
- return -1;
-}