mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-23 04:34:11 +08:00
media: vb2: reorder checks in vb2_poll()
When reaching the end of stream, V4L2 clients may expect the V4L2_EOS_EVENT before being able to dequeue the last buffer, which has the V4L2_BUF_FLAG_LAST flag set. If the vb2_poll() function first checks for events and afterwards if buffers are available, a driver can queue the V4L2_EOS_EVENT event and return the buffer after the check for events but before the check for buffers. This causes vb2_poll() to signal that the buffer with V4L2_BUF_FLAG_LAST can be read without the V4L2_EOS_EVENT being available. First, check for available buffers and afterwards for events to ensure that if vb2_poll() signals POLLIN | POLLRDNORM for the V4L2_BUF_FLAG_LAST buffer, it also signals POLLPRI for the V4L2_EOS_EVENT. Signed-off-by: Michael Tretter <m.tretter@pengutronix.de> Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
This commit is contained in:
parent
43266ad2b4
commit
8d86a15649
@ -872,17 +872,19 @@ EXPORT_SYMBOL_GPL(vb2_queue_release);
|
||||
__poll_t vb2_poll(struct vb2_queue *q, struct file *file, poll_table *wait)
|
||||
{
|
||||
struct video_device *vfd = video_devdata(file);
|
||||
__poll_t res = 0;
|
||||
__poll_t res;
|
||||
|
||||
res = vb2_core_poll(q, file, wait);
|
||||
|
||||
if (test_bit(V4L2_FL_USES_V4L2_FH, &vfd->flags)) {
|
||||
struct v4l2_fh *fh = file->private_data;
|
||||
|
||||
poll_wait(file, &fh->wait, wait);
|
||||
if (v4l2_event_pending(fh))
|
||||
res = EPOLLPRI;
|
||||
res |= EPOLLPRI;
|
||||
}
|
||||
|
||||
return res | vb2_core_poll(q, file, wait);
|
||||
return res;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(vb2_poll);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user