* [dpdk-dev] [RFC v2] ether: support deferred queue setup
@ 2018-02-05 10:36 Qi Zhang
0 siblings, 0 replies; only message in thread
From: Qi Zhang @ 2018-02-05 10:36 UTC (permalink / raw)
To: thomas; +Cc: dev, jingjing.wu, konstantin.ananyev, arybchenko, Qi Zhang
According to exist implementation, rte_eth_[rx|tx]_queue_setup will
always return fail if device is already started(rte_eth_dev_start).
This can't satisfied the usage when application want to deferred setup
part of the queues while keep traffic running on those queues already
be setup.
example:
rte_eth_dev_config(nb_rxq = 2, nb_txq =2)
rte_eth_rx_queue_setup(idx = 0 ...)
rte_eth_rx_queue_setup(idx = 0 ...)
rte_eth_dev_start(...) /* [rx|tx]_burst is ready to start on queue 0 */
rte_eth_rx_queue_setup(idx=1 ...) /* fail*/
Basically this is not a general hardware limitation, because for NIC like
i40e, ixgbe, it is not necessary to stop the whole device before configure
a fresh queue or reconfigure an exist queue with no traffic on it.
The patch add new device capability bit into dev_info, so
rte_eth_[rx|tx]_queue_setup will able to started.
Signed-off-by: Qi Zhang <qi.z.zhang@intel.com>
---
lib/librte_ether/rte_ethdev.c | 40 ++++++++++++++++++++++++++++------------
lib/librte_ether/rte_ethdev.h | 7 +++++++
2 files changed, 35 insertions(+), 12 deletions(-)
diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index 78bed1a16..58bde40bb 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -1425,12 +1425,6 @@ rte_eth_rx_queue_setup(uint16_t port_id, uint16_t rx_queue_id,
return -EINVAL;
}
- if (dev->data->dev_started) {
- RTE_PMD_DEBUG_TRACE(
- "port %d must be stopped to allow configuration\n", port_id);
- return -EBUSY;
- }
-
RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->dev_infos_get, -ENOTSUP);
RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rx_queue_setup, -ENOTSUP);
@@ -1474,10 +1468,25 @@ rte_eth_rx_queue_setup(uint16_t port_id, uint16_t rx_queue_id,
return -EINVAL;
}
+ if (dev->data->dev_started &&
+ !(dev_info.ext_capa & DEV_DEFERRED_RX_QUEUE_SETUP)) {
+ RTE_PMD_DEBUG_TRACE(
+ "port %d must be stopped to allow rx queue setup\n",
+ port_id);
+ return -EBUSY;
+ }
+
rxq = dev->data->rx_queues;
if (rxq[rx_queue_id]) {
RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rx_queue_release,
-ENOTSUP);
+ if (dev->data->dev_started &&
+ !(dev_info.ext_capa & DEV_DEFERRED_RX_QUEUE_RELEASE)) {
+ RTE_PMD_DEBUG_TRACE(
+ "port %d must be stopped to allow rx queue release\n",
+ port_id);
+ return -EBUSY;
+ }
(*dev->dev_ops->rx_queue_release)(rxq[rx_queue_id]);
rxq[rx_queue_id] = NULL;
}
@@ -1573,12 +1582,6 @@ rte_eth_tx_queue_setup(uint16_t port_id, uint16_t tx_queue_id,
return -EINVAL;
}
- if (dev->data->dev_started) {
- RTE_PMD_DEBUG_TRACE(
- "port %d must be stopped to allow configuration\n", port_id);
- return -EBUSY;
- }
-
RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->dev_infos_get, -ENOTSUP);
RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->tx_queue_setup, -ENOTSUP);
@@ -1596,10 +1599,23 @@ rte_eth_tx_queue_setup(uint16_t port_id, uint16_t tx_queue_id,
return -EINVAL;
}
+ if (dev->data->dev_started &&
+ !(dev_info.ext_capa & DEV_DEFERRED_TX_QUEUE_SETUP)) {
+ RTE_PMD_DEBUG_TRACE(
+ "port %d must be stopped to allow tx queue setup\n",
+ return -EBUSY;
+ }
+
txq = dev->data->tx_queues;
if (txq[tx_queue_id]) {
RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->tx_queue_release,
-ENOTSUP);
+ if (dev->data->dev_started &&
+ !(dev_info.ext_capa & DEV_DEFERRED_TX_QUEUE_RELEASE)) {
+ RTE_PMD_DEBUG_TRACE(
+ "port %d must be stopped to allow tx queue release\n",
+ return -EBUSY;
+ }
(*dev->dev_ops->tx_queue_release)(txq[tx_queue_id]);
txq[tx_queue_id] = NULL;
}
diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
index 036153306..75a85859d 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -981,6 +981,12 @@ struct rte_eth_conf {
*/
#define DEV_TX_OFFLOAD_SECURITY 0x00020000
+/** < Deferred queue setup / release capability */
+#define DEV_DEFERRED_RX_QUEUE_SETUP 0x00000001
+#define DEV_DEFERRED_TX_QUEUE_SETUP 0x00000002
+#define DEV_DEFERRED_RX_QUEUE_RELEASE 0x00000004
+#define DEV_DEFERRED_TX_QUEUE_RELEASE 0x00000008
+
/*
* If new Tx offload capabilities are defined, they also must be
* mentioned in rte_tx_offload_names in rte_ethdev.c file.
@@ -1029,6 +1035,7 @@ struct rte_eth_dev_info {
/** Configured number of rx/tx queues */
uint16_t nb_rx_queues; /**< Number of RX queues. */
uint16_t nb_tx_queues; /**< Number of TX queues. */
+ uint64_t ext_capa; /**< extended capability */
};
/**
--
2.13.6
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2018-02-05 10:36 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-02-05 10:36 [dpdk-dev] [RFC v2] ether: support deferred queue setup Qi Zhang
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).