[dpdk-dev] [PATCH] event/octeontx2: fix device reconfigure for single slot

Jerin Jacob jerinjacobk at gmail.com
Mon Apr 12 08:01:29 CEST 2021


On Mon, Apr 5, 2021 at 9:54 PM Harman Kalra <hkalra at marvell.com> wrote:
>
> 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 at dpdk.org
>
> Signed-off-by: Harman Kalra <hkalra at marvell.com>

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



> ---
>  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 7e2343599..a6beed069 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.18.0
>


More information about the dev mailing list