uio: dismiss waiters on device unregistration

When the device is unregistered, it should wake up the blocking waiters.
Otherwise, they will sleep forever.

Signed-off-by: Zhaolong Zhang <zhangzl2013@126.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Zhaolong Zhang 2018-11-16 18:21:51 +08:00 committed by Greg Kroah-Hartman
parent 3b1ad360ac
commit b5570ca7c4
1 changed files with 11 additions and 8 deletions

View File

@ -569,20 +569,20 @@ static ssize_t uio_read(struct file *filep, char __user *buf,
ssize_t retval = 0;
s32 event_count;
mutex_lock(&idev->info_lock);
if (!idev->info || !idev->info->irq)
retval = -EIO;
mutex_unlock(&idev->info_lock);
if (retval)
return retval;
if (count != sizeof(s32))
return -EINVAL;
add_wait_queue(&idev->wait, &wait);
do {
mutex_lock(&idev->info_lock);
if (!idev->info || !idev->info->irq) {
retval = -EIO;
mutex_unlock(&idev->info_lock);
break;
}
mutex_unlock(&idev->info_lock);
set_current_state(TASK_INTERRUPTIBLE);
event_count = atomic_read(&idev->event);
@ -1017,6 +1017,9 @@ void uio_unregister_device(struct uio_info *info)
idev->info = NULL;
mutex_unlock(&idev->info_lock);
wake_up_interruptible(&idev->wait);
kill_fasync(&idev->async_queue, SIGIO, POLL_HUP);
device_unregister(&idev->dev);
return;