Skip to content

Commit

Permalink
platform/mellanox: mlxreg-io: Add locking for io operations
Browse files Browse the repository at this point in the history
Add lock to protect user read/write access to the registers.

Signed-off-by: Vadim Pasternak <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Reviewed-by: Hans de Goede <[email protected]>
Signed-off-by: Hans de Goede <[email protected]>
  • Loading branch information
vadimp-nvidia authored and jwrdegoede committed Jul 14, 2022
1 parent 095a2c1 commit 7964f8f
Showing 1 changed file with 23 additions and 0 deletions.
23 changes: 23 additions & 0 deletions drivers/platform/mellanox/mlxreg-io.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
* @group: sysfs attribute group;
* @groups: list of sysfs attribute group for hwmon registration;
* @regsize: size of a register value;
* @io_lock: user access locking;
*/
struct mlxreg_io_priv_data {
struct platform_device *pdev;
Expand All @@ -41,6 +42,7 @@ struct mlxreg_io_priv_data {
struct attribute_group group;
const struct attribute_group *groups[2];
int regsize;
struct mutex io_lock; /* Protects user access. */
};

static int
Expand Down Expand Up @@ -116,14 +118,19 @@ mlxreg_io_attr_show(struct device *dev, struct device_attribute *attr,
u32 regval = 0;
int ret;

mutex_lock(&priv->io_lock);

ret = mlxreg_io_get_reg(priv->pdata->regmap, data, 0, true,
priv->regsize, &regval);
if (ret)
goto access_error;

mutex_unlock(&priv->io_lock);

return sprintf(buf, "%u\n", regval);

access_error:
mutex_unlock(&priv->io_lock);
return ret;
}

Expand All @@ -145,6 +152,8 @@ mlxreg_io_attr_store(struct device *dev, struct device_attribute *attr,
if (ret)
return ret;

mutex_lock(&priv->io_lock);

ret = mlxreg_io_get_reg(priv->pdata->regmap, data, input_val, false,
priv->regsize, &regval);
if (ret)
Expand All @@ -154,9 +163,12 @@ mlxreg_io_attr_store(struct device *dev, struct device_attribute *attr,
if (ret)
goto access_error;

mutex_unlock(&priv->io_lock);

return len;

access_error:
mutex_unlock(&priv->io_lock);
dev_err(&priv->pdev->dev, "Bus access error\n");
return ret;
}
Expand Down Expand Up @@ -246,16 +258,27 @@ static int mlxreg_io_probe(struct platform_device *pdev)
return PTR_ERR(priv->hwmon);
}

mutex_init(&priv->io_lock);
dev_set_drvdata(&pdev->dev, priv);

return 0;
}

static int mlxreg_io_remove(struct platform_device *pdev)
{
struct mlxreg_io_priv_data *priv = dev_get_drvdata(&pdev->dev);

mutex_destroy(&priv->io_lock);

return 0;
}

static struct platform_driver mlxreg_io_driver = {
.driver = {
.name = "mlxreg-io",
},
.probe = mlxreg_io_probe,
.remove = mlxreg_io_remove,
};

module_platform_driver(mlxreg_io_driver);
Expand Down

0 comments on commit 7964f8f

Please sign in to comment.