On Wed, Apr 12, 2023 at 11:15:25AM -0500, Eddie James wrote: > Debugfs operations may set the page number, which must be done > atomically with the subsequent i2c operation. Lock the update_lock > in the debugfs functions and provide a function for pmbus drivers > to lock and unlock the update_lock. > > Signed-off-by: Eddie James <eajames@xxxxxxxxxxxxx> Applied. Thanks, Guenter > --- > drivers/hwmon/pmbus/pmbus.h | 2 ++ > drivers/hwmon/pmbus/pmbus_core.c | 30 ++++++++++++++++++++++++++++++ > 2 files changed, 32 insertions(+) > > diff --git a/drivers/hwmon/pmbus/pmbus.h b/drivers/hwmon/pmbus/pmbus.h > index 11e84e141126..b0832a4c690d 100644 > --- a/drivers/hwmon/pmbus/pmbus.h > +++ b/drivers/hwmon/pmbus/pmbus.h > @@ -505,6 +505,8 @@ int pmbus_get_fan_rate_device(struct i2c_client *client, int page, int id, > enum pmbus_fan_mode mode); > int pmbus_get_fan_rate_cached(struct i2c_client *client, int page, int id, > enum pmbus_fan_mode mode); > +int pmbus_lock_interruptible(struct i2c_client *client); > +void pmbus_unlock(struct i2c_client *client); > int pmbus_update_fan(struct i2c_client *client, int page, int id, > u8 config, u8 mask, u16 command); > struct dentry *pmbus_get_debugfs_dir(struct i2c_client *client); > diff --git a/drivers/hwmon/pmbus/pmbus_core.c b/drivers/hwmon/pmbus/pmbus_core.c > index ca4510e4f918..04b4c65666fd 100644 > --- a/drivers/hwmon/pmbus/pmbus_core.c > +++ b/drivers/hwmon/pmbus/pmbus_core.c > @@ -3212,8 +3212,13 @@ static int pmbus_debugfs_get(void *data, u64 *val) > { > int rc; > struct pmbus_debugfs_entry *entry = data; > + struct pmbus_data *pdata = i2c_get_clientdata(entry->client); > > + rc = mutex_lock_interruptible(&pdata->update_lock); > + if (rc) > + return rc; > rc = _pmbus_read_byte_data(entry->client, entry->page, entry->reg); > + mutex_unlock(&pdata->update_lock); > if (rc < 0) > return rc; > > @@ -3230,7 +3235,11 @@ static int pmbus_debugfs_get_status(void *data, u64 *val) > struct pmbus_debugfs_entry *entry = data; > struct pmbus_data *pdata = i2c_get_clientdata(entry->client); > > + rc = mutex_lock_interruptible(&pdata->update_lock); > + if (rc) > + return rc; > rc = pdata->read_status(entry->client, entry->page); > + mutex_unlock(&pdata->update_lock); > if (rc < 0) > return rc; > > @@ -3246,10 +3255,15 @@ static ssize_t pmbus_debugfs_mfr_read(struct file *file, char __user *buf, > { > int rc; > struct pmbus_debugfs_entry *entry = file->private_data; > + struct pmbus_data *pdata = i2c_get_clientdata(entry->client); > char data[I2C_SMBUS_BLOCK_MAX + 2] = { 0 }; > > + rc = mutex_lock_interruptible(&pdata->update_lock); > + if (rc) > + return rc; > rc = pmbus_read_block_data(entry->client, entry->page, entry->reg, > data); > + mutex_unlock(&pdata->update_lock); > if (rc < 0) > return rc; > > @@ -3587,6 +3601,22 @@ struct dentry *pmbus_get_debugfs_dir(struct i2c_client *client) > } > EXPORT_SYMBOL_NS_GPL(pmbus_get_debugfs_dir, PMBUS); > > +int pmbus_lock_interruptible(struct i2c_client *client) > +{ > + struct pmbus_data *data = i2c_get_clientdata(client); > + > + return mutex_lock_interruptible(&data->update_lock); > +} > +EXPORT_SYMBOL_NS_GPL(pmbus_lock_interruptible, PMBUS); > + > +void pmbus_unlock(struct i2c_client *client) > +{ > + struct pmbus_data *data = i2c_get_clientdata(client); > + > + mutex_unlock(&data->update_lock); > +} > +EXPORT_SYMBOL_NS_GPL(pmbus_unlock, PMBUS); > + > static int __init pmbus_core_init(void) > { > pmbus_debugfs_dir = debugfs_create_dir("pmbus", NULL);