patches for DPDK stable branches
 help / color / mirror / Atom feed
* [dpdk-stable] [PATCH] event/octeontx2: unlink queues during port release
@ 2020-11-18  8:54 Shijith Thotton
  2020-11-19  8:46 ` [dpdk-stable] [PATCH v2] " Shijith Thotton
  0 siblings, 1 reply; 3+ messages in thread
From: Shijith Thotton @ 2020-11-18  8:54 UTC (permalink / raw)
  To: jerinj; +Cc: dev, Shijith Thotton, stable, Pavan Nikhilesh

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")
Cc: stable@dpdk.org

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

diff --git a/drivers/event/octeontx2/otx2_evdev.c b/drivers/event/octeontx2/otx2_evdev.c
index b31c26e95..ed29b8325 100644
--- a/drivers/event/octeontx2/otx2_evdev.c
+++ b/drivers/event/octeontx2/otx2_evdev.c
@@ -689,7 +689,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
@@ -699,33 +728,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)
 {
@@ -803,6 +805,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;
 
@@ -811,14 +814,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 reserved for cookie */
+			ws = (struct otx2_ssogws_dual *)
+				((uint8_t *)ws + RTE_CACHE_LINE_SIZE);
 		}
 
 		ws->port = i;
@@ -830,6 +839,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;
 	}
 
@@ -866,6 +879,7 @@ 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;
 
@@ -878,7 +892,8 @@ sso_configure_ports(const struct rte_eventdev *event_dev)
 
 		/* 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) {
@@ -887,10 +902,18 @@ sso_configure_ports(const struct rte_eventdev *event_dev)
 			break;
 		}
 
+		/* First cache line 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;
 	}
 
@@ -1099,11 +1122,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 547e29d4a..116f953f5 100644
--- a/drivers/event/octeontx2/otx2_evdev.h
+++ b/drivers/event/octeontx2/otx2_evdev.h
@@ -217,6 +217,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.25.1


^ permalink raw reply	[flat|nested] 3+ messages in thread

* [dpdk-stable] [PATCH v2] event/octeontx2: unlink queues during port release
  2020-11-18  8:54 [dpdk-stable] [PATCH] event/octeontx2: unlink queues during port release Shijith Thotton
@ 2020-11-19  8:46 ` Shijith Thotton
  2020-11-20 12:26   ` [dpdk-stable] [dpdk-dev] " Jerin Jacob
  0 siblings, 1 reply; 3+ messages in thread
From: Shijith Thotton @ 2020-11-19  8:46 UTC (permalink / raw)
  To: jerinj; +Cc: dev, Shijith Thotton, stable, Pavan Nikhilesh

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")
Cc: stable@dpdk.org

Signed-off-by: Shijith Thotton <sthotton@marvell.com>
Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
---
v2:
* Took care of cookie during single workslot free and re-allocation.

 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(-)

diff --git a/drivers/event/octeontx2/otx2_evdev.c b/drivers/event/octeontx2/otx2_evdev.c
index b31c26e95..de9e394a4 100644
--- a/drivers/event/octeontx2/otx2_evdev.c
+++ b/drivers/event/octeontx2/otx2_evdev.c
@@ -689,7 +689,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
@@ -699,33 +728,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)
 {
@@ -803,6 +805,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;
 
@@ -811,14 +814,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;
@@ -830,6 +839,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;
 	}
 
@@ -866,19 +879,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) {
@@ -887,10 +902,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;
 	}
 
@@ -1099,11 +1122,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 547e29d4a..116f953f5 100644
--- a/drivers/event/octeontx2/otx2_evdev.h
+++ b/drivers/event/octeontx2/otx2_evdev.h
@@ -217,6 +217,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,
diff --git a/drivers/event/octeontx2/otx2_evdev_adptr.c b/drivers/event/octeontx2/otx2_evdev_adptr.c
index 0a5d7924a..d69f269df 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;
-- 
2.25.1


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [dpdk-stable] [dpdk-dev] [PATCH v2] event/octeontx2: unlink queues during port release
  2020-11-19  8:46 ` [dpdk-stable] [PATCH v2] " Shijith Thotton
@ 2020-11-20 12:26   ` Jerin Jacob
  0 siblings, 0 replies; 3+ messages in thread
From: Jerin Jacob @ 2020-11-20 12:26 UTC (permalink / raw)
  To: Shijith Thotton; +Cc: Jerin Jacob, dpdk-dev, dpdk stable, Pavan Nikhilesh

On Thu, Nov 19, 2020 at 2:17 PM Shijith Thotton <sthotton@marvell.com> wrote:
>
> 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")
> Cc: stable@dpdk.org
>
> Signed-off-by: Shijith Thotton <sthotton@marvell.com>
> Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>

Applied to dpdk-next-net-eventdev/for-main. Thanks


> ---
> v2:
> * Took care of cookie during single workslot free and re-allocation.
>
>  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(-)
>
> diff --git a/drivers/event/octeontx2/otx2_evdev.c b/drivers/event/octeontx2/otx2_evdev.c
> index b31c26e95..de9e394a4 100644
> --- a/drivers/event/octeontx2/otx2_evdev.c
> +++ b/drivers/event/octeontx2/otx2_evdev.c
> @@ -689,7 +689,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
> @@ -699,33 +728,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)
>  {
> @@ -803,6 +805,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;
>
> @@ -811,14 +814,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;
> @@ -830,6 +839,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;
>         }
>
> @@ -866,19 +879,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) {
> @@ -887,10 +902,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;
>         }
>
> @@ -1099,11 +1122,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 547e29d4a..116f953f5 100644
> --- a/drivers/event/octeontx2/otx2_evdev.h
> +++ b/drivers/event/octeontx2/otx2_evdev.h
> @@ -217,6 +217,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,
> diff --git a/drivers/event/octeontx2/otx2_evdev_adptr.c b/drivers/event/octeontx2/otx2_evdev_adptr.c
> index 0a5d7924a..d69f269df 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;
> --
> 2.25.1
>

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2020-11-20 12:26 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-11-18  8:54 [dpdk-stable] [PATCH] event/octeontx2: unlink queues during port release Shijith Thotton
2020-11-19  8:46 ` [dpdk-stable] [PATCH v2] " Shijith Thotton
2020-11-20 12:26   ` [dpdk-stable] [dpdk-dev] " Jerin Jacob

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).