lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<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

Powered by Openwall GNU/*/Linux Powered by OpenVZ