浏览代码

V4L/DVB (11230): hdpvr: return immediately from hdpvr_poll if data is available

simplifies check for available data with hdpvr_get_next_buffer

Signed-off-by: Janne Grunau <j@jannau.net>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Janne Grunau 16 年之前
父节点
当前提交
d2ff3ec816
共有 1 个文件被更改,包括 8 次插入12 次删除
  1. 8 12
      drivers/media/video/hdpvr/hdpvr-video.c

+ 8 - 12
drivers/media/video/hdpvr/hdpvr-video.c

@@ -479,6 +479,7 @@ err:
 
 static unsigned int hdpvr_poll(struct file *filp, poll_table *wait)
 {
+	struct hdpvr_buffer *buf = NULL;
 	struct hdpvr_fh *fh = (struct hdpvr_fh *)filp->private_data;
 	struct hdpvr_device *dev = fh->dev;
 	unsigned int mask = 0;
@@ -499,19 +500,14 @@ static unsigned int hdpvr_poll(struct file *filp, poll_table *wait)
 	}
 	mutex_unlock(&dev->io_mutex);
 
-	poll_wait(filp, &dev->wait_data, wait);
-
-	mutex_lock(&dev->io_mutex);
-	if (!list_empty(&dev->rec_buff_list)) {
-
-		struct hdpvr_buffer *buf = list_entry(dev->rec_buff_list.next,
-						      struct hdpvr_buffer,
-						      buff_list);
-
-		if (buf->status == BUFSTAT_READY)
-			mask |= POLLIN | POLLRDNORM;
+	buf = hdpvr_get_next_buffer(dev);
+	/* only wait if no data is available */
+	if (!buf || buf->status != BUFSTAT_READY) {
+		poll_wait(filp, &dev->wait_data, wait);
+		buf = hdpvr_get_next_buffer(dev);
 	}
-	mutex_unlock(&dev->io_mutex);
+	if (buf && buf->status == BUFSTAT_READY)
+		mask |= POLLIN | POLLRDNORM;
 
 	return mask;
 }