[17/21] net/cpfl: add AVX512 data path for split queue model
Checks
Commit Message
Add support of AVX512 data path for split queue model.
Signed-off-by: Wenjun Wu <wenjun1.wu@intel.com>
Signed-off-by: Mingxia Liu <mingxia.liu@intel.com>
---
drivers/net/cpfl/cpfl_rxtx.c | 25 +++++++++++++++++++++++++
drivers/net/cpfl/cpfl_rxtx_vec_common.h | 14 +++++++++++++-
2 files changed, 38 insertions(+), 1 deletion(-)
@@ -772,6 +772,20 @@ cpfl_set_rx_function(struct rte_eth_dev *dev)
#ifdef RTE_ARCH_X86
if (vport->rxq_model == VIRTCHNL2_QUEUE_MODEL_SPLIT) {
+#ifdef RTE_ARCH_X86
+ if (vport->rx_vec_allowed) {
+ for (i = 0; i < dev->data->nb_tx_queues; i++) {
+ rxq = dev->data->rx_queues[i];
+ (void)idpf_splitq_rx_vec_setup(rxq);
+ }
+#ifdef CC_AVX512_SUPPORT
+ if (vport->rx_use_avx512) {
+ dev->rx_pkt_burst = idpf_splitq_recv_pkts_avx512;
+ return;
+ }
+#endif
+ }
+#endif
dev->rx_pkt_burst = idpf_splitq_recv_pkts;
} else {
if (vport->rx_vec_allowed) {
@@ -833,6 +847,17 @@ cpfl_set_tx_function(struct rte_eth_dev *dev)
#endif /* RTE_ARCH_X86 */
if (vport->txq_model == VIRTCHNL2_QUEUE_MODEL_SPLIT) {
+#ifdef RTE_ARCH_X86
+ if (vport->tx_vec_allowed) {
+#ifdef CC_AVX512_SUPPORT
+ if (vport->tx_use_avx512) {
+ dev->tx_pkt_burst = idpf_splitq_xmit_pkts_avx512;
+ dev->tx_pkt_prepare = idpf_prep_pkts;
+ return;
+ }
+#endif
+ }
+#endif
dev->tx_pkt_burst = idpf_splitq_xmit_pkts;
dev->tx_pkt_prepare = idpf_prep_pkts;
} else {
@@ -63,15 +63,27 @@ cpfl_tx_vec_queue_default(struct idpf_tx_queue *txq)
return CPFL_VECTOR_PATH;
}
+static inline int
+cpfl_rx_splitq_vec_default(struct idpf_rx_queue *rxq)
+{
+ if (rxq->bufq2->rx_buf_len < rxq->max_pkt_len)
+ return -1;
+
+ return CPFL_VECTOR_PATH;
+}
+
static inline int
cpfl_rx_vec_dev_check_default(struct rte_eth_dev *dev)
{
+ struct idpf_vport *vport = dev->data->dev_private;
struct idpf_rx_queue *rxq;
int i, ret = 0;
for (i = 0; i < dev->data->nb_rx_queues; i++) {
rxq = dev->data->rx_queues[i];
- ret = (cpfl_rx_vec_queue_default(rxq));
+ ret = cpfl_rx_vec_queue_default(rxq) ||
+ (vport->rxq_model == VIRTCHNL2_QUEUE_MODEL_SPLIT &&
+ cpfl_rx_splitq_vec_default(rxq));
if (ret < 0)
return -1;
}