event/octeontx2: fix device reconfigure for single slot
authorHarman Kalra <hkalra@marvell.com>
Mon, 5 Apr 2021 16:24:15 +0000 (21:54 +0530)
committerJerin Jacob <jerinj@marvell.com>
Mon, 12 Apr 2021 07:23:34 +0000 (09:23 +0200)
When device is re-configured, memory allocated for work slot is freed
and new memory is allocated. Due to this we may loose some important
configurations/mappings done with initial work slot memory.

For example, whenever rte_event_eth_tx_adapter_queue_add is called
some important meta i.e. txq handle is stored in work slot structure.
If device gets reconfigured after this tx adaptor add, txq to work
slot mapping will be lost resulting in seg fault during packet
processing, as txq handle could not be retrieved from work slot.

Fixes: 67b5f4686459 ("event/octeontx2: add port config functions")
Cc: stable@dpdk.org
Signed-off-by: Harman Kalra <hkalra@marvell.com>
drivers/event/octeontx2/otx2_evdev.c

index 770a801..cdadbb2 100644 (file)
@@ -885,29 +885,27 @@ sso_configure_ports(const struct rte_eventdev *event_dev)
                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(ssogws_get_cookie(ws));
-                       ws = NULL;
-               }
+               } else {
+                       /* Allocate event port memory */
+                       ws = rte_zmalloc_socket("otx2_sso_ws",
+                                               sizeof(struct otx2_ssogws) +
+                                               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;
+                       }
 
-               /* Allocate event port memory */
-               ws = rte_zmalloc_socket("otx2_sso_ws",
-                                       sizeof(struct otx2_ssogws) +
-                                       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;
+                       /* First cache line is reserved for cookie */
+                       ws = (struct otx2_ssogws *)
+                               ((uint8_t *)ws + RTE_CACHE_LINE_SIZE);
                }
 
-               /* 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);