OSDN Git Service

platform/mellanox: mlxreg-io: Add locking for io operations
authorVadim Pasternak <vadimp@nvidia.com>
Mon, 11 Jul 2022 08:45:57 +0000 (11:45 +0300)
committerHans de Goede <hdegoede@redhat.com>
Thu, 14 Jul 2022 20:34:42 +0000 (22:34 +0200)
Add lock to protect user read/write access to the registers.

Signed-off-by: Vadim Pasternak <vadimp@nvidia.com>
Link: https://lore.kernel.org/r/20220711084559.62447-8-vadimp@nvidia.com
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
drivers/platform/mellanox/mlxreg-io.c

index 2c2686d..ddc08ab 100644 (file)
@@ -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;
@@ -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
@@ -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;
 }
 
@@ -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)
@@ -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;
 }
@@ -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);