ACK/cmnt: [SRU][F:linux-bluefield][PATCH 1/1] UBUNTU: SAUCE: pka: Handle ring open scenario when rings are busy

Kleber Souza kleber.souza at canonical.com
Thu Feb 25 09:07:20 UTC 2021


On 19.02.21 21:28, Mahantesh Salimath wrote:
> BugLink: https://bugs.launchpad.net/ubuntu/+source/linux-bluefield/+bug/1916289

The BugLink should use the short format:

https://bugs.launchpad.net/bugs/1916289

> 
>      * Introduce mutex lock/unlock when updating
>        ring status while open/close ring device. If ring status
>        is busy while open operation then return -EBUSY error.
> 
>      * If -EBUSY error is received while trying to open ring,
>        this means the ring is being used by another application.
>        Hence, continue to look for other rings that might be available.
>        If ring open fails then no need to close the ring as this might affect
>        other 'pka' instances using that ring.
> 
>      * Also, first check if the ring is available (by opening the ring)
>        before initializing the ring region. This will remove the need to reset
>        ring region if ring is not available.
> 
> Signed-off-by: Mahantesh Salimath <mahantesh at nvidia.com>
> Reviewed-by: Khalil Blaiech <kblaiech at nvidia.com>
> Signed-off-by: Mahantesh Salimath <mahantesh at nvidia.com>

The BugLink issue can be fixed when applying the patch, it doesn't need to be
re-sent. Apart from that the changes look good.

Acked-by: Kleber Sacilotto de Souza <kleber.souza at canonical.com>

> 
> diff --git a/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_dev.c b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_dev.c
> index 74512ba..4539bae 100644
> --- a/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_dev.c
> +++ b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_dev.c
> @@ -339,6 +339,7 @@ static int pka_dev_init_ring(pka_dev_ring_t *ring, uint32_t ring_id,
>           return -ENOMEM;
>       }
> 
> +    mutex_init(&ring->mutex);
>       ring->status  = PKA_DEV_RING_STATUS_INITIALIZED;
>   
>       return ret;
> @@ -1707,20 +1708,35 @@ int __pka_dev_open_ring(uint32_t ring_id)
>   
>       shim = ring->shim;
>   
> +    mutex_lock(&ring->mutex);
> +
>       if (shim->status == PKA_SHIM_STATUS_UNDEFINED ||
>             shim->status == PKA_SHIM_STATUS_CREATED ||
>             shim->status == PKA_SHIM_STATUS_FINALIZED)
> -        return -EPERM;
> +    {
> +        ret = -EPERM;
> +        goto unlock_return;
> +    }
> +
> +    if (ring->status == PKA_DEV_RING_STATUS_BUSY)
> +    {
> +        ret = -EBUSY;
> +        goto unlock_return;
> +    }
>   
>       if (ring->status != PKA_DEV_RING_STATUS_INITIALIZED)
> -        return -EPERM;
> +    {
> +        ret = -EPERM;
> +        goto unlock_return;
> +    }
>   
>       // Set ring information words.
>       ret = pka_dev_set_ring_info(ring);
>       if (ret)
>       {
>           PKA_ERROR(PKA_DEV, "failed to set ring information\n");
> -        return -EWOULDBLOCK;
> +        ret = -EWOULDBLOCK;
> +        goto unlock_return;
>       }
>   
>       if (shim->busy_ring_num == 0)
> @@ -1729,6 +1745,8 @@ int __pka_dev_open_ring(uint32_t ring_id)
>       ring->status = PKA_DEV_RING_STATUS_BUSY;
>       shim->busy_ring_num += 1;
>   
> +unlock_return:
> +    mutex_unlock(&ring->mutex);
>       return ret;
>   }
>   
> @@ -1755,9 +1773,14 @@ int __pka_dev_close_ring(uint32_t ring_id)
>   
>       shim = ring->shim;
>   
> +    mutex_lock(&ring->mutex);
> +
>       if (shim->status != PKA_SHIM_STATUS_RUNNING &&
>               ring->status != PKA_DEV_RING_STATUS_BUSY)
> -        return -EPERM;
> +    {
> +        ret = -EPERM;
> +        goto unlock_return;
> +    }
>   
>       ring->status         = PKA_DEV_RING_STATUS_INITIALIZED;
>       shim->busy_ring_num -= 1;
> @@ -1765,6 +1788,8 @@ int __pka_dev_close_ring(uint32_t ring_id)
>       if (shim->busy_ring_num == 0)
>           shim->status = PKA_SHIM_STATUS_STOPPED;
>   
> +unlock_return:
> +    mutex_unlock(&ring->mutex);
>       return ret;
>   }
>   
> diff --git a/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_dev.h b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_dev.h
> index 12545ae..5a6cc8fd 100644
> --- a/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_dev.h
> +++ b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_dev.h
> @@ -128,6 +128,8 @@ typedef struct
>       uint32_t                num_cmd_desc;   ///< number of command descriptors.
>   
>       int8_t                  status;         ///< status of the ring.
> +
> +    struct mutex            mutex;          ///< mutex lock for sharing ring device
>   } pka_dev_ring_t;
>   
>   /// defines for pka_dev_ring->status
> diff --git a/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_drv.c b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_drv.c
> index 36dfed0..f93efb66 100644
> --- a/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_drv.c
> +++ b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_drv.c
> @@ -270,20 +270,20 @@ static int pka_drv_ring_open(void *device_data)
>   	if (!try_module_get(info->module))
>   		return -ENODEV;
>   
> -	/* Initialize regions */
> -	error = pka_drv_ring_regions_init(ring_dev);
> +	ring_info.ring_id = ring_dev->device_id;
> +	error = pka_dev_open_ring(&ring_info);
>   	if (error) {
> -		PKA_ERROR(PKA_DRIVER, "failed to initialize regions\n");
> +		PKA_DEBUG(PKA_DRIVER,
> +			  "failed to open ring %u\n", ring_dev->device_id);
>   		module_put(info->module);
>   		return error;
>   	}
>   
> -	ring_info.ring_id = ring_dev->device_id;
> -	error = pka_dev_open_ring(&ring_info);
> +	/* Initialize regions */
> +	error = pka_drv_ring_regions_init(ring_dev);
>   	if (error) {
> -		PKA_ERROR(PKA_DRIVER,
> -			  "failed to open ring %u\n", ring_dev->device_id);
> -		pka_drv_ring_regions_cleanup(ring_dev);
> +		PKA_DEBUG(PKA_DRIVER, "failed to initialize regions\n");
> +		pka_dev_close_ring(&ring_info);
>   		module_put(info->module);
>   		return error;
>   	}
> @@ -303,14 +303,15 @@ static void pka_drv_ring_release(void *device_data)
>   		  "release ring device %u (device_data:%p)\n",
>   		  ring_dev->device_id, ring_dev);
>   
> +	pka_drv_ring_regions_cleanup(ring_dev);
> +
>   	ring_info.ring_id = ring_dev->device_id;
>   	error = pka_dev_close_ring(&ring_info);
>   	if (error)
> -		PKA_ERROR(PKA_DRIVER,
> +		PKA_DEBUG(PKA_DRIVER,
>   			  "failed to close ring %u\n",
>   			  ring_dev->device_id);
>   
> -	pka_drv_ring_regions_cleanup(ring_dev);
>   	module_put(info->module);
>   }
>   
> 




More information about the kernel-team mailing list