From: Wei Dai <wei.dai@intel.com>
To: thomas@monjalon.net, ferruh.yigit@intel.com
Cc: dev@dpdk.org, Wei Dai <wei.dai@intel.com>
Subject: [dpdk-dev] [PATCH v7] ethdev: check Rx/Tx offloads
Date: Fri, 4 May 2018 22:02:09 +0800 [thread overview]
Message-ID: <1525442529-12723-1-git-send-email-wei.dai@intel.com> (raw)
In-Reply-To: <1525311040-26694-1-git-send-email-wei.dai@intel.com>
This patch check if a input requested offloading is valid or not.
Any reuqested offloading must be supported in the device capabilities.
Any offloading is disabled by default if it is not set in the parameter
dev_conf->[rt]xmode.offloads to rte_eth_dev_configure( ) and
[rt]x_conf->offloads to rte_eth_[rt]x_queue_setup( ).
>From application, a pure per-port offloading can't be enabled on
any queue if it hasn't been enabled in rte_eth_dev_configure( ).
If any offloading is enabled in rte_eth_dev_configure( ) by application,
it is enabled on all queues no matter whether it is per-queue or
per-port type and no matter whether it is set or cleared in
[rt]x_conf->offloads to rte_eth_[rt]x_queue_setup( ).
The underlying PMD must be aware that the requested offloadings
to PMD specific queue_setup( ) function only carries those
offloadings only enabled for the queue but not enabled in
rte_eth_dev_configure( ) and they are certain per-queue type.
This patch can make above such checking in a common way in rte_ethdev
layer to avoid same checking in underlying PMD.
Signed-off-by: Wei Dai <wei.dai@intel.com>
Signed-off-by: Ferruh Yigit <ferruh.yigit@intel.com>
---
v7:
Give the maximum freedom for upper application,
only minimal checking is performed in ethdev layer.
Only requested specific pure per-queue offloadings are input
to underlying PMD.
v6:
No need enable an offload in queue_setup( ) if it has already
been enabled in dev_configure( )
v5:
keep offload settings sent to PMD same as those from application
v4:
fix a wrong description in git log message.
v3:
rework according to dicision of offloading API in community
v2:
add offloads checking in rte_eth_dev_configure( ).
check if a requested offloading is supported.
---
lib/librte_ethdev/rte_ethdev.c | 150 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 150 insertions(+)
diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c
index e560524..0ad05eb 100644
--- a/lib/librte_ethdev/rte_ethdev.c
+++ b/lib/librte_ethdev/rte_ethdev.c
@@ -1139,6 +1139,28 @@ rte_eth_dev_configure(uint16_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q,
ETHER_MAX_LEN;
}
+ /* Any requested offloading must be within its device capabilities */
+ if ((local_conf.rxmode.offloads & dev_info.rx_offload_capa) !=
+ local_conf.rxmode.offloads) {
+ RTE_PMD_DEBUG_TRACE("ethdev port_id=%d requested Rx offloads "
+ "0x%" PRIx64 " doesn't match Rx offloads "
+ "capabilities 0x%" PRIx64 "\n",
+ port_id,
+ local_conf.rxmode.offloads,
+ dev_info.rx_offload_capa);
+ return -EINVAL;
+ }
+ if ((local_conf.txmode.offloads & dev_info.tx_offload_capa) !=
+ local_conf.txmode.offloads) {
+ RTE_PMD_DEBUG_TRACE("ethdev port_id=%d requested Tx offloads "
+ "0x%" PRIx64 " doesn't match Tx offloads "
+ "capabilities 0x%" PRIx64 "\n",
+ port_id,
+ local_conf.txmode.offloads,
+ dev_info.tx_offload_capa);
+ return -EINVAL;
+ }
+
/* Check that device supports requested rss hash functions. */
if ((dev_info.flow_type_rss_offloads |
dev_conf->rx_adv_conf.rss_conf.rss_hf) !=
@@ -1414,6 +1436,8 @@ rte_eth_rx_queue_setup(uint16_t port_id, uint16_t rx_queue_id,
struct rte_eth_dev_info dev_info;
struct rte_eth_rxconf local_conf;
void **rxq;
+ uint64_t pure_port_offload_capa;
+ uint64_t only_enabled_for_queue;
RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -EINVAL);
@@ -1504,6 +1528,68 @@ rte_eth_rx_queue_setup(uint16_t port_id, uint16_t rx_queue_id,
&local_conf.offloads);
}
+ /*
+ * The requested offloadings by application for this queue
+ * can be per-queue type or per-port type. and
+ * they must be within the device offloading capabilities.
+ */
+ if ((local_conf.offloads & dev_info.rx_offload_capa) !=
+ local_conf.offloads) {
+ RTE_PMD_DEBUG_TRACE("Ethdev port_id=%d rx_queue_id=%d "
+ "Requested offload 0x%" PRIx64 "doesn't "
+ "match per-queue capability 0x%" PRIx64
+ " in %s\n",
+ port_id,
+ rx_queue_id,
+ local_conf.offloads,
+ dev_info.rx_queue_offload_capa,
+ __func__);
+ return -EINVAL;
+ }
+
+ /*
+ * A pure per-port offloading can't be enabled for any queue
+ * if it hasn't been enabled in rte_eth_dev_configure( ).
+ *
+ * Following pure_port_offload_capa is the capabilities which
+ * can't be enabled on some queue while disabled on other queue.
+ * pure_port_offload_capa must be enabled or disabled on all
+ * queues at same time.
+ *
+ * Following only_enabled_for_queue is the offloadings which
+ * are enabled for this queue but hasn't been enabled in
+ * rte_eth_dev_configure( ).
+ */
+ pure_port_offload_capa = dev_info.rx_offload_capa ^
+ dev_info.rx_queue_offload_capa;
+ only_enabled_for_queue = (local_conf.offloads ^
+ dev->data->dev_conf.rxmode.offloads) & local_conf.offloads;
+ if (only_enabled_for_queue & pure_port_offload_capa) {
+ RTE_PMD_DEBUG_TRACE("Ethdev port_id=%d rx_queue_id=%d, only "
+ "enabled offload 0x%" PRIx64 "for this "
+ "queue haven't been enabled in "
+ "dev_configure( ), they are within "
+ "pure per-port capabilities 0x%" PRIx64
+ " in %s\n",
+ port_id,
+ rx_queue_id,
+ only_enabled_for_queue,
+ pure_port_offload_capa,
+ __func__);
+ return -EINVAL;
+ }
+
+ /*
+ * If an offloading has already been enabled in
+ * rte_eth_dev_configure(), it has been enabled on all queues,
+ * so there is no need to enable it in this queue again.
+ * The local_conf.offloads input to underlying PMD only carries
+ * those offloadings which are only enabled on this queue and
+ * not enabled on all queues.
+ * The underlying PMD must be aware of this point.
+ */
+ local_conf.offloads &= ~dev->data->dev_conf.rxmode.offloads;
+
ret = (*dev->dev_ops->rx_queue_setup)(dev, rx_queue_id, nb_rx_desc,
socket_id, &local_conf, mp);
if (!ret) {
@@ -1549,6 +1635,8 @@ rte_eth_tx_queue_setup(uint16_t port_id, uint16_t tx_queue_id,
struct rte_eth_dev_info dev_info;
struct rte_eth_txconf local_conf;
void **txq;
+ uint64_t pure_port_offload_capa;
+ uint64_t only_enabled_for_queue;
RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -EINVAL);
@@ -1612,6 +1700,68 @@ rte_eth_tx_queue_setup(uint16_t port_id, uint16_t tx_queue_id,
&local_conf.offloads);
}
+ /*
+ * The requested offloadings by application for this queue
+ * can be per-queue type or per-port type. and
+ * they must be within the device offloading capabilities.
+ */
+ if ((local_conf.offloads & dev_info.tx_offload_capa) !=
+ local_conf.offloads) {
+ RTE_PMD_DEBUG_TRACE("Ethdev port_id=%d tx_queue_id=%d "
+ "Requested offload 0x%" PRIx64 "doesn't "
+ "match per-queue capability 0x%" PRIx64
+ " in %s\n",
+ port_id,
+ tx_queue_id,
+ local_conf.offloads,
+ dev_info.tx_queue_offload_capa,
+ __func__);
+ return -EINVAL;
+ }
+
+ /*
+ * A pure per-port offloading can't be enabled for any queue
+ * if it hasn't been enabled in rte_eth_dev_configure( ).
+ *
+ * Following pure_port_offload_capa is the capabilities which
+ * can't be enabled on some queue while disabled on other queue.
+ * pure_port_offload_capa must be enabled or disabled on all
+ * queues at same time.
+ *
+ * Following only_enabled_for_queue is the offloadings which
+ * are enabled for this queue but hasn't been enabled in
+ * rte_eth_dev_configure( ).
+ */
+ pure_port_offload_capa = dev_info.tx_offload_capa ^
+ dev_info.tx_queue_offload_capa;
+ only_enabled_for_queue = (local_conf.offloads ^
+ dev->data->dev_conf.txmode.offloads) & local_conf.offloads;
+ if (only_enabled_for_queue & pure_port_offload_capa) {
+ RTE_PMD_DEBUG_TRACE("Ethdev port_id=%d tx_queue_id=%d, only "
+ "enabled offload 0x%" PRIx64 "for this "
+ "queue haven't been enabled in "
+ "dev_configure( ), they are within "
+ "pure per-port capabilities 0x%" PRIx64
+ " in %s\n",
+ port_id,
+ tx_queue_id,
+ only_enabled_for_queue,
+ pure_port_offload_capa,
+ __func__);
+ return -EINVAL;
+ }
+
+ /*
+ * If an offloading has already been enabled in
+ * rte_eth_dev_configure(), it has been enabled on all queues,
+ * so there is no need to enable it in this queue again.
+ * The local_conf.offloads input to underlying PMD only carries
+ * those offloadings which are only enabled on this queue and
+ * not enabled on all queues.
+ * The underlying PMD must be aware of this point.
+ */
+ local_conf.offloads &= ~dev->data->dev_conf.txmode.offloads;
+
return eth_err(port_id, (*dev->dev_ops->tx_queue_setup)(dev,
tx_queue_id, nb_tx_desc, socket_id, &local_conf));
}
--
2.7.5
next prev parent reply other threads:[~2018-05-04 14:21 UTC|newest]
Thread overview: 60+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-02-01 13:53 [dpdk-dev] [PATCH] ethdev: check consistency of per port offloads Wei Dai
2018-03-28 8:57 ` [dpdk-dev] [PATCH v2] ethdev: check Rx/Tx offloads Wei Dai
2018-04-13 17:31 ` Ferruh Yigit
2018-04-15 10:37 ` Thomas Monjalon
2018-04-16 3:06 ` Dai, Wei
2018-04-25 11:26 ` [dpdk-dev] [PATCH] " Wei Dai
2018-04-25 11:31 ` [dpdk-dev] [PATCH v3] " Wei Dai
2018-04-25 11:49 ` Wei Dai
2018-04-25 11:50 ` [dpdk-dev] [PATCH v4] " Wei Dai
2018-04-25 17:04 ` Ferruh Yigit
2018-04-26 7:59 ` Zhang, Qi Z
2018-04-26 8:18 ` Thomas Monjalon
2018-04-26 8:51 ` Zhang, Qi Z
2018-04-26 14:45 ` Dai, Wei
2018-04-26 14:37 ` [dpdk-dev] [PATCH v5] " Wei Dai
2018-04-26 15:50 ` Ferruh Yigit
2018-04-26 15:56 ` Thomas Monjalon
2018-04-26 15:59 ` Ferruh Yigit
2018-04-26 16:11 ` Ferruh Yigit
2018-05-03 1:30 ` [dpdk-dev] [PATCH v6] " Wei Dai
2018-05-04 11:12 ` Ferruh Yigit
2018-05-04 14:02 ` Wei Dai [this message]
2018-05-04 14:42 ` [dpdk-dev] [PATCH v7] " Ferruh Yigit
2018-05-04 14:45 ` Ferruh Yigit
2018-05-05 18:59 ` Shahaf Shuler
2018-05-07 7:15 ` Dai, Wei
2018-05-08 10:58 ` Ferruh Yigit
2018-05-08 10:05 ` [dpdk-dev] [PATCH v8] " Wei Dai
2018-05-08 10:41 ` Andrew Rybchenko
2018-05-08 11:02 ` Ferruh Yigit
2018-05-08 11:22 ` Andrew Rybchenko
2018-05-08 11:37 ` Andrew Rybchenko
2018-05-08 12:34 ` Dai, Wei
2018-05-08 12:12 ` Ferruh Yigit
2018-05-09 12:45 ` Dai, Wei
2018-05-10 0:49 ` [dpdk-dev] [PATCH v9] ethdev: new Rx/Tx offloads API Wei Dai
2018-05-10 0:56 ` [dpdk-dev] [PATCH v10] " Wei Dai
2018-05-10 1:28 ` Ferruh Yigit
2018-05-10 2:35 ` Thomas Monjalon
2018-05-10 11:27 ` Dai, Wei
2018-05-10 9:25 ` Andrew Rybchenko
2018-05-10 19:47 ` Ferruh Yigit
2018-05-10 11:30 ` [dpdk-dev] [PATCH v11] " Wei Dai
2018-05-10 11:56 ` [dpdk-dev] [PATCH v12] " Wei Dai
2018-05-10 21:39 ` Thomas Monjalon
2018-05-14 8:37 ` Thomas Monjalon
2018-05-14 11:19 ` Dai, Wei
2018-05-10 21:48 ` Ferruh Yigit
2018-05-14 12:00 ` [dpdk-dev] [PATCH v13] " Wei Dai
2018-05-14 12:54 ` Thomas Monjalon
2018-05-14 13:26 ` Dai, Wei
2018-05-14 13:20 ` [dpdk-dev] [PATCH v14] " Wei Dai
2018-05-14 14:11 ` Thomas Monjalon
2018-05-14 14:46 ` Ferruh Yigit
2018-05-10 21:08 ` [dpdk-dev] [PATCH v10] " Ferruh Yigit
2018-05-08 10:10 ` [dpdk-dev] [PATCH v8] ethdev: check Rx/Tx offloads Wei Dai
2018-05-08 17:51 ` Andrew Rybchenko
2018-05-09 2:10 ` Dai, Wei
2018-05-09 14:11 ` Ferruh Yigit
2018-05-09 22:40 ` 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=1525442529-12723-1-git-send-email-wei.dai@intel.com \
--to=wei.dai@intel.com \
--cc=dev@dpdk.org \
--cc=ferruh.yigit@intel.com \
--cc=thomas@monjalon.net \
/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 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).