]> rtime.felk.cvut.cz Git - linux-imx.git/commitdiff
HID: uhid: allow poll()'ing on uhid devices
authorDavid Herrmann <dh.herrmann@googlemail.com>
Sun, 10 Jun 2012 13:16:15 +0000 (15:16 +0200)
committerJiri Kosina <jkosina@suse.cz>
Mon, 18 Jun 2012 11:42:00 +0000 (13:42 +0200)
As long as the internal buffer is not empty, we return POLLIN to
user-space.

uhid->head and uhid->tail are no atomics so the comparison may return
inexact results. However, this doesn't matter here as user-space would
need to poll() in two threads simultaneously to trigger this. And in this
case it doesn't matter if a cached result is returned or the exact new
result as user-space does not know which thread returns first from poll()
and the following read(). So it is safe to compare the values without
locking.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
drivers/hid/uhid.c

index 05ef4b05a63e0fa3a26f88b0c5d48173413ee4f4..b1a477f8260c6ebca2f45b82c825487f97505097 100644 (file)
@@ -117,6 +117,13 @@ static ssize_t uhid_char_write(struct file *file, const char __user *buffer,
 
 static unsigned int uhid_char_poll(struct file *file, poll_table *wait)
 {
+       struct uhid_device *uhid = file->private_data;
+
+       poll_wait(file, &uhid->waitq, wait);
+
+       if (uhid->head != uhid->tail)
+               return POLLIN | POLLRDNORM;
+
        return 0;
 }