[dpdk-stable] patch 'event/octeontx2: unlink queues during port release' has been queued to stable release 19.11.6

luca.boccassi at gmail.com luca.boccassi at gmail.com
Wed Nov 25 10:02:52 CET 2020


Hi,

FYI, your patch has been queued to stable release 19.11.6

Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet.
It will be pushed if I get no objections before 11/26/20. So please
shout if anyone has objections.

Also note that after the patch there's a diff of the upstream commit vs the
patch applied to the branch. This will indicate if there was any rebasing
needed to apply to the stable branch. If there were code changes for rebasing
(ie: not only metadata diffs), please double check that the rebase was
correctly done.

Queued patches are on a temporary branch at:
https://github.com/bluca/dpdk-stable

This queued commit can be viewed at:
https://github.com/bluca/dpdk-stable/commit/fac23bf6f0a0c631f17cd71762f3b79a51d56c95

Thanks.

Luca Boccassi

---
>From fac23bf6f0a0c631f17cd71762f3b79a51d56c95 Mon Sep 17 00:00:00 2001
From: Shijith Thotton <sthotton at marvell.com>
Date: Thu, 19 Nov 2020 14:16:11 +0530
Subject: [PATCH] event/octeontx2: unlink queues during port release

[ upstream commit 8e6663b8c145a3dcbd7b298b93682814973c7fcd ]

Unlinking queues from port should be done during port release. Doing it
during device re-configuration could result in segfault as ports array
is re-allocated based on new number of ports.

Fixes: f7ac8b66b23c ("event/octeontx2: support linking queues to ports")

Signed-off-by: Shijith Thotton <sthotton at marvell.com>
Signed-off-by: Pavan Nikhilesh <pbhagavatula at marvell.com>
---
 drivers/event/octeontx2/otx2_evdev.c | 100 ++++++++++++++++-----------
 drivers/event/octeontx2/otx2_evdev.h |  12 ++++
 2 files changed, 72 insertions(+), 40 deletions(-)

diff --git a/drivers/event/octeontx2/otx2_evdev.c b/drivers/event/octeontx2/otx2_evdev.c
index f7766812bb..5bdf23c362 100644
--- a/drivers/event/octeontx2/otx2_evdev.c
+++ b/drivers/event/octeontx2/otx2_evdev.c
@@ -648,7 +648,36 @@ sso_lf_cfg(struct otx2_sso_evdev *dev, struct otx2_mbox *mbox,
 static void
 otx2_sso_port_release(void *port)
 {
-	rte_free(port);
+	struct otx2_ssogws_cookie *gws_cookie = ssogws_get_cookie(port);
+	struct otx2_sso_evdev *dev;
+	int i;
+
+	if (!gws_cookie->configured)
+		goto free;
+
+	dev = sso_pmd_priv(gws_cookie->event_dev);
+	if (dev->dual_ws) {
+		struct otx2_ssogws_dual *ws = port;
+
+		for (i = 0; i < dev->nb_event_queues; i++) {
+			sso_port_link_modify((struct otx2_ssogws *)
+					     &ws->ws_state[0], i, false);
+			sso_port_link_modify((struct otx2_ssogws *)
+					     &ws->ws_state[1], i, false);
+		}
+		memset(ws, 0, sizeof(*ws));
+	} else {
+		struct otx2_ssogws *ws = port;
+
+		for (i = 0; i < dev->nb_event_queues; i++)
+			sso_port_link_modify(ws, i, false);
+		memset(ws, 0, sizeof(*ws));
+	}
+
+	memset(gws_cookie, 0, sizeof(*gws_cookie));
+
+free:
+	rte_free(gws_cookie);
 }
 
 static void
@@ -658,33 +687,6 @@ otx2_sso_queue_release(struct rte_eventdev *event_dev, uint8_t queue_id)
 	RTE_SET_USED(queue_id);
 }
 
-static void
-sso_clr_links(const struct rte_eventdev *event_dev)
-{
-	struct otx2_sso_evdev *dev = sso_pmd_priv(event_dev);
-	int i, j;
-
-	for (i = 0; i < dev->nb_event_ports; i++) {
-		if (dev->dual_ws) {
-			struct otx2_ssogws_dual *ws;
-
-			ws = event_dev->data->ports[i];
-			for (j = 0; j < dev->nb_event_queues; j++) {
-				sso_port_link_modify((struct otx2_ssogws *)
-						&ws->ws_state[0], j, false);
-				sso_port_link_modify((struct otx2_ssogws *)
-						&ws->ws_state[1], j, false);
-			}
-		} else {
-			struct otx2_ssogws *ws;
-
-			ws = event_dev->data->ports[i];
-			for (j = 0; j < dev->nb_event_queues; j++)
-				sso_port_link_modify(ws, j, false);
-		}
-	}
-}
-
 static void
 sso_restore_links(const struct rte_eventdev *event_dev)
 {
@@ -762,6 +764,7 @@ sso_configure_dual_ports(const struct rte_eventdev *event_dev)
 	}
 
 	for (i = 0; i < dev->nb_event_ports; i++) {
+		struct otx2_ssogws_cookie *gws_cookie;
 		struct otx2_ssogws_dual *ws;
 		uintptr_t base;
 
@@ -770,14 +773,20 @@ sso_configure_dual_ports(const struct rte_eventdev *event_dev)
 		} else {
 			/* Allocate event port memory */
 			ws = rte_zmalloc_socket("otx2_sso_ws",
-					sizeof(struct otx2_ssogws_dual),
+					sizeof(struct otx2_ssogws_dual) +
+					RTE_CACHE_LINE_SIZE,
 					RTE_CACHE_LINE_SIZE,
 					event_dev->data->socket_id);
-		}
-		if (ws == NULL) {
-			otx2_err("Failed to alloc memory for port=%d", i);
-			rc = -ENOMEM;
-			break;
+			if (ws == NULL) {
+				otx2_err("Failed to alloc memory for port=%d",
+					 i);
+				rc = -ENOMEM;
+				break;
+			}
+
+			/* First cache line is reserved for cookie */
+			ws = (struct otx2_ssogws_dual *)
+				((uint8_t *)ws + RTE_CACHE_LINE_SIZE);
 		}
 
 		ws->port = i;
@@ -789,6 +798,10 @@ sso_configure_dual_ports(const struct rte_eventdev *event_dev)
 		sso_set_port_ops((struct otx2_ssogws *)&ws->ws_state[1], base);
 		vws++;
 
+		gws_cookie = ssogws_get_cookie(ws);
+		gws_cookie->event_dev = event_dev;
+		gws_cookie->configured = 1;
+
 		event_dev->data->ports[i] = ws;
 	}
 
@@ -825,19 +838,21 @@ sso_configure_ports(const struct rte_eventdev *event_dev)
 	}
 
 	for (i = 0; i < nb_lf; i++) {
+		struct otx2_ssogws_cookie *gws_cookie;
 		struct otx2_ssogws *ws;
 		uintptr_t base;
 
 		/* Free memory prior to re-allocation if needed */
 		if (event_dev->data->ports[i] != NULL) {
 			ws = event_dev->data->ports[i];
-			rte_free(ws);
+			rte_free(ssogws_get_cookie(ws));
 			ws = NULL;
 		}
 
 		/* Allocate event port memory */
 		ws = rte_zmalloc_socket("otx2_sso_ws",
-					sizeof(struct otx2_ssogws),
+					sizeof(struct otx2_ssogws) +
+					RTE_CACHE_LINE_SIZE,
 					RTE_CACHE_LINE_SIZE,
 					event_dev->data->socket_id);
 		if (ws == NULL) {
@@ -846,10 +861,18 @@ sso_configure_ports(const struct rte_eventdev *event_dev)
 			break;
 		}
 
+		/* First cache line is reserved for cookie */
+		ws = (struct otx2_ssogws *)
+			((uint8_t *)ws + RTE_CACHE_LINE_SIZE);
+
 		ws->port = i;
 		base = dev->bar2 + (RVU_BLOCK_ADDR_SSOW << 20 | i << 12);
 		sso_set_port_ops(ws, base);
 
+		gws_cookie = ssogws_get_cookie(ws);
+		gws_cookie->event_dev = event_dev;
+		gws_cookie->configured = 1;
+
 		event_dev->data->ports[i] = ws;
 	}
 
@@ -1058,11 +1081,8 @@ otx2_sso_configure(const struct rte_eventdev *event_dev)
 		return -EINVAL;
 	}
 
-	if (dev->configured) {
+	if (dev->configured)
 		sso_unregister_irqs(event_dev);
-		/* Clear any prior port-queue mapping. */
-		sso_clr_links(event_dev);
-	}
 
 	if (dev->nb_event_queues) {
 		/* Finit any previous queues. */
diff --git a/drivers/event/octeontx2/otx2_evdev.h b/drivers/event/octeontx2/otx2_evdev.h
index ef523dc9da..e134ea5ea3 100644
--- a/drivers/event/octeontx2/otx2_evdev.h
+++ b/drivers/event/octeontx2/otx2_evdev.h
@@ -212,6 +212,18 @@ sso_pmd_priv(const struct rte_eventdev *event_dev)
 	return event_dev->data->dev_private;
 }
 
+struct otx2_ssogws_cookie {
+	const struct rte_eventdev *event_dev;
+	bool configured;
+};
+
+static inline struct otx2_ssogws_cookie *
+ssogws_get_cookie(void *ws)
+{
+	return (struct otx2_ssogws_cookie *)
+		((uint8_t *)ws - RTE_CACHE_LINE_SIZE);
+}
+
 static const union mbuf_initializer mbuf_init = {
 	.fields = {
 		.data_off = RTE_PKTMBUF_HEADROOM,
-- 
2.27.0

---
  Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- -	2020-11-24 16:50:36.988893850 +0000
+++ 0010-event-octeontx2-unlink-queues-during-port-release.patch	2020-11-24 16:50:36.569496315 +0000
@@ -1 +1 @@
-From 8e6663b8c145a3dcbd7b298b93682814973c7fcd Mon Sep 17 00:00:00 2001
+From fac23bf6f0a0c631f17cd71762f3b79a51d56c95 Mon Sep 17 00:00:00 2001
@@ -5,0 +6,2 @@
+[ upstream commit 8e6663b8c145a3dcbd7b298b93682814973c7fcd ]
+
@@ -11 +12,0 @@
-Cc: stable at dpdk.org
@@ -16,4 +17,3 @@
- drivers/event/octeontx2/otx2_evdev.c       | 100 ++++++++++++---------
- drivers/event/octeontx2/otx2_evdev.h       |  12 +++
- drivers/event/octeontx2/otx2_evdev_adptr.c |  24 +++--
- 3 files changed, 89 insertions(+), 47 deletions(-)
+ drivers/event/octeontx2/otx2_evdev.c | 100 ++++++++++++++++-----------
+ drivers/event/octeontx2/otx2_evdev.h |  12 ++++
+ 2 files changed, 72 insertions(+), 40 deletions(-)
@@ -22 +22 @@
-index c1a5916cd2..0fe014c24a 100644
+index f7766812bb..5bdf23c362 100644
@@ -25 +25 @@
-@@ -689,7 +689,36 @@ sso_lf_cfg(struct otx2_sso_evdev *dev, struct otx2_mbox *mbox,
+@@ -648,7 +648,36 @@ sso_lf_cfg(struct otx2_sso_evdev *dev, struct otx2_mbox *mbox,
@@ -63 +63 @@
-@@ -699,33 +728,6 @@ otx2_sso_queue_release(struct rte_eventdev *event_dev, uint8_t queue_id)
+@@ -658,33 +687,6 @@ otx2_sso_queue_release(struct rte_eventdev *event_dev, uint8_t queue_id)
@@ -97 +97 @@
-@@ -803,6 +805,7 @@ sso_configure_dual_ports(const struct rte_eventdev *event_dev)
+@@ -762,6 +764,7 @@ sso_configure_dual_ports(const struct rte_eventdev *event_dev)
@@ -105 +105 @@
-@@ -811,14 +814,20 @@ sso_configure_dual_ports(const struct rte_eventdev *event_dev)
+@@ -770,14 +773,20 @@ sso_configure_dual_ports(const struct rte_eventdev *event_dev)
@@ -132 +132 @@
-@@ -830,6 +839,10 @@ sso_configure_dual_ports(const struct rte_eventdev *event_dev)
+@@ -789,6 +798,10 @@ sso_configure_dual_ports(const struct rte_eventdev *event_dev)
@@ -143 +143 @@
-@@ -866,19 +879,21 @@ sso_configure_ports(const struct rte_eventdev *event_dev)
+@@ -825,19 +838,21 @@ sso_configure_ports(const struct rte_eventdev *event_dev)
@@ -167 +167 @@
-@@ -887,10 +902,18 @@ sso_configure_ports(const struct rte_eventdev *event_dev)
+@@ -846,10 +861,18 @@ sso_configure_ports(const struct rte_eventdev *event_dev)
@@ -186 +186 @@
-@@ -1099,11 +1122,8 @@ otx2_sso_configure(const struct rte_eventdev *event_dev)
+@@ -1058,11 +1081,8 @@ otx2_sso_configure(const struct rte_eventdev *event_dev)
@@ -200 +200 @@
-index d0f5b3fcf0..0513cb81c9 100644
+index ef523dc9da..e134ea5ea3 100644
@@ -203 +203 @@
-@@ -217,6 +217,18 @@ sso_pmd_priv(const struct rte_eventdev *event_dev)
+@@ -212,6 +212,18 @@ sso_pmd_priv(const struct rte_eventdev *event_dev)
@@ -222,55 +221,0 @@
-diff --git a/drivers/event/octeontx2/otx2_evdev_adptr.c b/drivers/event/octeontx2/otx2_evdev_adptr.c
-index 0a5d7924ad..d69f269df6 100644
---- a/drivers/event/octeontx2/otx2_evdev_adptr.c
-+++ b/drivers/event/octeontx2/otx2_evdev_adptr.c
-@@ -453,9 +453,10 @@ sso_add_tx_queue_data(const struct rte_eventdev *event_dev,
- 			struct otx2_ssogws_dual *dws;
- 
- 			old_dws = event_dev->data->ports[i];
--			dws = rte_realloc_socket(old_dws,
-+			dws = rte_realloc_socket(ssogws_get_cookie(old_dws),
- 						 sizeof(struct otx2_ssogws_dual)
--						 + (sizeof(uint64_t) *
-+						 + RTE_CACHE_LINE_SIZE +
-+						 (sizeof(uint64_t) *
- 						    (dev->max_port_id + 1) *
- 						    RTE_MAX_QUEUES_PER_PORT),
- 						 RTE_CACHE_LINE_SIZE,
-@@ -463,6 +464,10 @@ sso_add_tx_queue_data(const struct rte_eventdev *event_dev,
- 			if (dws == NULL)
- 				return -ENOMEM;
- 
-+			/* First cache line is reserved for cookie */
-+			dws = (struct otx2_ssogws_dual *)
-+				((uint8_t *)dws + RTE_CACHE_LINE_SIZE);
-+
- 			((uint64_t (*)[RTE_MAX_QUEUES_PER_PORT]
- 			 )&dws->tx_adptr_data)[eth_port_id][tx_queue_id] =
- 				(uint64_t)txq;
-@@ -472,16 +477,21 @@ sso_add_tx_queue_data(const struct rte_eventdev *event_dev,
- 			struct otx2_ssogws *ws;
- 
- 			old_ws = event_dev->data->ports[i];
--			ws = rte_realloc_socket(old_ws,
--						sizeof(struct otx2_ssogws_dual)
--						+ (sizeof(uint64_t) *
--						   (dev->max_port_id + 1) *
--						   RTE_MAX_QUEUES_PER_PORT),
-+			ws = rte_realloc_socket(ssogws_get_cookie(old_ws),
-+						sizeof(struct otx2_ssogws) +
-+						RTE_CACHE_LINE_SIZE +
-+						(sizeof(uint64_t) *
-+						 (dev->max_port_id + 1) *
-+						 RTE_MAX_QUEUES_PER_PORT),
- 						RTE_CACHE_LINE_SIZE,
- 						event_dev->data->socket_id);
- 			if (ws == NULL)
- 				return -ENOMEM;
- 
-+			/* First cache line is reserved for cookie */
-+			ws = (struct otx2_ssogws *)
-+				((uint8_t *)ws + RTE_CACHE_LINE_SIZE);
-+
- 			((uint64_t (*)[RTE_MAX_QUEUES_PER_PORT]
- 			 )&ws->tx_adptr_data)[eth_port_id][tx_queue_id] =
- 				(uint64_t)txq;


More information about the stable mailing list