[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20250811153934.671070-3-xiangrongl@nvidia.com>
Date: Mon, 11 Aug 2025 15:39:32 +0000
From: Ron Li <xiangrongl@...dia.com>
To: <hdegoede@...hat.com>, <ilpo.jarvinen@...ux.intel.com>,
<vadimp@...dia.com>, <alok.a.tiwari@...cle.com>, <kblaiech@...dia.com>,
<davthompson@...dia.com>
CC: <platform-driver-x86@...r.kernel.org>, <linux-kernel@...r.kernel.org>,
"Ron Li" <xiangrongl@...dia.com>
Subject: [PATCH v2 2/4] platform/mellanox/mlxbf_pka: add guard() and scoped_guard()
- Use guard() to take ownership of mutex and release automatically when
out of scope. Simplified the implementation.
- Use scoped_guard() to simplify several mutex lock/unlock use cases.
Reviewed-by: David Thompson <davthompson@...dia.com>
Reviewed-by: Khalil Blaiech <kblaiech@...dia.com>
Signed-off-by: Ron Li <xiangrongl@...dia.com>
---
.../mellanox/mlxbf_pka/mlxbf_pka_dev.c | 85 +++++--------
.../mellanox/mlxbf_pka/mlxbf_pka_drv.c | 112 ++++++++----------
2 files changed, 83 insertions(+), 114 deletions(-)
diff --git a/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_dev.c b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_dev.c
index 3048e7436509..a0282ae0c62e 100644
--- a/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_dev.c
+++ b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_dev.c
@@ -1738,23 +1738,19 @@ int mlxbf_pka_dev_trng_read(struct mlxbf_pka_dev_shim_s *shim, u32 *data, u32 cn
if (!cnt)
return ret;
- mutex_lock(&shim->mutex);
+ guard(mutex)(&shim->mutex);
trng_csr_ptr = &shim->resources.trng_csr;
if (trng_csr_ptr->status != MLXBF_PKA_DEV_RES_STATUS_MAPPED ||
- trng_csr_ptr->type != MLXBF_PKA_DEV_RES_TYPE_REG) {
- ret = -EPERM;
- goto exit;
- }
+ trng_csr_ptr->type != MLXBF_PKA_DEV_RES_TYPE_REG)
+ return -EPERM;
csr_reg_base = trng_csr_ptr->base;
csr_reg_ptr = trng_csr_ptr->ioaddr;
- if (!mlxbf_pka_dev_trng_shutdown_oflo(trng_csr_ptr, &shim->trng_err_cycle)) {
- ret = -EWOULDBLOCK;
- goto exit;
- }
+ if (!mlxbf_pka_dev_trng_shutdown_oflo(trng_csr_ptr, &shim->trng_err_cycle))
+ return -EWOULDBLOCK;
word_cnt = cnt >> ilog2(sizeof(u32));
@@ -1782,10 +1778,8 @@ int mlxbf_pka_dev_trng_read(struct mlxbf_pka_dev_shim_s *shim, u32 *data, u32 cn
if (!((u32)csr_reg_value & MLXBF_PKA_TRNG_DRBG_DATA_BLOCK_MASK)) {
/* Issue reseed. */
ret = mlxbf_pka_dev_trng_drbg_reseed(csr_reg_ptr, csr_reg_base);
- if (ret) {
- ret = -EBUSY;
- goto exit;
- }
+ if (ret)
+ return -EBUSY;
/* Issue generate request. */
mlxbf_pka_dev_trng_drbg_generate(csr_reg_ptr, csr_reg_base);
@@ -1806,25 +1800,22 @@ int mlxbf_pka_dev_trng_read(struct mlxbf_pka_dev_shim_s *shim, u32 *data, u32 cn
csr_reg_value = mlxbf_pka_dev_io_read(csr_reg_ptr, csr_reg_off);
trng_ready = csr_reg_value & MLXBF_PKA_TRNG_STATUS_READY;
- if (mlxbf_pka_dev_timer_done(timer)) {
- pr_debug("mlxbf_pka: shim %u got error obtaining random number\n",
- shim->shim_id);
- ret = -EBUSY;
- goto exit;
+ if (mlxbf_pka_dev_timer_done(timer)) {
+ pr_debug("mlxbf_pka: shim %u got error obtaining random number\n",
+ shim->shim_id);
+ return -EBUSY;
+ }
}
- }
- /* Read the registers. */
- csr_reg_off =
- mlxbf_pka_dev_get_register_offset(csr_reg_base,
- MLXBF_PKA_TRNG_OUTPUT_0_ADDR +
- (output_idx * MLXBF_PKA_TRNG_OUTPUT_REG_OFFSET));
- csr_reg_value = mlxbf_pka_dev_io_read(csr_reg_ptr, csr_reg_off);
- data[data_idx] = (u32)csr_reg_value;
+ /* Read the registers. */
+ csr_reg_off =
+ mlxbf_pka_dev_get_register_offset(csr_reg_base,
+ MLXBF_PKA_TRNG_OUTPUT_0_ADDR +
+ (output_idx * MLXBF_PKA_TRNG_OUTPUT_REG_OFFSET));
+ csr_reg_value = mlxbf_pka_dev_io_read(csr_reg_ptr, csr_reg_off);
+ data[data_idx] = (u32)csr_reg_value;
}
-exit:
- mutex_unlock(&shim->mutex);
return ret;
}
@@ -1852,31 +1843,24 @@ static int __mlxbf_pka_dev_open_ring(struct device *dev, u32 ring_id)
shim = ring->shim;
- mutex_lock(&ring->mutex);
+ guard(mutex)(&ring->mutex);
if (shim->status == MLXBF_PKA_SHIM_STATUS_UNDEFINED ||
shim->status == MLXBF_PKA_SHIM_STATUS_CREATED ||
- shim->status == MLXBF_PKA_SHIM_STATUS_FINALIZED) {
- ret = -EPERM;
- goto unlock_return;
- }
+ shim->status == MLXBF_PKA_SHIM_STATUS_FINALIZED)
+ return -EPERM;
- if (ring->status == MLXBF_PKA_DEV_RING_STATUS_BUSY) {
- ret = -EBUSY;
- goto unlock_return;
- }
+ if (ring->status == MLXBF_PKA_DEV_RING_STATUS_BUSY)
+ return -EBUSY;
- if (ring->status != MLXBF_PKA_DEV_RING_STATUS_INITIALIZED) {
- ret = -EPERM;
- goto unlock_return;
- }
+ if (ring->status != MLXBF_PKA_DEV_RING_STATUS_INITIALIZED)
+ return -EPERM;
/* Set ring information words. */
ret = mlxbf_pka_dev_set_ring_info(dev, ring);
if (ret) {
dev_err(dev, "failed to set ring information\n");
- ret = -EWOULDBLOCK;
- goto unlock_return;
+ return -EWOULDBLOCK;
}
if (!shim->busy_ring_num)
@@ -1885,8 +1869,6 @@ static int __mlxbf_pka_dev_open_ring(struct device *dev, u32 ring_id)
ring->status = MLXBF_PKA_DEV_RING_STATUS_BUSY;
shim->busy_ring_num += 1;
-unlock_return:
- mutex_unlock(&ring->mutex);
return ret;
}
@@ -1901,7 +1883,6 @@ static int __mlxbf_pka_dev_close_ring(u32 ring_id)
{
struct mlxbf_pka_dev_shim_s *shim;
struct mlxbf_pka_dev_ring_t *ring;
- int ret = 0;
if (!mlxbf_pka_gbl_config.dev_rings_cnt)
return -EPERM;
@@ -1912,13 +1893,11 @@ static int __mlxbf_pka_dev_close_ring(u32 ring_id)
shim = ring->shim;
- mutex_lock(&ring->mutex);
+ guard(mutex)(&ring->mutex);
if (shim->status != MLXBF_PKA_SHIM_STATUS_RUNNING &&
- ring->status != MLXBF_PKA_DEV_RING_STATUS_BUSY) {
- ret = -EPERM;
- goto unlock_return;
- }
+ ring->status != MLXBF_PKA_DEV_RING_STATUS_BUSY)
+ return -EPERM;
ring->status = MLXBF_PKA_DEV_RING_STATUS_INITIALIZED;
shim->busy_ring_num -= 1;
@@ -1926,9 +1905,7 @@ static int __mlxbf_pka_dev_close_ring(u32 ring_id)
if (!shim->busy_ring_num)
shim->status = MLXBF_PKA_SHIM_STATUS_STOPPED;
-unlock_return:
- mutex_unlock(&ring->mutex);
- return ret;
+ return 0;
}
/* Close ring. */
diff --git a/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_drv.c b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_drv.c
index 95de7fa513dc..0f93c1aa7130 100644
--- a/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_drv.c
+++ b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_drv.c
@@ -486,9 +486,9 @@ static int mlxbf_pka_drv_open(struct inode *inode, struct file *filep)
struct mlxbf_pka_ring_device *ring_dev;
int ret;
- mutex_lock(&pka.idr_lock);
- ring_dev = idr_find(&pka.ring_idr, iminor(inode));
- mutex_unlock(&pka.idr_lock);
+ scoped_guard(mutex, &pka.idr_lock) {
+ ring_dev = idr_find(&pka.ring_idr, iminor(inode));
+ }
if (!ring_dev) {
pr_err("mlxbf_pka error: failed to find idr for device\n");
return -ENODEV;
@@ -550,13 +550,10 @@ static int mlxbf_pka_drv_add_ring_device(struct mlxbf_pka_ring_device *ring_dev)
return ret;
}
- mutex_lock(&pka.idr_lock);
- minor_number = idr_alloc(&pka.ring_idr,
- ring_dev,
- ring_dev->misc.minor,
- MINORMASK + 1,
- GFP_KERNEL);
- mutex_unlock(&pka.idr_lock);
+ scoped_guard(mutex, &pka.idr_lock) {
+ minor_number = idr_alloc(&pka.ring_idr, ring_dev, ring_dev->misc.minor,
+ MINORMASK + 1, GFP_KERNEL);
+ }
if (minor_number != ring_dev->misc.minor) {
dev_err(dev, "failed to allocate minor number %d\n", ring_dev->misc.minor);
return ring_dev->misc.minor;
@@ -575,9 +572,9 @@ static struct mlxbf_pka_ring_device *mlxbf_pka_drv_del_ring_device(struct device
struct mlxbf_pka_ring_device *ring_dev = info->priv;
if (ring_dev) {
- mutex_lock(&pka.idr_lock);
- idr_remove(&pka.ring_idr, ring_dev->misc.minor);
- mutex_unlock(&pka.idr_lock);
+ scoped_guard(mutex, &pka.idr_lock) {
+ idr_remove(&pka.ring_idr, ring_dev->misc.minor);
+ }
misc_deregister(&ring_dev->misc);
}
@@ -746,15 +743,14 @@ static int mlxbf_pka_drv_probe_device(struct mlxbf_pka_info *info)
if (!mlxbf_pka_dev)
return -ENOMEM;
- mutex_lock(&mlxbf_pka_drv_lock);
- mlxbf_pka_device_cnt += 1;
- if (mlxbf_pka_device_cnt > MLXBF_PKA_DRIVER_DEV_MAX) {
- dev_dbg(dev, "cannot support %u devices\n", mlxbf_pka_device_cnt);
- mutex_unlock(&mlxbf_pka_drv_lock);
- return -EPERM;
+ scoped_guard(mutex, &mlxbf_pka_drv_lock) {
+ mlxbf_pka_device_cnt += 1;
+ if (mlxbf_pka_device_cnt > MLXBF_PKA_DRIVER_DEV_MAX) {
+ dev_dbg(dev, "cannot support %u devices\n", mlxbf_pka_device_cnt);
+ return -ENOSPC;
+ }
+ mlxbf_pka_dev->device_id = mlxbf_pka_device_cnt - 1;
}
- mlxbf_pka_dev->device_id = mlxbf_pka_device_cnt - 1;
- mutex_unlock(&mlxbf_pka_drv_lock);
mlxbf_pka_dev->info = info;
mlxbf_pka_dev->device = dev;
@@ -785,14 +781,13 @@ static int mlxbf_pka_drv_probe_device(struct mlxbf_pka_info *info)
wndw_ram_off_mask = plat_info->wndw_ram_off_mask;
- mutex_lock(&mlxbf_pka_drv_lock);
- ret = mlxbf_pka_drv_register_device(mlxbf_pka_dev, wndw_ram_off_mask);
- if (ret) {
- dev_dbg(dev, "failed to register shim\n");
- mutex_unlock(&mlxbf_pka_drv_lock);
- return ret;
+ scoped_guard(mutex, &mlxbf_pka_drv_lock) {
+ ret = mlxbf_pka_drv_register_device(mlxbf_pka_dev, wndw_ram_off_mask);
+ if (ret) {
+ dev_dbg(dev, "failed to register shim\n");
+ return ret;
+ }
}
- mutex_unlock(&mlxbf_pka_drv_lock);
/* Setup the TRNG if needed. */
if (mlxbf_pka_dev_has_trng(mlxbf_pka_dev->shim)) {
@@ -842,22 +837,21 @@ static int mlxbf_pka_drv_probe_ring_device(struct mlxbf_pka_info *info)
if (!mlxbf_pka_ring_device_cnt) {
mutex_init(&pka.idr_lock);
- mutex_lock(&pka.idr_lock);
- /* Only initialize IDR if there is no ring device registered. */
- idr_init(&pka.ring_idr);
- mutex_unlock(&pka.idr_lock);
+ scoped_guard(mutex, &pka.idr_lock) {
+ /* Only initialize IDR if there is no ring device registered. */
+ idr_init(&pka.ring_idr);
+ }
}
- mutex_lock(&mlxbf_pka_drv_lock);
- mlxbf_pka_ring_device_cnt += 1;
- if (mlxbf_pka_ring_device_cnt > MLXBF_PKA_DRIVER_RING_DEV_MAX) {
- dev_dbg(dev, "cannot support %u ring devices\n", mlxbf_pka_ring_device_cnt);
- mutex_unlock(&mlxbf_pka_drv_lock);
- return -EPERM;
+ scoped_guard(mutex, &mlxbf_pka_drv_lock) {
+ mlxbf_pka_ring_device_cnt += 1;
+ if (mlxbf_pka_ring_device_cnt > MLXBF_PKA_DRIVER_RING_DEV_MAX) {
+ dev_dbg(dev, "cannot support %u ring devices\n", mlxbf_pka_ring_device_cnt);
+ return -ENOSPC;
+ }
+ ring_dev->device_id = mlxbf_pka_ring_device_cnt - 1;
+ ring_dev->parent_device_id = mlxbf_pka_device_cnt - 1;
}
- ring_dev->device_id = mlxbf_pka_ring_device_cnt - 1;
- ring_dev->parent_device_id = mlxbf_pka_device_cnt - 1;
- mutex_unlock(&mlxbf_pka_drv_lock);
ring_dev->info = info;
ring_dev->device = dev;
@@ -869,23 +863,21 @@ static int mlxbf_pka_drv_probe_ring_device(struct mlxbf_pka_info *info)
if (ret)
return ret;
- mutex_lock(&mlxbf_pka_drv_lock);
- /* Add PKA ring device. */
- ret = mlxbf_pka_drv_add_ring_device(ring_dev);
- if (ret) {
- dev_dbg(dev, "failed to add ring device %u\n", ring_dev->device_id);
- mutex_unlock(&mlxbf_pka_drv_lock);
- return ret;
- }
+ scoped_guard(mutex, &mlxbf_pka_drv_lock) {
+ /* Add PKA ring device. */
+ ret = mlxbf_pka_drv_add_ring_device(ring_dev);
+ if (ret) {
+ dev_dbg(dev, "failed to add ring device %u\n", ring_dev->device_id);
+ return ret;
+ }
- /* Register PKA ring device. */
- ret = mlxbf_pka_drv_register_ring_device(ring_dev);
- if (ret) {
- dev_dbg(dev, "failed to register ring device\n");
- mutex_unlock(&mlxbf_pka_drv_lock);
- goto err_register_ring;
+ /* Register PKA ring device. */
+ ret = mlxbf_pka_drv_register_ring_device(ring_dev);
+ if (ret) {
+ dev_dbg(dev, "failed to register ring device\n");
+ goto err_register_ring;
+ }
}
- mutex_unlock(&mlxbf_pka_drv_lock);
info->priv = ring_dev;
@@ -908,10 +900,10 @@ static void mlxbf_pka_drv_remove_ring_device(struct platform_device *pdev)
}
if (!mlxbf_pka_ring_device_cnt) {
- mutex_lock(&pka.idr_lock);
- /* Only destroy IDR if there is no ring device registered. */
- idr_destroy(&pka.ring_idr);
- mutex_unlock(&pka.idr_lock);
+ scoped_guard(mutex, &pka.idr_lock) {
+ /* Only destroy IDR if there is no ring device registered. */
+ idr_destroy(&pka.ring_idr);
+ }
}
}
--
2.43.2
Powered by blists - more mailing lists