DPDK patches and discussions
 help / color / mirror / Atom feed
From: Helin Zhang <helin.zhang@intel.com>
To: dev@dpdk.org
Subject: [dpdk-dev] [PATCH v2 04/13] ethdev: support of multiple sizes of redirection table
Date: Thu, 25 Sep 2014 16:40:18 +0800
Message-ID: <1411634427-746-5-git-send-email-helin.zhang@intel.com> (raw)
In-Reply-To: <1411634427-746-1-git-send-email-helin.zhang@intel.com>

To support possible different sizes of redirection table,
structures and functions need to be redefined. In detail,
* 'struct rte_eth_rss_reta' has been redefined.
* 'uint16_t reta_size' has been added into
  'struct rte_eth_dev_info'.
* Updating/querying reta have been reimplemented with one
  more parameter of redirection table size.

v2 changes:
* Put changes for supporting multiple sizes of reta in
  ethdev into a single patch.

Signed-off-by: Helin Zhang <helin.zhang@intel.com>
Reviewed-by: Jijiang Liu <jijiang.liu@intel.com>
Reviewed-by: Cunming Liang <cunming.liang@intel.com>
Reviewed-by: Jingjing Wu <jingjing.wu@intel.com>
---
 lib/librte_ether/rte_ethdev.c | 116 ++++++++++++++++++++++++++----------------
 lib/librte_ether/rte_ethdev.h |  43 ++++++++++------
 2 files changed, 99 insertions(+), 60 deletions(-)

diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index b71b679..8c1cb25 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -1917,78 +1917,104 @@ rte_eth_dev_priority_flow_ctrl_set(uint8_t port_id, struct rte_eth_pfc_conf *pfc
 	return (-ENOTSUP);
 }
 
-int
-rte_eth_dev_rss_reta_update(uint8_t port_id, struct rte_eth_rss_reta *reta_conf)
+static inline int
+rte_eth_check_reta_mask(struct rte_eth_rss_reta_entry64 *reta_conf,
+			uint16_t reta_size)
 {
-	struct rte_eth_dev *dev;
-	uint16_t max_rxq;
-	uint8_t i,j;
+	uint16_t i, num = reta_size / RTE_BIT_WIDTH_64;
 
-	if (port_id >= nb_ports) {
-		PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
-		return (-ENODEV);
-	}
+	if (!reta_conf)
+		return -EINVAL;
 
-	/* Invalid mask bit(s) setting */
-	if ((reta_conf->mask_lo == 0) && (reta_conf->mask_hi == 0)) {
-		PMD_DEBUG_TRACE("Invalid update mask bits for port=%d\n",port_id);
-		return (-EINVAL);
+	for (i = 0; i < num; i++) {
+		if (reta_conf[i].mask)
+			return 0;
 	}
 
-	dev = &rte_eth_devices[port_id];
-	max_rxq = (dev->data->nb_rx_queues <= ETH_RSS_RETA_MAX_QUEUE) ?
-		dev->data->nb_rx_queues : ETH_RSS_RETA_MAX_QUEUE;
-	if (reta_conf->mask_lo != 0) {
-		for (i = 0; i < ETH_RSS_RETA_NUM_ENTRIES/2; i++) {
-			if ((reta_conf->mask_lo & (1ULL << i)) &&
-				(reta_conf->reta[i] >= max_rxq)) {
-				PMD_DEBUG_TRACE("RETA hash index output"
-					"configration for port=%d,invalid"
-					"queue=%d\n",port_id,reta_conf->reta[i]);
+	return -EINVAL;
+}
 
-				return (-EINVAL);
-			}
+static inline int
+rte_eth_check_reta_entry(struct rte_eth_rss_reta_entry64 *reta_conf,
+			 uint16_t reta_size,
+			 uint8_t max_rxq)
+{
+	uint16_t i, idx, shift;
+
+	if (!reta_conf)
+		return -EINVAL;
+
+	if (max_rxq == 0) {
+		PMD_DEBUG_TRACE("No receive queue is available\n");
+		return -EINVAL;
+	}
+
+	for (i = 0; i < reta_size; i++) {
+		idx = i / RTE_BIT_WIDTH_64;
+		shift = i % RTE_BIT_WIDTH_64;
+		if ((reta_conf[idx].mask & (0x1 << shift)) &&
+			(reta_conf[idx].reta[shift] >= max_rxq)) {
+			PMD_DEBUG_TRACE("reta_conf[%u]->reta[%u]: %u exceeds "
+				"the maximum rxq index: %u\n", idx, shift,
+				reta_conf[idx].reta[shift], max_rxq);
+			return -EINVAL;
 		}
 	}
 
-	if (reta_conf->mask_hi != 0) {
-		for (i = 0; i< ETH_RSS_RETA_NUM_ENTRIES/2; i++) {
-			j = (uint8_t)(i + ETH_RSS_RETA_NUM_ENTRIES/2);
+	return 0;
+}
 
-			/* Check if the max entry >= 128 */
-			if ((reta_conf->mask_hi & (1ULL << i)) &&
-				(reta_conf->reta[j] >= max_rxq)) {
-				PMD_DEBUG_TRACE("RETA hash index output"
-					"configration for port=%d,invalid"
-					"queue=%d\n",port_id,reta_conf->reta[j]);
+int
+rte_eth_dev_rss_reta_update(uint8_t port_id,
+			    struct rte_eth_rss_reta_entry64 *reta_conf,
+			    uint16_t reta_size)
+{
+	struct rte_eth_dev *dev;
+	int ret;
 
-				return (-EINVAL);
-			}
-		}
+	if (port_id >= nb_ports) {
+		PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
+		return -ENODEV;
 	}
 
+	/* Check mask bits */
+	ret = rte_eth_check_reta_mask(reta_conf, reta_size);
+	if (ret < 0)
+		return ret;
+
+	dev = &rte_eth_devices[port_id];
+
+	/* Check entry value */
+	ret = rte_eth_check_reta_entry(reta_conf, reta_size,
+				dev->data->nb_rx_queues);
+	if (ret < 0)
+		return ret;
+
 	FUNC_PTR_OR_ERR_RET(*dev->dev_ops->reta_update, -ENOTSUP);
-	return (*dev->dev_ops->reta_update)(dev, reta_conf);
+	return (*dev->dev_ops->reta_update)(dev, reta_conf, reta_size);
 }
 
 int
-rte_eth_dev_rss_reta_query(uint8_t port_id, struct rte_eth_rss_reta *reta_conf)
+rte_eth_dev_rss_reta_query(uint8_t port_id,
+			   struct rte_eth_rss_reta_entry64 *reta_conf,
+			   uint16_t reta_size)
 {
 	struct rte_eth_dev *dev;
+	int ret;
 
 	if (port_id >= nb_ports) {
 		PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
-		return (-ENODEV);
+		return -ENODEV;
 	}
 
-	if((reta_conf->mask_lo == 0) && (reta_conf->mask_hi == 0)) {
-		PMD_DEBUG_TRACE("Invalid update mask bits for the port=%d\n",port_id);
-		return (-EINVAL);
-	}
+	/* Check mask bits */
+	ret = rte_eth_check_reta_mask(reta_conf, reta_size);
+	if (ret < 0)
+		return ret;
 
 	dev = &rte_eth_devices[port_id];
 	FUNC_PTR_OR_ERR_RET(*dev->dev_ops->reta_query, -ENOTSUP);
-	return (*dev->dev_ops->reta_query)(dev, reta_conf);
+	return (*dev->dev_ops->reta_query)(dev, reta_conf, reta_size);
 }
 
 int
diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
index 2c5ab13..9ed4437 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -426,8 +426,11 @@ struct rte_eth_rss_conf {
 		ETH_RSS_L2_PAYLOAD)
 
 /* Definitions used for redirection table entry size */
-#define ETH_RSS_RETA_NUM_ENTRIES 128
-#define ETH_RSS_RETA_MAX_QUEUE   16
+#define ETH_RSS_RETA_SIZE_64  64
+#define ETH_RSS_RETA_SIZE_128 128
+#define ETH_RSS_RETA_SIZE_512 512
+
+#define RTE_BIT_WIDTH_64 (CHAR_BIT * sizeof(uint64_t))
 
 /* Definitions used for VMDQ and DCB functionality */
 #define ETH_VMDQ_MAX_VLAN_FILTERS   64 /**< Maximum nb. of VMDQ vlan filters. */
@@ -491,15 +494,15 @@ struct rte_eth_vmdq_mirror_conf {
 };
 
 /**
- * A structure used to configure Redirection Table of  the Receive Side
- * Scaling (RSS) feature of an Ethernet port.
+ * A structure used to configure 64 entries of Redirection Table of the
+ * Receive Side Scaling (RSS) feature of an Ethernet port. To configure
+ * more than 64 entries supported by hardware, an array of this structure
+ * is needed.
  */
-struct rte_eth_rss_reta {
-	/** First 64 mask bits indicate which entry(s) need to updated/queried. */
-	uint64_t mask_lo;
-	/** Second 64 mask bits indicate which entry(s) need to updated/queried. */
-	uint64_t mask_hi;
-	uint8_t reta[ETH_RSS_RETA_NUM_ENTRIES];  /**< 128 RETA entries*/
+struct rte_eth_rss_reta_entry64 {
+	uint64_t mask;
+	/**< Mask bits indicate which entries need to be updated/queried. */
+	uint8_t reta[RTE_BIT_WIDTH_64]; /**< 64 redirection table entries. */
 };
 
 /**
@@ -906,6 +909,8 @@ struct rte_eth_dev_info {
 	uint16_t max_vmdq_pools; /**< Maximum number of VMDq pools. */
 	uint32_t rx_offload_capa; /**< Device RX offload capabilities. */
 	uint32_t tx_offload_capa; /**< Device TX offload capabilities. */
+	uint16_t reta_size;
+	/**< Device redirection table size, the total number of entries. */
 };
 
 /** Maximum name length for extended statistics counters */
@@ -1180,11 +1185,13 @@ typedef int (*priority_flow_ctrl_set_t)(struct rte_eth_dev *dev,
 /**< @internal Setup priority flow control parameter on an Ethernet device */
 
 typedef int (*reta_update_t)(struct rte_eth_dev *dev,
-				struct rte_eth_rss_reta *reta_conf);
+			     struct rte_eth_rss_reta_entry64 *reta_conf,
+			     uint16_t reta_size);
 /**< @internal Update RSS redirection table on an Ethernet device */
 
 typedef int (*reta_query_t)(struct rte_eth_dev *dev,
-				struct rte_eth_rss_reta *reta_conf);
+			    struct rte_eth_rss_reta_entry64 *reta_conf,
+			    uint16_t reta_size);
 /**< @internal Query RSS redirection table on an Ethernet device */
 
 typedef int (*rss_hash_update_t)(struct rte_eth_dev *dev,
@@ -2896,14 +2903,17 @@ int rte_eth_dev_mac_addr_remove(uint8_t port, struct ether_addr *mac_addr);
  * @param port
  *   The port identifier of the Ethernet device.
  * @param reta_conf
- *    RETA to update.
+ *   RETA to update.
+ * @param reta_size
+ *   Redirection table size.
  * @return
  *   - (0) if successful.
  *   - (-ENOTSUP) if hardware doesn't support.
  *   - (-EINVAL) if bad parameter.
  */
 int rte_eth_dev_rss_reta_update(uint8_t port,
-			struct rte_eth_rss_reta *reta_conf);
+				struct rte_eth_rss_reta_entry64 *reta_conf,
+				uint16_t reta_size);
 
  /**
  * Query Redirection Table(RETA) of Receive Side Scaling of Ethernet device.
@@ -2912,13 +2922,16 @@ int rte_eth_dev_rss_reta_update(uint8_t port,
  *   The port identifier of the Ethernet device.
  * @param reta_conf
  *   RETA to query.
+ * @param reta_size
+ *   Redirection table size.
  * @return
  *   - (0) if successful.
  *   - (-ENOTSUP) if hardware doesn't support.
  *   - (-EINVAL) if bad parameter.
  */
 int rte_eth_dev_rss_reta_query(uint8_t port,
-			struct rte_eth_rss_reta *reta_conf);
+			       struct rte_eth_rss_reta_entry64 *reta_conf,
+			       uint16_t reta_size);
 
  /**
  * Updates unicast hash table for receiving packet with the given destination
-- 
1.8.1.4

  parent reply	other threads:[~2014-09-25  8:35 UTC|newest]

Thread overview: 82+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-09-25  8:40 [dpdk-dev] [PATCH v2 00/13] " Helin Zhang
2014-09-25  8:40 ` [dpdk-dev] [PATCH v2 01/13] app/testpmd: code style fix Helin Zhang
2014-09-25  8:40 ` [dpdk-dev] [PATCH v2 02/13] i40evf: " Helin Zhang
2014-09-25  8:40 ` [dpdk-dev] [PATCH v2 03/13] ethdev: add more annotation Helin Zhang
2014-10-21 20:38   ` Thomas Monjalon
2014-10-21 22:20     ` Zhang, Helin
2014-09-25  8:40 ` Helin Zhang [this message]
2014-10-21 20:53   ` [dpdk-dev] [PATCH v2 04/13] ethdev: support of multiple sizes of redirection table Thomas Monjalon
2014-10-28  0:33     ` Zhang, Helin
2014-10-28 10:10       ` Thomas Monjalon
2014-10-28 10:18         ` Richardson, Bruce
2014-10-28 13:20           ` Zhang, Helin
2014-10-28 14:22             ` Thomas Monjalon
2014-10-29  8:18               ` Zhang, Helin
2014-10-28 12:00         ` Zhang, Helin
2014-10-28 12:13           ` Thomas Monjalon
2014-10-28 12:36             ` Zhang, Helin
2014-10-29  8:24           ` Zhang, Helin
2014-10-29 10:00             ` Thomas Monjalon
2014-09-25  8:40 ` [dpdk-dev] [PATCH v2 05/13] igb: add new function for VF ops of 'dev_infos_get' Helin Zhang
2014-09-25  8:40 ` [dpdk-dev] [PATCH v2 06/13] igb: rework of updating/querying reta Helin Zhang
2014-09-25  8:40 ` [dpdk-dev] [PATCH v2 07/13] ixgbe: add new function for VF ops of 'dev_infos_get' Helin Zhang
2014-09-25  8:40 ` [dpdk-dev] [PATCH v2 08/13] ixgbe: rework of updating/querying reta Helin Zhang
2014-09-25  8:40 ` [dpdk-dev] [PATCH v2 09/13] i40e: support of setting hash lookup table size Helin Zhang
2014-09-25  8:40 ` [dpdk-dev] [PATCH v2 10/13] i40e: support of getting redirection " Helin Zhang
2014-09-25  8:40 ` [dpdk-dev] [PATCH v2 11/13] i40e: rework of updating/querying reta Helin Zhang
2014-09-25  8:40 ` [dpdk-dev] [PATCH v2 12/13] i40evf: support of updating/querying redirection table Helin Zhang
2014-09-25  8:40 ` [dpdk-dev] [PATCH v2 13/13] app/testpmd: rework of commands for updating/querying reta Helin Zhang
2014-10-10  3:11 ` [dpdk-dev] [PATCH v2 00/13] support of multiple sizes of redirection table Liang, Cunming
2014-10-22 11:53 ` [dpdk-dev] [PATCH v3 0/8] " Helin Zhang
2014-10-22 11:53   ` [dpdk-dev] [PATCH v3 1/8] app/testpmd: code style fix Helin Zhang
2014-10-22 11:53   ` [dpdk-dev] [PATCH v3 2/8] i40evf: " Helin Zhang
2014-10-22 11:53   ` [dpdk-dev] [PATCH v3 3/8] i40e: support of setting hash lookup table size Helin Zhang
2014-10-27 14:13     ` Thomas Monjalon
2014-10-27 20:21       ` Matthew Hall
2014-10-27 21:41         ` Thomas Monjalon
2014-10-22 11:53   ` [dpdk-dev] [PATCH v3 4/8] igb: implement ops of 'dev_infos_get' for PF and VF respectively Helin Zhang
2014-10-22 11:53   ` [dpdk-dev] [PATCH v3 5/8] ixgbe: " Helin Zhang
2014-10-22 11:53   ` [dpdk-dev] [PATCH v3 6/8] i40e: rework of ops of 'dev_infos_get' for both PF and VF Helin Zhang
2014-10-22 11:53   ` [dpdk-dev] [PATCH v3 7/8] ethdev: support of multiple sizes of redirection table Helin Zhang
2014-10-27 14:23     ` Thomas Monjalon
2014-10-28  0:37       ` Zhang, Helin
2014-10-28 10:04         ` Thomas Monjalon
2014-10-31  1:39           ` Zhang, Helin
2014-10-31  8:46             ` Thomas Monjalon
2014-10-22 11:53   ` [dpdk-dev] [PATCH v3 8/8] i40evf: support of updating/querying " Helin Zhang
2014-10-31  9:03   ` [dpdk-dev] [PATCH v4 0/8] support of multiple sizes of " Helin Zhang
2014-10-31  9:03     ` [dpdk-dev] [PATCH v4 1/8] app/testpmd: code style fix Helin Zhang
2014-10-31  9:03     ` [dpdk-dev] [PATCH v4 2/8] i40evf: " Helin Zhang
2014-10-31  9:03     ` [dpdk-dev] [PATCH v4 3/8] i40e: support of setting hash lookup table size Helin Zhang
2014-10-31  9:03     ` [dpdk-dev] [PATCH v4 4/8] igb: implement ops of 'dev_infos_get' for PF and VF respectively Helin Zhang
2014-10-31  9:03     ` [dpdk-dev] [PATCH v4 5/8] ixgbe: " Helin Zhang
2014-10-31  9:03     ` [dpdk-dev] [PATCH v4 6/8] i40e: rework of ops of 'dev_infos_get' for both PF and VF Helin Zhang
2014-10-31  9:03     ` [dpdk-dev] [PATCH v4 7/8] ethdev: support of multiple sizes of redirection table Helin Zhang
2014-11-05 20:52       ` Thomas Monjalon
2014-11-06  1:02         ` Zhang, Helin
2014-11-06  8:33           ` Thomas Monjalon
2014-11-06  8:52             ` Zhang, Helin
2014-10-31  9:03     ` [dpdk-dev] [PATCH v4 8/8] i40evf: support of updating/querying " Helin Zhang
2014-11-06 14:25     ` [dpdk-dev] [PATCH v5 0/8] support of multiple sizes of " Helin Zhang
2014-11-06 14:25       ` [dpdk-dev] [PATCH v5 1/8] app/testpmd: code style fix Helin Zhang
2014-11-06 14:25       ` [dpdk-dev] [PATCH v5 2/8] i40evf: " Helin Zhang
2014-11-06 14:25       ` [dpdk-dev] [PATCH v5 3/8] i40e: support of setting hash lookup table size Helin Zhang
2014-11-06 14:25       ` [dpdk-dev] [PATCH v5 4/8] igb: implement ops of 'dev_infos_get' for PF and VF respectively Helin Zhang
2014-11-06 14:25       ` [dpdk-dev] [PATCH v5 5/8] ixgbe: " Helin Zhang
2014-11-06 14:25       ` [dpdk-dev] [PATCH v5 6/8] i40e: rework of ops of 'dev_infos_get' for both PF and VF Helin Zhang
2014-11-06 14:25       ` [dpdk-dev] [PATCH v5 7/8] ethdev: support of multiple sizes of redirection table Helin Zhang
2014-11-06 14:25       ` [dpdk-dev] [PATCH v5 8/8] i40evf: support of updating/querying " Helin Zhang
2014-11-15 16:03       ` [dpdk-dev] [PATCH v6 0/8] support of multiple sizes of " Helin Zhang
2014-11-15 16:03         ` [dpdk-dev] [PATCH v6 1/8] app/testpmd: code style fix Helin Zhang
2014-11-15 16:03         ` [dpdk-dev] [PATCH v6 2/8] i40evf: " Helin Zhang
2014-11-15 16:03         ` [dpdk-dev] [PATCH v6 3/8] i40e: support of setting hash lookup table size Helin Zhang
2014-11-15 16:03         ` [dpdk-dev] [PATCH v6 4/8] igb: implement ops of 'dev_infos_get' for PF and VF respectively Helin Zhang
2014-11-15 16:03         ` [dpdk-dev] [PATCH v6 5/8] ixgbe: " Helin Zhang
2014-11-15 16:03         ` [dpdk-dev] [PATCH v6 6/8] i40e: rework of ops of 'dev_infos_get' for both PF and VF Helin Zhang
2014-11-15 16:03         ` [dpdk-dev] [PATCH v6 7/8] ethdev: support of multiple sizes of redirection table Helin Zhang
2014-11-15 16:03         ` [dpdk-dev] [PATCH v6 8/8] i40evf: support of updating/querying " Helin Zhang
2014-11-24 22:20           ` Thomas Monjalon
2014-11-25  0:28             ` Zhang, Helin
2014-11-17 13:39         ` [dpdk-dev] [PATCH v6 0/8] support of multiple sizes of " Ananyev, Konstantin
2014-11-24 22:00           ` Thomas Monjalon
2014-11-19  9:28         ` Chen, Erlu

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=1411634427-746-5-git-send-email-helin.zhang@intel.com \
    --to=helin.zhang@intel.com \
    --cc=dev@dpdk.org \
    /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

DPDK patches and discussions

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://inbox.dpdk.org/dev/0 dev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 dev dev/ https://inbox.dpdk.org/dev \
		dev@dpdk.org
	public-inbox-index dev

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://inbox.dpdk.org/inbox.dpdk.dev


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git