From 340d22cdd14802de3f80859a940dfa178b0de7ca Mon Sep 17 00:00:00 2001 From: Harman Kalra Date: Mon, 5 Apr 2021 21:54:15 +0530 Subject: [PATCH] event/octeontx2: fix device reconfigure for single slot 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 --- drivers/event/octeontx2/otx2_evdev.c | 34 +++++++++++++--------------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/drivers/event/octeontx2/otx2_evdev.c b/drivers/event/octeontx2/otx2_evdev.c index 770a801c4e..cdadbb2b21 100644 --- a/drivers/event/octeontx2/otx2_evdev.c +++ b/drivers/event/octeontx2/otx2_evdev.c @@ -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); -- 2.20.1