forked from Minki/linux
hwmon: (dell-smm) Unify i8k_ioctl() and i8k_ioctl_unlocked()
The only purpose of i8k_ioctl() is to call i8k_ioctl_unlocked() with i8k_mutex held. Judging from the hwmon code, this mutex only needs to be held when setting the fan speed/mode, so the operation of I8K_SET_FAN is guaranteed to be atomic. Unify both functions and reduce the locking of i8k_mutex to I8K_SET_FAN. Tested on a Dell Inspiron 3505. Signed-off-by: Armin Wolf <W_Armin@gmx.de> Reviewed-by: Pali Rohár <pali@kernel.org> Link: https://lore.kernel.org/r/20211211155422.16830-3-W_Armin@gmx.de Signed-off-by: Guenter Roeck <linux@roeck-us.net>
This commit is contained in:
parent
0240538774
commit
87b93329fd
@ -449,12 +449,12 @@ static int i8k_get_power_status(void)
|
|||||||
* Procfs interface
|
* Procfs interface
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int
|
static long i8k_ioctl(struct file *fp, unsigned int cmd, unsigned long arg)
|
||||||
i8k_ioctl_unlocked(struct file *fp, struct dell_smm_data *data, unsigned int cmd, unsigned long arg)
|
|
||||||
{
|
{
|
||||||
int val = 0;
|
struct dell_smm_data *data = PDE_DATA(file_inode(fp));
|
||||||
int speed, err;
|
|
||||||
int __user *argp = (int __user *)arg;
|
int __user *argp = (int __user *)arg;
|
||||||
|
int speed, err;
|
||||||
|
int val = 0;
|
||||||
|
|
||||||
if (!argp)
|
if (!argp)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
@ -516,11 +516,13 @@ i8k_ioctl_unlocked(struct file *fp, struct dell_smm_data *data, unsigned int cmd
|
|||||||
if (copy_from_user(&speed, argp + 1, sizeof(int)))
|
if (copy_from_user(&speed, argp + 1, sizeof(int)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
|
mutex_lock(&data->i8k_mutex);
|
||||||
err = i8k_set_fan(data, val, speed);
|
err = i8k_set_fan(data, val, speed);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
val = err;
|
||||||
|
else
|
||||||
val = i8k_get_fan_status(data, val);
|
val = i8k_get_fan_status(data, val);
|
||||||
|
mutex_unlock(&data->i8k_mutex);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -536,18 +538,6 @@ i8k_ioctl_unlocked(struct file *fp, struct dell_smm_data *data, unsigned int cmd
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static long i8k_ioctl(struct file *fp, unsigned int cmd, unsigned long arg)
|
|
||||||
{
|
|
||||||
struct dell_smm_data *data = PDE_DATA(file_inode(fp));
|
|
||||||
long ret;
|
|
||||||
|
|
||||||
mutex_lock(&data->i8k_mutex);
|
|
||||||
ret = i8k_ioctl_unlocked(fp, data, cmd, arg);
|
|
||||||
mutex_unlock(&data->i8k_mutex);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Print the information for /proc/i8k.
|
* Print the information for /proc/i8k.
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user