All of lore.kernel.org
 help / color / mirror / Atom feed
From: Wei Dai <wei.dai@intel.com>
To: thomas@monjalon.net
Cc: dev@dpdk.org, Wei Dai <wei.dai@intel.com>
Subject: [PATCH v2] ethdev: check Rx/Tx offloads
Date: Wed, 28 Mar 2018 16:57:09 +0800	[thread overview]
Message-ID: <20180328085709.28310-1-wei.dai@intel.com> (raw)
In-Reply-To: <1517493186-6687-1-git-send-email-wei.dai@intel.com>

This patch check if a requested offloading
is supported in the device capability.
A per port offloading feature should be enabled or
disabled at same time in both rte_eth_dev_configure( )
and rte_eth_rx_queue_setup( )/rte_eth_tx_queue_setup( ).
This patch check if a per port offloading flag has
same configuration in rte_eth_dev_configure( ) and
rte_eth_rx_queue_setup( )/rte_eth_tx_queue_setup( ).
This patch can make 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>

---
v2: add offlaods checking in rte_eth_dev_configure( ).
    check if a requested offloading is supported
---
 lib/librte_ether/rte_ethdev.c | 100 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 100 insertions(+)

diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index 0590f0c..a04a705 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -1152,6 +1152,27 @@ rte_eth_dev_configure(uint16_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q,
 							ETHER_MAX_LEN;
 	}
 
+	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 "
+				    "capability 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 "
+				    "capability 0x%" PRIx64 "\n",
+				    port_id,
+				    local_conf.txmode.offloads,
+				    dev_info.tx_offload_capa);
+		return -EINVAL;
+	}
+
 	/*
 	 * Setup new number of RX/TX queues and reconfigure device.
 	 */
@@ -1404,6 +1425,50 @@ rte_eth_dev_is_removed(uint16_t port_id)
 	return ret;
 }
 
+/**
+* Check if the Rx/Tx queue offloading settings is valid
+* @param queue_offloads
+*   offloads input to rte_eth_rx_queue_setup( ) or rte_eth_tx_queue_setup( )
+* @param port_offloads
+*   Rx or Tx offloads input to rte_eth_dev_configure( )
+* @param queue_offload_capa
+*   rx_queue_offload_capa or tx_queue_offload_capa in struct rte_eth_dev_ifnfo
+*   got from rte_eth_dev_info_get( )
+* @param all_offload_capa
+*   rx_offload_capa or tx_offload_capa in struct rte_eth_dev_info
+*   got from rte_eth_dev_info_get( )
+*
+* @return
+*   Nonzero when per-queue offloading setting is valid
+*/
+static int
+rte_eth_check_queue_offloads(uint64_t queue_offloads,
+			     uint64_t port_offloads,
+			     uint64_t queue_offload_capa,
+			     uint64_t all_offload_capa)
+{
+	uint64_t pure_port_capa = all_offload_capa ^ queue_offload_capa;
+
+	if ((queue_offloads & all_offload_capa) != queue_offloads)
+		return 0;
+
+	if ((port_offloads ^ queue_offloads) & pure_port_capa)
+		return 0;
+
+	return 1;
+}
+
+static int
+rte_eth_check_rx_queue_offloads(uint64_t rx_queue_offloads,
+				const struct rte_eth_rxmode *rxmode,
+				const struct rte_eth_dev_info *dev_info)
+{
+	return rte_eth_check_queue_offloads(rx_queue_offloads,
+					    rxmode->offloads,
+					    dev_info->rx_queue_offload_capa,
+					    dev_info->rx_offload_capa);
+}
+
 int
 rte_eth_rx_queue_setup(uint16_t port_id, uint16_t rx_queue_id,
 		       uint16_t nb_rx_desc, unsigned int socket_id,
@@ -1495,6 +1560,18 @@ rte_eth_rx_queue_setup(uint16_t port_id, uint16_t rx_queue_id,
 						    &local_conf.offloads);
 	}
 
+	if (!rte_eth_check_rx_queue_offloads(local_conf.offloads,
+		&dev->data->dev_conf.rxmode, &dev_info)) {
+		RTE_PMD_DEBUG_TRACE("Ethdev port %d : Rx queue offloads ox%"
+			PRIx64 " don't match port offloads 0x%" PRIx64
+			" or supported offloads 0x%" PRIx64 "\n",
+			port_id,
+			local_conf.offloads,
+			dev->data->dev_conf.rxmode.offloads,
+			dev_info.rx_offload_capa);
+		return -ENOTSUP;
+	}
+
 	ret = (*dev->dev_ops->rx_queue_setup)(dev, rx_queue_id, nb_rx_desc,
 					      socket_id, &local_conf, mp);
 	if (!ret) {
@@ -1555,6 +1632,17 @@ rte_eth_convert_txq_offloads(const uint64_t tx_offloads, uint32_t *txq_flags)
 	*txq_flags = flags;
 }
 
+static int
+rte_eth_check_tx_queue_offloads(uint64_t tx_queue_offloads,
+				const struct rte_eth_txmode *txmode,
+				const struct rte_eth_dev_info *dev_info)
+{
+	return rte_eth_check_queue_offloads(tx_queue_offloads,
+					    txmode->offloads,
+					    dev_info->tx_queue_offload_capa,
+					    dev_info->tx_offload_capa);
+}
+
 int
 rte_eth_tx_queue_setup(uint16_t port_id, uint16_t tx_queue_id,
 		       uint16_t nb_tx_desc, unsigned int socket_id,
@@ -1622,6 +1710,18 @@ rte_eth_tx_queue_setup(uint16_t port_id, uint16_t tx_queue_id,
 					  &local_conf.offloads);
 	}
 
+	if (!rte_eth_check_tx_queue_offloads(local_conf.offloads,
+		&dev->data->dev_conf.txmode, &dev_info)) {
+		RTE_PMD_DEBUG_TRACE("Ethdev port %d : Tx queue offloads ox%"
+			PRIx64 " don't match port offloads 0x%" PRIx64
+			" or supported offloads 0x%" PRIx64 "\n",
+			port_id,
+			local_conf.offloads,
+			dev->data->dev_conf.txmode.offloads,
+			dev_info.tx_offload_capa);
+		return -ENOTSUP;
+	}
+
 	return eth_err(port_id, (*dev->dev_ops->tx_queue_setup)(dev,
 		       tx_queue_id, nb_tx_desc, socket_id, &local_conf));
 }
-- 
2.9.5

  reply	other threads:[~2018-03-28  8:57 UTC|newest]

Thread overview: 60+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-02-01 13:53 [PATCH] ethdev: check consistency of per port offloads Wei Dai
2018-03-28  8:57 ` Wei Dai [this message]
2018-04-13 17:31   ` [PATCH v2] ethdev: check Rx/Tx offloads Ferruh Yigit
2018-04-15 10:37     ` Thomas Monjalon
2018-04-16  3:06       ` Dai, Wei
2018-04-25 11:26   ` [PATCH] " Wei Dai
2018-04-25 11:31   ` [PATCH v3] " Wei Dai
2018-04-25 11:49     ` Wei Dai
2018-04-25 11:50   ` [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     ` [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       ` [PATCH v6] " Wei Dai
2018-05-04 11:12         ` Ferruh Yigit
2018-05-04 14:02         ` [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           ` [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             ` [PATCH v9] ethdev: new Rx/Tx offloads API Wei Dai
2018-05-10  0:56               ` [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                 ` [PATCH v11] " Wei Dai
2018-05-10 11:56                   ` [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                     ` [PATCH v13] " Wei Dai
2018-05-14 12:54                       ` Thomas Monjalon
2018-05-14 13:26                         ` Dai, Wei
2018-05-14 13:20                       ` [PATCH v14] " Wei Dai
2018-05-14 14:11                         ` Thomas Monjalon
2018-05-14 14:46                           ` Ferruh Yigit
2018-05-10 21:08                 ` [PATCH v10] " Ferruh Yigit
2018-05-08 10:10           ` [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=20180328085709.28310-1-wei.dai@intel.com \
    --to=wei.dai@intel.com \
    --cc=dev@dpdk.org \
    --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 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.