All of lore.kernel.org
 help / color / mirror / Atom feed
From: Qi Zhang <qi.z.zhang@intel.com>
To: thomas@monjalon.net, ferruh.yigit@intel.com
Cc: konstantin.ananyev@intel.com, dev@dpdk.org,
	beilei.xing@intel.com, jingjing.wu@intel.com,
	wenzhuo.lu@intel.com, Qi Zhang <Qi.z.zhang@intel.com>
Subject: [PATCH v8 5/5] net/i40e: enable runtime queue setup
Date: Tue, 24 Apr 2018 20:44:10 +0800	[thread overview]
Message-ID: <20180424124410.229538-6-qi.z.zhang@intel.com> (raw)
In-Reply-To: <20180424124410.229538-1-qi.z.zhang@intel.com>

From: Qi Zhang <Qi.z.zhang@intel.com>

Expose the runtime queue configuration capability and enhance
i40e_dev_[rx|tx]_queue_setup to handle the situation when
device already started.

Signed-off-by: Qi Zhang <Qi.z.zhang@intel.com>
Acked-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
Acked-by: Ferruh Yigit <ferruh.yigit@intel.com>
---
v8:
- re-order in i40e.ini

v7:
- update i40e.ini

v5:
- fix first tx queue check.

v4:
- fix rx/tx conflict check.
- no need conflict check for first rx/tx queue at runtime setup.

v3:
- no queue start/stop in setup/release
- return fail when required rx/tx function conflict with
  exist setup

 doc/guides/nics/features/i40e.ini |   2 +
 drivers/net/i40e/i40e_ethdev.c    |   4 +
 drivers/net/i40e/i40e_rxtx.c      | 183 +++++++++++++++++++++++++++++++++-----
 3 files changed, 166 insertions(+), 23 deletions(-)

diff --git a/doc/guides/nics/features/i40e.ini b/doc/guides/nics/features/i40e.ini
index e862712c9..02087bcbd 100644
--- a/doc/guides/nics/features/i40e.ini
+++ b/doc/guides/nics/features/i40e.ini
@@ -9,6 +9,8 @@ Link status          = Y
 Link status event    = Y
 Rx interrupt         = Y
 Queue start/stop     = Y
+Runtime Rx queue setup = Y
+Runtime Tx queue setup = Y
 Jumbo frame          = Y
 Scattered Rx         = Y
 TSO                  = Y
diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index 180ac7449..e329042df 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -3244,6 +3244,10 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 		DEV_TX_OFFLOAD_GRE_TNL_TSO |
 		DEV_TX_OFFLOAD_IPIP_TNL_TSO |
 		DEV_TX_OFFLOAD_GENEVE_TNL_TSO;
+	dev_info->dev_capa =
+		DEV_CAPA_RUNTIME_RX_QUEUE_SETUP |
+		DEV_CAPA_RUNTIME_TX_QUEUE_SETUP;
+
 	dev_info->hash_key_size = (I40E_PFQF_HKEY_MAX_INDEX + 1) *
 						sizeof(uint32_t);
 	dev_info->reta_size = pf->hash_lut_size;
diff --git a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c
index bc660596b..df855ff3a 100644
--- a/drivers/net/i40e/i40e_rxtx.c
+++ b/drivers/net/i40e/i40e_rxtx.c
@@ -1706,6 +1706,75 @@ i40e_check_rx_queue_offloads(struct rte_eth_dev *dev, uint64_t requested)
 	return !((mandatory ^ requested) & supported);
 }
 
+static int
+i40e_dev_first_queue(uint16_t idx, void **queues, int num)
+{
+	uint16_t i;
+
+	for (i = 0; i < num; i++) {
+		if (i != idx && queues[i])
+			return 0;
+	}
+
+	return 1;
+}
+
+static int
+i40e_dev_rx_queue_setup_runtime(struct rte_eth_dev *dev,
+				struct i40e_rx_queue *rxq)
+{
+	struct i40e_adapter *ad =
+		I40E_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
+	int use_def_burst_func =
+		check_rx_burst_bulk_alloc_preconditions(rxq);
+	uint16_t buf_size =
+		(uint16_t)(rte_pktmbuf_data_room_size(rxq->mp) -
+			   RTE_PKTMBUF_HEADROOM);
+	int use_scattered_rx =
+		((rxq->max_pkt_len + 2 * I40E_VLAN_TAG_SIZE) > buf_size);
+
+	if (i40e_rx_queue_init(rxq) != I40E_SUCCESS) {
+		PMD_DRV_LOG(ERR,
+			    "Failed to do RX queue initialization");
+		return -EINVAL;
+	}
+
+	if (i40e_dev_first_queue(rxq->queue_id,
+				 dev->data->rx_queues,
+				 dev->data->nb_rx_queues)) {
+		/**
+		 * If it is the first queue to setup,
+		 * set all flags to default and call
+		 * i40e_set_rx_function.
+		 */
+		ad->rx_bulk_alloc_allowed = true;
+		ad->rx_vec_allowed = true;
+		dev->data->scattered_rx = use_scattered_rx;
+		if (use_def_burst_func)
+			ad->rx_bulk_alloc_allowed = false;
+		i40e_set_rx_function(dev);
+		return 0;
+	}
+
+	/* check bulk alloc conflict */
+	if (ad->rx_bulk_alloc_allowed && use_def_burst_func) {
+		PMD_DRV_LOG(ERR, "Can't use default burst.");
+		return -EINVAL;
+	}
+	/* check scatterred conflict */
+	if (!dev->data->scattered_rx && use_scattered_rx) {
+		PMD_DRV_LOG(ERR, "Scattered rx is required.");
+		return -EINVAL;
+	}
+	/* check vector conflict */
+	if (ad->rx_vec_allowed && i40e_rxq_vec_setup(rxq)) {
+		PMD_DRV_LOG(ERR, "Failed vector rx setup.");
+		return -EINVAL;
+	}
+
+	return 0;
+}
+
 int
 i40e_dev_rx_queue_setup(struct rte_eth_dev *dev,
 			uint16_t queue_idx,
@@ -1834,25 +1903,6 @@ i40e_dev_rx_queue_setup(struct rte_eth_dev *dev,
 
 	i40e_reset_rx_queue(rxq);
 	rxq->q_set = TRUE;
-	dev->data->rx_queues[queue_idx] = rxq;
-
-	use_def_burst_func = check_rx_burst_bulk_alloc_preconditions(rxq);
-
-	if (!use_def_burst_func) {
-#ifdef RTE_LIBRTE_I40E_RX_ALLOW_BULK_ALLOC
-		PMD_INIT_LOG(DEBUG, "Rx Burst Bulk Alloc Preconditions are "
-			     "satisfied. Rx Burst Bulk Alloc function will be "
-			     "used on port=%d, queue=%d.",
-			     rxq->port_id, rxq->queue_id);
-#endif /* RTE_LIBRTE_I40E_RX_ALLOW_BULK_ALLOC */
-	} else {
-		PMD_INIT_LOG(DEBUG, "Rx Burst Bulk Alloc Preconditions are "
-			     "not satisfied, Scattered Rx is requested, "
-			     "or RTE_LIBRTE_I40E_RX_ALLOW_BULK_ALLOC is "
-			     "not enabled on port=%d, queue=%d.",
-			     rxq->port_id, rxq->queue_id);
-		ad->rx_bulk_alloc_allowed = false;
-	}
 
 	for (i = 0; i < I40E_MAX_TRAFFIC_CLASS; i++) {
 		if (!(vsi->enabled_tc & (1 << i)))
@@ -1867,6 +1917,34 @@ i40e_dev_rx_queue_setup(struct rte_eth_dev *dev,
 			rxq->dcb_tc = i;
 	}
 
+	if (dev->data->dev_started) {
+		if (i40e_dev_rx_queue_setup_runtime(dev, rxq)) {
+			i40e_dev_rx_queue_release(rxq);
+			return -EINVAL;
+		}
+	} else {
+		use_def_burst_func =
+			check_rx_burst_bulk_alloc_preconditions(rxq);
+		if (!use_def_burst_func) {
+#ifdef RTE_LIBRTE_I40E_RX_ALLOW_BULK_ALLOC
+			PMD_INIT_LOG(DEBUG,
+			  "Rx Burst Bulk Alloc Preconditions are "
+			  "satisfied. Rx Burst Bulk Alloc function will be "
+			  "used on port=%d, queue=%d.",
+			  rxq->port_id, rxq->queue_id);
+#endif /* RTE_LIBRTE_I40E_RX_ALLOW_BULK_ALLOC */
+		} else {
+			PMD_INIT_LOG(DEBUG,
+			  "Rx Burst Bulk Alloc Preconditions are "
+			  "not satisfied, Scattered Rx is requested, "
+			  "or RTE_LIBRTE_I40E_RX_ALLOW_BULK_ALLOC is "
+			  "not enabled on port=%d, queue=%d.",
+			  rxq->port_id, rxq->queue_id);
+			ad->rx_bulk_alloc_allowed = false;
+		}
+	}
+
+	dev->data->rx_queues[queue_idx] = rxq;
 	return 0;
 }
 
@@ -2012,6 +2090,55 @@ i40e_check_tx_queue_offloads(struct rte_eth_dev *dev, uint64_t requested)
 	return !((mandatory ^ requested) & supported);
 }
 
+static int
+i40e_dev_tx_queue_setup_runtime(struct rte_eth_dev *dev,
+				struct i40e_tx_queue *txq)
+{
+	struct i40e_adapter *ad =
+		I40E_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
+
+	if (i40e_tx_queue_init(txq) != I40E_SUCCESS) {
+		PMD_DRV_LOG(ERR,
+			    "Failed to do TX queue initialization");
+		return -EINVAL;
+	}
+
+	if (i40e_dev_first_queue(txq->queue_id,
+				 dev->data->tx_queues,
+				 dev->data->nb_tx_queues)) {
+		/**
+		 * If it is the first queue to setup,
+		 * set all flags to default and call
+		 * i40e_set_tx_function.
+		 */
+		ad->tx_simple_allowed = true;
+		ad->tx_vec_allowed = true;
+		i40e_set_tx_function_flag(dev, txq);
+		i40e_set_tx_function(dev);
+		return 0;
+	}
+
+	/* check vector conflict */
+	if (ad->tx_vec_allowed) {
+		if (txq->tx_rs_thresh > RTE_I40E_TX_MAX_FREE_BUF_SZ ||
+		    i40e_txq_vec_setup(txq)) {
+			PMD_DRV_LOG(ERR, "Failed vector tx setup.");
+			return -EINVAL;
+		}
+	}
+	/* check simple tx conflict */
+	if (ad->tx_simple_allowed) {
+		if (((txq->txq_flags & I40E_SIMPLE_FLAGS) !=
+		     I40E_SIMPLE_FLAGS) ||
+		    txq->tx_rs_thresh < RTE_PMD_I40E_TX_MAX_BURST) {
+			PMD_DRV_LOG(ERR, "No-simple tx is required.");
+			return -EINVAL;
+		}
+	}
+
+	return 0;
+}
+
 int
 i40e_dev_tx_queue_setup(struct rte_eth_dev *dev,
 			uint16_t queue_idx,
@@ -2194,10 +2321,6 @@ i40e_dev_tx_queue_setup(struct rte_eth_dev *dev,
 
 	i40e_reset_tx_queue(txq);
 	txq->q_set = TRUE;
-	dev->data->tx_queues[queue_idx] = txq;
-
-	/* Use a simple TX queue without offloads or multi segs if possible */
-	i40e_set_tx_function_flag(dev, txq);
 
 	for (i = 0; i < I40E_MAX_TRAFFIC_CLASS; i++) {
 		if (!(vsi->enabled_tc & (1 << i)))
@@ -2212,6 +2335,20 @@ i40e_dev_tx_queue_setup(struct rte_eth_dev *dev,
 			txq->dcb_tc = i;
 	}
 
+	if (dev->data->dev_started) {
+		if (i40e_dev_tx_queue_setup_runtime(dev, txq)) {
+			i40e_dev_tx_queue_release(txq);
+			return -EINVAL;
+		}
+	} else {
+		/**
+		 * Use a simple TX queue without offloads or
+		 * multi segs if possible
+		 */
+		i40e_set_tx_function_flag(dev, txq);
+	}
+	dev->data->tx_queues[queue_idx] = txq;
+
 	return 0;
 }
 
-- 
2.13.6

  parent reply	other threads:[~2018-04-24 12:44 UTC|newest]

Thread overview: 95+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-02-12  4:53 [PATCH 0/4] deferred queue setup Qi Zhang
2018-02-12  4:53 ` [PATCH 1/4] ether: support " Qi Zhang
2018-02-12 13:55   ` Thomas Monjalon
2018-02-12  4:53 ` [PATCH 2/4] app/testpmd: add parameters for " Qi Zhang
2018-02-12  4:53 ` [PATCH 3/4] app/testpmd: add command for " Qi Zhang
2018-02-12  4:53 ` [PATCH 4/4] net/i40e: enable deferred " Qi Zhang
2018-03-02  4:13 ` [PATCH v2 0/4] " Qi Zhang
2018-03-02  4:13   ` [PATCH v2 1/4] ether: support " Qi Zhang
2018-03-14 12:31     ` Ananyev, Konstantin
2018-03-15  3:13       ` Zhang, Qi Z
2018-03-15 13:16         ` Ananyev, Konstantin
2018-03-15 15:08           ` Zhang, Qi Z
2018-03-15 15:38             ` Ananyev, Konstantin
2018-03-16  0:42               ` Zhang, Qi Z
2018-03-02  4:13   ` [PATCH v2 2/4] app/testpmd: add parameters for " Qi Zhang
2018-03-14 17:38     ` Ananyev, Konstantin
2018-03-15  3:58       ` Zhang, Qi Z
2018-03-15 13:42         ` Ananyev, Konstantin
2018-03-15 14:31           ` Zhang, Qi Z
2018-03-02  4:13   ` [PATCH v2 3/4] app/testpmd: add command for " Qi Zhang
2018-03-14 17:36     ` Ananyev, Konstantin
2018-03-14 17:41     ` Ananyev, Konstantin
2018-03-15  3:59       ` Zhang, Qi Z
2018-03-02  4:13   ` [PATCH v2 4/4] net/i40e: enable deferred " Qi Zhang
2018-03-14 12:35     ` Ananyev, Konstantin
2018-03-15  3:22       ` Zhang, Qi Z
2018-03-15  3:50         ` Zhang, Qi Z
2018-03-15 13:22         ` Ananyev, Konstantin
2018-03-15 14:30           ` Zhang, Qi Z
2018-03-15 15:22             ` Ananyev, Konstantin
2018-03-16  0:52               ` Zhang, Qi Z
2018-03-16  9:54                 ` Ananyev, Konstantin
2018-03-16 11:00                   ` Bruce Richardson
2018-03-16 13:18                   ` Zhang, Qi Z
2018-03-16 14:15                   ` Zhang, Qi Z
2018-03-16 18:47                     ` Ananyev, Konstantin
2018-03-18  7:55                       ` Zhang, Qi Z
2018-03-20 13:18                         ` Ananyev, Konstantin
2018-03-21  1:53                           ` Zhang, Qi Z
2018-03-21  7:28 ` [PATCH v3 0/3] runtime " Qi Zhang
2018-03-21  7:28   ` [PATCH v3 1/3] ether: support " Qi Zhang
2018-03-25 19:47     ` Ananyev, Konstantin
2018-03-21  7:28   ` [PATCH v3 2/3] app/testpmd: add command for " Qi Zhang
2018-03-21  7:28   ` [PATCH v3 3/3] net/i40e: enable runtime " Qi Zhang
2018-03-25 19:46     ` Ananyev, Konstantin
2018-03-26  8:49       ` Zhang, Qi Z
2018-03-26  8:59 ` [PATCH v4 0/3] " Qi Zhang
2018-03-26  8:59   ` [PATCH v4 1/3] ether: support " Qi Zhang
2018-03-26  8:59   ` [PATCH v4 2/3] app/testpmd: add command for " Qi Zhang
2018-04-01 12:21     ` Ananyev, Konstantin
2018-03-26  8:59   ` [PATCH v4 3/3] net/i40e: enable runtime " Qi Zhang
2018-04-01 12:18     ` Ananyev, Konstantin
2018-04-02  2:20       ` Zhang, Qi Z
2018-04-02  2:59 ` [PATCH v5 0/3] " Qi Zhang
2018-04-02  2:59   ` [PATCH v5 1/3] ether: support " Qi Zhang
2018-04-06 19:42     ` Rosen, Rami
2018-04-08  2:20       ` Zhang, Qi Z
2018-04-02  2:59   ` [PATCH v5 2/3] app/testpmd: add command for " Qi Zhang
2018-04-07 15:49     ` Rosen, Rami
2018-04-08  2:22       ` Zhang, Qi Z
2018-04-02  2:59   ` [PATCH v5 3/3] net/i40e: enable runtime " Qi Zhang
2018-04-02 23:36   ` [PATCH v5 0/3] " Ananyev, Konstantin
2018-04-08  2:42 ` Qi Zhang
2018-04-08  2:42   ` [PATCH v6 1/3] ether: support " Qi Zhang
2018-04-10 13:59     ` Thomas Monjalon
2018-04-20 11:14       ` Ferruh Yigit
2018-04-24 19:36       ` Thomas Monjalon
2018-04-25  5:33         ` Zhang, Qi Z
2018-04-25  7:54           ` Thomas Monjalon
2018-04-20 11:16     ` Ferruh Yigit
2018-04-08  2:42   ` [PATCH v6 2/3] app/testpmd: add command for " Qi Zhang
2018-04-20 11:29     ` Ferruh Yigit
2018-04-22 11:57       ` Zhang, Qi Z
2018-04-08  2:42   ` [PATCH v6 3/3] net/i40e: enable runtime " Qi Zhang
2018-04-20 11:17     ` Ferruh Yigit
2018-04-22 11:58 ` [PATCH v7 0/5] " Qi Zhang
2018-04-22 11:58   ` [PATCH v7 1/5] ethdev: support " Qi Zhang
2018-04-23 17:45     ` Ferruh Yigit
2018-04-22 11:58   ` [PATCH v7 2/5] app/testpmd: add command for " Qi Zhang
2018-04-22 11:58   ` [PATCH v7 3/5] app/testpmd: enable per queue configure Qi Zhang
2018-04-23 17:45     ` Ferruh Yigit
2018-04-22 11:58   ` [PATCH v7 4/5] app/testpmd: enable queue ring size configure Qi Zhang
2018-04-23 17:45     ` Ferruh Yigit
2018-04-24  3:16       ` Zhang, Qi Z
2018-04-24 11:05         ` Ferruh Yigit
2018-04-22 11:58   ` [PATCH v7 5/5] net/i40e: enable runtime queue setup Qi Zhang
2018-04-23 17:45   ` [PATCH v7 0/5] " Ferruh Yigit
2018-04-24 12:44 ` [PATCH v8 " Qi Zhang
2018-04-24 12:44   ` [PATCH v8 1/5] ethdev: support " Qi Zhang
2018-04-24 14:01     ` Thomas Monjalon
2018-04-24 12:44   ` [PATCH v8 2/5] app/testpmd: add command for " Qi Zhang
2018-04-24 12:44   ` [PATCH v8 3/5] app/testpmd: enable per queue configure Qi Zhang
2018-04-24 12:44   ` [PATCH v8 4/5] app/testpmd: enable queue ring size configure Qi Zhang
2018-04-24 12:44   ` Qi Zhang [this message]
2018-04-24 14:50   ` [PATCH v8 0/5] runtime queue setup Ferruh Yigit

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180424124410.229538-6-qi.z.zhang@intel.com \
    --to=qi.z.zhang@intel.com \
    --cc=beilei.xing@intel.com \
    --cc=dev@dpdk.org \
    --cc=ferruh.yigit@intel.com \
    --cc=jingjing.wu@intel.com \
    --cc=konstantin.ananyev@intel.com \
    --cc=thomas@monjalon.net \
    --cc=wenzhuo.lu@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.