DPDK patches and discussions
 help / color / mirror / Atom feed
From: Viacheslav Ovsiienko <viacheslavo@nvidia.com>
To: <dev@dpdk.org>
Cc: <ferruh.yigit@intel.com>, <xuemingl@nvidia.com>,
	<rasland@nvidia.com>, <matan@nvidia.com>
Subject: [PATCH] net/mlx5: fix shared Rx queue segment configuration match
Date: Wed, 24 Nov 2021 16:33:16 +0200	[thread overview]
Message-ID: <20211124143316.30449-1-viacheslavo@nvidia.com> (raw)

While joining the shared Rx queue to the existing queue group
the queue configurations is checked to be the same as it was
specified in the first group queue creation - all shared
queues should be created with identical configurations.

During the Rx queue creation the buffer split segment
configuration can be altered - the zero segment sizes are
substituted with the actual ones, inherited from the pools,
number of segments can be extended to cover the maximal
packet length, etc. It means the actual queue segment
configuration can not be used directly to match the
configuration provided in the queue setup call.

To resolve an issue we should store original parameters
in the shared queue structure and perform the check against
one these stored ones.

Fixes: 09c2555303be ("net/mlx5: support shared Rx queue")

Signed-off-by: Viacheslav Ovsiienko <viacheslavo@nvidia.com>
---
 drivers/net/mlx5/mlx5_rx.h  |  3 +++
 drivers/net/mlx5/mlx5_rxq.c | 18 ++++++++++++++----
 2 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/drivers/net/mlx5/mlx5_rx.h b/drivers/net/mlx5/mlx5_rx.h
index b19464bb37..a2dda91fc7 100644
--- a/drivers/net/mlx5/mlx5_rx.h
+++ b/drivers/net/mlx5/mlx5_rx.h
@@ -164,6 +164,9 @@ struct mlx5_rxq_ctrl {
 	uint32_t flow_mark_n; /* Number of Mark/Flag flows using this Queue. */
 	uint32_t flow_tunnels_n[MLX5_FLOW_TUNNEL]; /* Tunnels counters. */
 	uint32_t wqn; /* WQ number. */
+	uint32_t rxseg_n; /* Number of split segment descriptions. */
+	struct rte_eth_rxseg_split rxseg[MLX5_MAX_RXQ_NSEG];
+	/* Saved original buffer split segment configuration. */
 	uint16_t dump_file_n; /* Number of dump files. */
 };
 
diff --git a/drivers/net/mlx5/mlx5_rxq.c b/drivers/net/mlx5/mlx5_rxq.c
index 191f1e483f..c3ede0108f 100644
--- a/drivers/net/mlx5/mlx5_rxq.c
+++ b/drivers/net/mlx5/mlx5_rxq.c
@@ -775,11 +775,14 @@ mlx5_shared_rxq_match(struct mlx5_rxq_ctrl *rxq_ctrl, struct rte_eth_dev *dev,
 			dev->data->port_id, idx);
 		return false;
 	} else if (mp == NULL) {
+		if (conf->rx_nseg != rxq_ctrl->rxseg_n) {
+			DRV_LOG(ERR, "port %u queue index %u failed to join shared group: segment number mismatch",
+				dev->data->port_id, idx);
+			return false;
+		}
 		for (i = 0; i < conf->rx_nseg; i++) {
-			if (conf->rx_seg[i].split.mp !=
-			    rxq_ctrl->rxq.rxseg[i].mp ||
-			    conf->rx_seg[i].split.length !=
-			    rxq_ctrl->rxq.rxseg[i].length) {
+			if (memcmp(&conf->rx_seg[i].split, &rxq_ctrl->rxseg[i],
+				   sizeof(struct rte_eth_rxseg_split))) {
 				DRV_LOG(ERR, "port %u queue index %u failed to join shared group: segment %u configuration mismatch",
 					dev->data->port_id, idx, i);
 				return false;
@@ -1602,6 +1605,13 @@ mlx5_rxq_new(struct rte_eth_dev *dev, struct mlx5_rxq_priv *rxq,
 	rxq->ctrl = tmpl;
 	LIST_INSERT_HEAD(&tmpl->owners, rxq, owner_entry);
 	MLX5_ASSERT(n_seg && n_seg <= MLX5_MAX_RXQ_NSEG);
+	/*
+	 * Save the original segment confgiuration in the shared queue
+	 * descriptor for the later check on the sibling queue creation.
+	 */
+	tmpl->rxseg_n = n_seg;
+	rte_memcpy(tmpl->rxseg, qs_seg,
+		   sizeof(struct rte_eth_rxseg_split) * n_seg);
 	/*
 	 * Build the array of actual buffer offsets and lengths.
 	 * Pad with the buffers from the last memory pool if
-- 
2.18.1


             reply	other threads:[~2021-11-24 14:33 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-11-24 14:33 Viacheslav Ovsiienko [this message]
2021-11-24 16:24 ` Raslan Darawsheh

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=20211124143316.30449-1-viacheslavo@nvidia.com \
    --to=viacheslavo@nvidia.com \
    --cc=dev@dpdk.org \
    --cc=ferruh.yigit@intel.com \
    --cc=matan@nvidia.com \
    --cc=rasland@nvidia.com \
    --cc=xuemingl@nvidia.com \
    /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).