DPDK patches and discussions
 help / color / mirror / Atom feed
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>,
	Qi Zhang <qi.z.zhang@intel.com>
Subject: [dpdk-dev] [PATCH v14] ethdev: new Rx/Tx offloads API
Date: Mon, 14 May 2018 21:20:30 +0800	[thread overview]
Message-ID: <1526304030-15507-1-git-send-email-wei.dai@intel.com> (raw)
In-Reply-To: <1526299235-54090-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().
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().
If a per-queue offloading hasn't be enabled in rte_eth_dev_configure(),
it can be enabled or disabled for individual queue in
ret_eth_[rt]x_queue_setup().
A new added offloading is the one which hasn't been enabled in
rte_eth_dev_configure() and is reuqested to be enabled in
rte_eth_[rt]x_queue_setup(), it must be per-queue type,
otherwise trigger an error log.
The underlying PMD must be aware that the requested offloadings
to PMD specific queue_setup() function only carries those
new added offloadings of 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.

This patch assumes that all PMDs in 18.05-rc2 have already
converted to offload API defined in 17.11 . It also assumes
that all PMDs can return correct offloading capabilities
in rte_eth_dev_infos_get().

In the beginning of [rt]x_queue_setup() of underlying PMD,
add offloads = [rt]xconf->offloads |
dev->data->dev_conf.[rt]xmode.offloads; to keep same as offload API
defined in 17.11 to avoid upper application broken due to offload
API change.
PMD can use the info that input [rt]xconf->offloads only carry
the new added per-queue offloads to do some optimization or some
code change on base of this patch.

Signed-off-by: Wei Dai <wei.dai@intel.com>
Signed-off-by: Ferruh Yigit <ferruh.yigit@intel.com>
Signed-off-by: Qi Zhang <qi.z.zhang@intel.com>

---
v14:
rework on v13 according to feedback.
This v14 is also based on commit dc33238da4be
("app/testpmd: check if CRC strip offload supported") in
the repo dpdk-next-net.

v13:
only rework on v12 according to feedback.
This version is based on commit dc33238da4be
("app/testpmd: check if CRC strip offload supported") in
the repo dpdk-next-net.

v12:
fix coding style warning

v11:
This patch set is based on 18.05-rc2 .
document update according to feedback
revise rte_ethdev.h for doxygen

v10:
sorry, miss the code change, fix the buidling error

v9:
replace RTE_PMD_DEBUG_TRACE with ethdev_log(ERR, in ethdev
to avoid failure of application which hasn't been completely
converted to new offload API.

v8:
Revise PMD codes to comply with offload API in v7
update document

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.
---
 doc/guides/prog_guide/poll_mode_drv.rst |  6 +++---
 lib/librte_ethdev/rte_ethdev.c          | 22 ++++++++++++----------
 lib/librte_ethdev/rte_ethdev.h          | 18 +++++++++++-------
 3 files changed, 26 insertions(+), 20 deletions(-)

diff --git a/doc/guides/prog_guide/poll_mode_drv.rst b/doc/guides/prog_guide/poll_mode_drv.rst
index f4e0bcd..af82352 100644
--- a/doc/guides/prog_guide/poll_mode_drv.rst
+++ b/doc/guides/prog_guide/poll_mode_drv.rst
@@ -303,12 +303,12 @@ In the DPDK offload API, offloads are divided into per-port and per-queue offloa
 * A pure per-port offloading can't be enabled on a queue and disabled on another queue at the same time.
 * A pure per-port offloading must be enabled or disabled on all queues at the same time.
 * Any offloading is per-queue or pure per-port type, but can't be both types at same devices.
-* A per-port offloading can be enabled or disabled on all queues at the same time.
-* It is certain that both per-queue and pure per-port offloading are per-port type.
+* Port capabilities = per-queue capabilities + pure per-port capabilities.
+* Any supported offloading can be enabled on all queues.
 
 The different offloads capabilities can be queried using ``rte_eth_dev_info_get()``.
 The ``dev_info->[rt]x_queue_offload_capa`` returned from ``rte_eth_dev_info_get()`` includes all per-queue offloading capabilities.
-The ``dev_info->[rt]x_offload_capa`` returned from ``rte_eth_dev_info_get()`` includes all per-port and per-queue offloading capabilities.
+The ``dev_info->[rt]x_offload_capa`` returned from ``rte_eth_dev_info_get()`` includes all pure per-port and per-queue offloading capabilities.
 Supported offloads can be either per-port or per-queue.
 
 Offloads are enabled using the existing ``DEV_TX_OFFLOAD_*`` or ``DEV_RX_OFFLOAD_*`` flags.
diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c
index 3528ba1..b3ed821 100644
--- a/lib/librte_ethdev/rte_ethdev.c
+++ b/lib/librte_ethdev/rte_ethdev.c
@@ -1166,21 +1166,23 @@ rte_eth_dev_configure(uint16_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q,
 	     local_conf.rxmode.offloads) {
 		ethdev_log(ERR, "ethdev port_id=%d requested Rx offloads "
 				"0x%" PRIx64 " doesn't match Rx offloads "
-				"capabilities 0x%" PRIx64 " in %s( )\n",
+				"capabilities 0x%" PRIx64 " in %s()\n",
 				port_id,
 				local_conf.rxmode.offloads,
 				dev_info.rx_offload_capa,
 				__func__);
+		/* Will return -EINVAL in the next release */
 	}
 	if ((local_conf.txmode.offloads & dev_info.tx_offload_capa) !=
 	     local_conf.txmode.offloads) {
 		ethdev_log(ERR, "ethdev port_id=%d requested Tx offloads "
 				"0x%" PRIx64 " doesn't match Tx offloads "
-				"capabilities 0x%" PRIx64 " in %s( )\n",
+				"capabilities 0x%" PRIx64 " in %s()\n",
 				port_id,
 				local_conf.txmode.offloads,
 				dev_info.tx_offload_capa,
 				__func__);
+		/* Will return -EINVAL in the next release */
 	}
 
 	/* Check that device supports requested rss hash functions. */
@@ -1556,29 +1558,29 @@ rte_eth_rx_queue_setup(uint16_t port_id, uint16_t rx_queue_id,
 	 * 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;
 
 	/*
 	 * New added offloadings for this queue are those not enabled in
-	 * rte_eth_dev_configure( ) and they must be per-queue type.
+	 * rte_eth_dev_configure() and they must be per-queue type.
 	 * A pure per-port offloading can't be enabled on a queue while
 	 * disabled on another queue. A pure per-port offloading can't
 	 * be enabled for any queue as new added one if it hasn't been
-	 * enabled in rte_eth_dev_configure( ).
+	 * enabled in rte_eth_dev_configure().
 	 */
 	if ((local_conf.offloads & dev_info.rx_queue_offload_capa) !=
 	     local_conf.offloads) {
 		ethdev_log(ERR, "Ethdev port_id=%d rx_queue_id=%d, new "
 				"added offloads 0x%" PRIx64 " must be "
 				"within pre-queue offload capabilities 0x%"
-				PRIx64 " in %s( )\n",
+				PRIx64 " in %s()\n",
 				port_id,
 				rx_queue_id,
 				local_conf.offloads,
 				dev_info.rx_queue_offload_capa,
 				__func__);
+		/* Will return -EINVAL in the next release */
 	}
 
 	ret = (*dev->dev_ops->rx_queue_setup)(dev, rx_queue_id, nb_rx_desc,
@@ -1721,29 +1723,29 @@ rte_eth_tx_queue_setup(uint16_t port_id, uint16_t tx_queue_id,
 	 * 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;
 
 	/*
 	 * New added offloadings for this queue are those not enabled in
-	 * rte_eth_dev_configure( ) and they must be per-queue type.
+	 * rte_eth_dev_configure() and they must be per-queue type.
 	 * A pure per-port offloading can't be enabled on a queue while
 	 * disabled on another queue. A pure per-port offloading can't
 	 * be enabled for any queue as new added one if it hasn't been
-	 * enabled in rte_eth_dev_configure( ).
+	 * enabled in rte_eth_dev_configure().
 	 */
 	if ((local_conf.offloads & dev_info.tx_queue_offload_capa) !=
 	     local_conf.offloads) {
 		ethdev_log(ERR, "Ethdev port_id=%d tx_queue_id=%d, new "
 				"added offloads 0x%" PRIx64 " must be "
 				"within pre-queue offload capabilities 0x%"
-				PRIx64 " in %s( )\n",
+				PRIx64 " in %s()\n",
 				port_id,
 				tx_queue_id,
 				local_conf.offloads,
 				dev_info.tx_queue_offload_capa,
 				__func__);
+		/* Will return -EINVAL in the next release */
 	}
 
 	return eth_err(port_id, (*dev->dev_ops->tx_queue_setup)(dev,
diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h
index 78e12bf..6bef181 100644
--- a/lib/librte_ethdev/rte_ethdev.h
+++ b/lib/librte_ethdev/rte_ethdev.h
@@ -1067,13 +1067,13 @@ struct rte_eth_dev_info {
 	uint16_t max_vfs; /**< Maximum number of VFs. */
 	uint16_t max_vmdq_pools; /**< Maximum number of VMDq pools. */
 	uint64_t rx_offload_capa;
-	/**< All RX offload capabilities including all per queue ones */
+	/**< All RX offload capabilities including all per-queue ones */
 	uint64_t tx_offload_capa;
-	/**< All TX offload capabilities.including all per-queue ones */
+	/**< All TX offload capabilities including all per-queue ones */
 	uint64_t rx_queue_offload_capa;
-	/**< Device per queue RX offload capabilities. */
+	/**< Device per-queue RX offload capabilities. */
 	uint64_t tx_queue_offload_capa;
-	/**< Device per queue TX offload capabilities. */
+	/**< Device per-queue TX offload capabilities. */
 	uint16_t reta_size;
 	/**< Device redirection table size, the total number of entries. */
 	uint8_t hash_key_size; /**< Hash key size in bytes */
@@ -1554,9 +1554,7 @@ const char * __rte_experimental rte_eth_dev_tx_offload_name(uint64_t offload);
  *        the [rt]x_offload_capa returned from rte_eth_dev_infos_get().
  *        Any type of device supported offloading set in the input argument
  *        eth_conf->[rt]xmode.offloads to rte_eth_dev_configure() is enabled
- *        on all [RT]x queues and it can't be disabled no matter whether
- *        it is cleared or set in the input argument [rt]x_conf->offloads
- *        to rte_eth_[rt]x_queue_setup().
+ *        on all queues and it can't be disabled in rte_eth_[rt]x_queue_setup().
  *     - the Receive Side Scaling (RSS) configuration when using multiple RX
  *         queues per port.
  *
@@ -1617,6 +1615,9 @@ rte_eth_dev_is_removed(uint16_t port_id);
  *   hasn't been set in the input argument eth_conf->rxmode.offloads
  *   to rte_eth_dev_configure(), it is a new added offloading, it must be
  *   per-queue type and it is enabled for the queue.
+ *   No need to repeat any bit in rx_conf->offloads which has already been
+ *   enabled in rte_eth_dev_configure() at port level. An offloading enabled
+ *   at port level can't be disabled at queue level.
  * @param mb_pool
  *   The pointer to the memory pool from which to allocate *rte_mbuf* network
  *   memory buffers to populate each descriptor of the receive ring.
@@ -1679,6 +1680,9 @@ int rte_eth_rx_queue_setup(uint16_t port_id, uint16_t rx_queue_id,
  *     hasn't been set in the input argument eth_conf->txmode.offloads
  *     to rte_eth_dev_configure(), it is a new added offloading, it must be
  *     per-queue type and it is enabled for the queue.
+ *     No need to repeat any bit in tx_conf->offloads which has already been
+ *     enabled in rte_eth_dev_configure() at port level. An offloading enabled
+ *     at port level can't be disabled at queue level.
  *
  *     Note that setting *tx_free_thresh* or *tx_rs_thresh* value to 0 forces
  *     the transmit function to use default values.
-- 
2.7.5

  parent reply	other threads:[~2018-05-14 13:40 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         ` [dpdk-dev] [PATCH v7] " Wei Dai
2018-05-04 14:42           ` 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                       ` Wei Dai [this message]
2018-05-14 14:11                         ` [dpdk-dev] [PATCH v14] " 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=1526304030-15507-1-git-send-email-wei.dai@intel.com \
    --to=wei.dai@intel.com \
    --cc=dev@dpdk.org \
    --cc=ferruh.yigit@intel.com \
    --cc=qi.z.zhang@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).