[v2,5/5] net/cpfl: adjust RSS LUT to exclude hairpin queue
Checks
Commit Message
RSS should direct traffic only to the normal data Rx queues,
so when hairpin queue configured, RSS LUT should be adjusted
to exclude the hairpin queue.
Signed-off-by: Xiao Wang <xiao.w.wang@intel.com>
Signed-off-by: Junfeng Guo <junfeng.guo@intel.com>
Signed-off-by: Mingxia Liu <mingxia.liu@intel.com>
---
drivers/net/cpfl/cpfl_ethdev.c | 38 ++++++++++++++++++++--------------
1 file changed, 23 insertions(+), 15 deletions(-)
@@ -446,7 +446,8 @@ cpfl_init_rss(struct idpf_vport *vport)
{
struct rte_eth_rss_conf *rss_conf;
struct rte_eth_dev_data *dev_data;
- uint16_t i, nb_q;
+ struct cpfl_rx_queue *cpfl_rxq;
+ uint16_t i, nb_q, max_nb_data_q;
int ret = 0;
dev_data = vport->dev_data;
@@ -465,8 +466,16 @@ cpfl_init_rss(struct idpf_vport *vport)
vport->rss_key_size);
}
+ /* RSS only to the data queues */
+ max_nb_data_q = nb_q;
+ if (nb_q > 1) {
+ cpfl_rxq = dev_data->rx_queues[nb_q - 1];
+ if (cpfl_rxq && cpfl_rxq->hairpin_info.hairpin_q)
+ max_nb_data_q = nb_q - 1;
+ }
+
for (i = 0; i < vport->rss_lut_size; i++)
- vport->rss_lut[i] = i % nb_q;
+ vport->rss_lut[i] = i % max_nb_data_q;
vport->rss_hf = IDPF_DEFAULT_RSS_HASH_EXPANDED;
@@ -673,8 +682,6 @@ cpfl_dev_configure(struct rte_eth_dev *dev)
(struct cpfl_vport *)dev->data->dev_private;
struct idpf_vport *vport = &(cpfl_vport->base);
struct rte_eth_conf *conf = &dev->data->dev_conf;
- struct idpf_adapter *adapter = vport->adapter;
- int ret;
if (conf->link_speeds & RTE_ETH_LINK_SPEED_FIXED) {
PMD_INIT_LOG(ERR, "Setting link speed is not supported");
@@ -713,17 +720,6 @@ cpfl_dev_configure(struct rte_eth_dev *dev)
return -ENOTSUP;
}
- if (adapter->caps.rss_caps != 0 && dev->data->nb_rx_queues != 0) {
- ret = cpfl_init_rss(vport);
- if (ret != 0) {
- PMD_INIT_LOG(ERR, "Failed to init rss");
- return ret;
- }
- } else {
- PMD_INIT_LOG(ERR, "RSS is not supported.");
- return -1;
- }
-
vport->max_pkt_len =
(dev->data->mtu == 0) ? CPFL_DEFAULT_MTU : dev->data->mtu +
CPFL_ETH_OVERHEAD;
@@ -748,11 +744,23 @@ cpfl_start_queues(struct rte_eth_dev *dev)
struct cpfl_vport *cpfl_vport =
(struct cpfl_vport *)dev->data->dev_private;
struct idpf_vport *vport = &(cpfl_vport->base);
+ struct idpf_adapter *adapter = vport->adapter;
struct cpfl_rx_queue *cpfl_rxq;
struct cpfl_tx_queue *cpfl_txq;
int err = 0;
int i;
+ if (adapter->caps.rss_caps != 0 && dev->data->nb_rx_queues != 0) {
+ err = cpfl_init_rss(vport);
+ if (err != 0) {
+ PMD_INIT_LOG(ERR, "Failed to init rss");
+ return err;
+ }
+ } else {
+ PMD_INIT_LOG(ERR, "RSS is not supported.");
+ return -1;
+ }
+
for (i = 0; i < dev->data->nb_tx_queues; i++) {
cpfl_txq = dev->data->tx_queues[i];
if (cpfl_txq == NULL || cpfl_txq->base.tx_deferred_start)