mirror of https://gitee.com/openkylin/linux.git
media: v4l2-dev: add EPOLLPRI in v4l2_poll() when dev is unregistered
If the V4L2 device was unregistered, then add EPOLLPRI to the poll mask. Otherwise a select() that only waits for exceptions will not wake up. A select() that waits for read and/or write events *will* wake up on an EPOLLERR, but not (for some reason) if it just waits for exceptions. Strangly the epoll functionality will wakeup on EPOLLERR if you just wait for an exception, so in this respect select() and epoll differ. In the end it doesn't really matter, what matters is that polling file handles are woken up on device unregistration. It also improves the code a bit if vdev->fops->poll is NULL: this didn't check for device unregistration. Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
This commit is contained in:
parent
b996922bed
commit
5cb0a64eff
|
@ -339,12 +339,14 @@ static ssize_t v4l2_write(struct file *filp, const char __user *buf,
|
|||
static __poll_t v4l2_poll(struct file *filp, struct poll_table_struct *poll)
|
||||
{
|
||||
struct video_device *vdev = video_devdata(filp);
|
||||
__poll_t res = EPOLLERR | EPOLLHUP;
|
||||
__poll_t res = EPOLLERR | EPOLLHUP | EPOLLPRI;
|
||||
|
||||
if (!vdev->fops->poll)
|
||||
return DEFAULT_POLLMASK;
|
||||
if (video_is_registered(vdev))
|
||||
res = vdev->fops->poll(filp, poll);
|
||||
if (video_is_registered(vdev)) {
|
||||
if (!vdev->fops->poll)
|
||||
res = DEFAULT_POLLMASK;
|
||||
else
|
||||
res = vdev->fops->poll(filp, poll);
|
||||
}
|
||||
if (vdev->dev_debug & V4L2_DEV_DEBUG_POLL)
|
||||
dprintk("%s: poll: %08x\n",
|
||||
video_device_node_name(vdev), res);
|
||||
|
|
Loading…
Reference in New Issue