gpiolib: cdev: fully adopt guard() and scoped_guard()
Use guard() or scoped_guard() for critical sections rather than discrete lock/unlock pairs. Signed-off-by: Kent Gibson <warthog618@gmail.com> Reviewed-by: Andy Shevchenko <andy@kernel.org> Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
This commit is contained in:
parent
d8543cbaf9
commit
0ebeaab4d5
@ -748,13 +748,13 @@ static void linereq_put_event(struct linereq *lr,
|
||||
{
|
||||
bool overflow = false;
|
||||
|
||||
spin_lock(&lr->wait.lock);
|
||||
scoped_guard(spinlock, &lr->wait.lock) {
|
||||
if (kfifo_is_full(&lr->events)) {
|
||||
overflow = true;
|
||||
kfifo_skip(&lr->events);
|
||||
}
|
||||
kfifo_in(&lr->events, le, 1);
|
||||
spin_unlock(&lr->wait.lock);
|
||||
}
|
||||
if (!overflow)
|
||||
wake_up_poll(&lr->wait, EPOLLIN);
|
||||
else
|
||||
@ -1487,18 +1487,13 @@ static long linereq_set_values_unlocked(struct linereq *lr,
|
||||
static long linereq_set_values(struct linereq *lr, void __user *ip)
|
||||
{
|
||||
struct gpio_v2_line_values lv;
|
||||
int ret;
|
||||
|
||||
if (copy_from_user(&lv, ip, sizeof(lv)))
|
||||
return -EFAULT;
|
||||
|
||||
mutex_lock(&lr->config_mutex);
|
||||
guard(mutex)(&lr->config_mutex);
|
||||
|
||||
ret = linereq_set_values_unlocked(lr, &lv);
|
||||
|
||||
mutex_unlock(&lr->config_mutex);
|
||||
|
||||
return ret;
|
||||
return linereq_set_values_unlocked(lr, &lv);
|
||||
}
|
||||
|
||||
static long linereq_set_config_unlocked(struct linereq *lr,
|
||||
@ -1556,13 +1551,9 @@ static long linereq_set_config(struct linereq *lr, void __user *ip)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
mutex_lock(&lr->config_mutex);
|
||||
guard(mutex)(&lr->config_mutex);
|
||||
|
||||
ret = linereq_set_config_unlocked(lr, &lc);
|
||||
|
||||
mutex_unlock(&lr->config_mutex);
|
||||
|
||||
return ret;
|
||||
return linereq_set_config_unlocked(lr, &lc);
|
||||
}
|
||||
|
||||
static long linereq_ioctl_unlocked(struct file *file, unsigned int cmd,
|
||||
@ -1644,28 +1635,22 @@ static ssize_t linereq_read_unlocked(struct file *file, char __user *buf,
|
||||
return -EINVAL;
|
||||
|
||||
do {
|
||||
spin_lock(&lr->wait.lock);
|
||||
scoped_guard(spinlock, &lr->wait.lock) {
|
||||
if (kfifo_is_empty(&lr->events)) {
|
||||
if (bytes_read) {
|
||||
spin_unlock(&lr->wait.lock);
|
||||
if (bytes_read)
|
||||
return bytes_read;
|
||||
}
|
||||
|
||||
if (file->f_flags & O_NONBLOCK) {
|
||||
spin_unlock(&lr->wait.lock);
|
||||
if (file->f_flags & O_NONBLOCK)
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
ret = wait_event_interruptible_locked(lr->wait,
|
||||
!kfifo_is_empty(&lr->events));
|
||||
if (ret) {
|
||||
spin_unlock(&lr->wait.lock);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
ret = kfifo_out(&lr->events, &le, 1);
|
||||
spin_unlock(&lr->wait.lock);
|
||||
}
|
||||
if (ret != 1) {
|
||||
/*
|
||||
* This should never happen - we were holding the
|
||||
@ -2015,28 +2000,22 @@ static ssize_t lineevent_read_unlocked(struct file *file, char __user *buf,
|
||||
return -EINVAL;
|
||||
|
||||
do {
|
||||
spin_lock(&le->wait.lock);
|
||||
scoped_guard(spinlock, &le->wait.lock) {
|
||||
if (kfifo_is_empty(&le->events)) {
|
||||
if (bytes_read) {
|
||||
spin_unlock(&le->wait.lock);
|
||||
if (bytes_read)
|
||||
return bytes_read;
|
||||
}
|
||||
|
||||
if (file->f_flags & O_NONBLOCK) {
|
||||
spin_unlock(&le->wait.lock);
|
||||
if (file->f_flags & O_NONBLOCK)
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
ret = wait_event_interruptible_locked(le->wait,
|
||||
!kfifo_is_empty(&le->events));
|
||||
if (ret) {
|
||||
spin_unlock(&le->wait.lock);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
ret = kfifo_out(&le->events, &ge, 1);
|
||||
spin_unlock(&le->wait.lock);
|
||||
}
|
||||
if (ret != 1) {
|
||||
/*
|
||||
* This should never happen - we were holding the lock
|
||||
@ -2732,38 +2711,30 @@ static ssize_t lineinfo_watch_read_unlocked(struct file *file, char __user *buf,
|
||||
#endif
|
||||
|
||||
do {
|
||||
spin_lock(&cdev->wait.lock);
|
||||
scoped_guard(spinlock, &cdev->wait.lock) {
|
||||
if (kfifo_is_empty(&cdev->events)) {
|
||||
if (bytes_read) {
|
||||
spin_unlock(&cdev->wait.lock);
|
||||
if (bytes_read)
|
||||
return bytes_read;
|
||||
}
|
||||
|
||||
if (file->f_flags & O_NONBLOCK) {
|
||||
spin_unlock(&cdev->wait.lock);
|
||||
if (file->f_flags & O_NONBLOCK)
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
ret = wait_event_interruptible_locked(cdev->wait,
|
||||
!kfifo_is_empty(&cdev->events));
|
||||
if (ret) {
|
||||
spin_unlock(&cdev->wait.lock);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
#ifdef CONFIG_GPIO_CDEV_V1
|
||||
/* must be after kfifo check so watch_abi_version is set */
|
||||
if (atomic_read(&cdev->watch_abi_version) == 2)
|
||||
event_size = sizeof(struct gpio_v2_line_info_changed);
|
||||
else
|
||||
event_size = sizeof(struct gpioline_info_changed);
|
||||
if (count < event_size) {
|
||||
spin_unlock(&cdev->wait.lock);
|
||||
if (count < event_size)
|
||||
return -EINVAL;
|
||||
}
|
||||
#endif
|
||||
ret = kfifo_out(&cdev->events, &event, 1);
|
||||
spin_unlock(&cdev->wait.lock);
|
||||
}
|
||||
if (ret != 1) {
|
||||
ret = -EIO;
|
||||
break;
|
||||
|
Loading…
Reference in New Issue
Block a user