From 7e5ebe88d812d3d8038021254b8f92ba3eea3f65 Mon Sep 17 00:00:00 2001 From: Sasha Levin Date: Tue, 14 Jan 2020 21:49:08 -0500 Subject: [PATCH] fixes for 4.9 Signed-off-by: Sasha Levin --- ...-returning-epollout-from-hidraw_poll.patch | 48 +++++++++++++ ...d-hidraw-uhid-always-report-epollout.patch | 69 +++++++++++++++++++ ...raw-return-epollout-from-hidraw_poll.patch | 40 +++++++++++ queue-4.9/series | 3 + 4 files changed, 160 insertions(+) create mode 100644 queue-4.9/hid-hidraw-fix-returning-epollout-from-hidraw_poll.patch create mode 100644 queue-4.9/hid-hidraw-uhid-always-report-epollout.patch create mode 100644 queue-4.9/hidraw-return-epollout-from-hidraw_poll.patch create mode 100644 queue-4.9/series diff --git a/queue-4.9/hid-hidraw-fix-returning-epollout-from-hidraw_poll.patch b/queue-4.9/hid-hidraw-fix-returning-epollout-from-hidraw_poll.patch new file mode 100644 index 00000000000..e73daac9754 --- /dev/null +++ b/queue-4.9/hid-hidraw-fix-returning-epollout-from-hidraw_poll.patch @@ -0,0 +1,48 @@ +From 75a2b304246fa974ef6dfd4ecd47c110eac01fa9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 4 Dec 2019 03:37:13 +0100 +Subject: HID: hidraw: Fix returning EPOLLOUT from hidraw_poll + +From: Marcel Holtmann + +[ Upstream commit 9f3b61dc1dd7b81e99e7ed23776bb64a35f39e1a ] + +When polling a connected /dev/hidrawX device, it is useful to get the +EPOLLOUT when writing is possible. Since writing is possible as soon as +the device is connected, always return it. + +Right now EPOLLOUT is only returned when there are also input reports +are available. This works if devices start sending reports when +connected, but some HID devices might need an output report first before +sending any input reports. This change will allow using EPOLLOUT here as +well. + +Fixes: 378b80370aa1 ("hidraw: Return EPOLLOUT from hidraw_poll") +Signed-off-by: Marcel Holtmann +Cc: stable@vger.kernel.org +Signed-off-by: Jiri Kosina +Signed-off-by: Sasha Levin +--- + drivers/hid/hidraw.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/hid/hidraw.c b/drivers/hid/hidraw.c +index 225456c1a39a..290f7f7817d3 100644 +--- a/drivers/hid/hidraw.c ++++ b/drivers/hid/hidraw.c +@@ -260,10 +260,10 @@ static unsigned int hidraw_poll(struct file *file, poll_table *wait) + + poll_wait(file, &list->hidraw->wait, wait); + if (list->head != list->tail) +- return POLLIN | POLLRDNORM | POLLOUT; ++ return POLLIN | POLLRDNORM; + if (!list->hidraw->exist) + return POLLERR | POLLHUP; +- return 0; ++ return POLLOUT | POLLWRNORM; + } + + static int hidraw_open(struct inode *inode, struct file *file) +-- +2.20.1 + diff --git a/queue-4.9/hid-hidraw-uhid-always-report-epollout.patch b/queue-4.9/hid-hidraw-uhid-always-report-epollout.patch new file mode 100644 index 00000000000..ee09050be7f --- /dev/null +++ b/queue-4.9/hid-hidraw-uhid-always-report-epollout.patch @@ -0,0 +1,69 @@ +From a82f3cb787e78a81ffda7a125d5b36c893ff1457 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 10 Jan 2020 15:32:51 +0100 +Subject: HID: hidraw, uhid: Always report EPOLLOUT + +From: Jiri Kosina + +[ Upstream commit 9e635c2851df6caee651e589fbf937b637973c91 ] + +hidraw and uhid device nodes are always available for writing so we should +always report EPOLLOUT and EPOLLWRNORM bits, not only in the cases when +there is nothing to read. + +Reported-by: Linus Torvalds +Fixes: be54e7461ffdc ("HID: uhid: Fix returning EPOLLOUT from uhid_char_poll") +Fixes: 9f3b61dc1dd7b ("HID: hidraw: Fix returning EPOLLOUT from hidraw_poll") +Signed-off-by: Jiri Kosina +Signed-off-by: Sasha Levin +--- + drivers/hid/hidraw.c | 7 ++++--- + drivers/hid/uhid.c | 5 +++-- + 2 files changed, 7 insertions(+), 5 deletions(-) + +diff --git a/drivers/hid/hidraw.c b/drivers/hid/hidraw.c +index 290f7f7817d3..ed6591f92f71 100644 +--- a/drivers/hid/hidraw.c ++++ b/drivers/hid/hidraw.c +@@ -257,13 +257,14 @@ out: + static unsigned int hidraw_poll(struct file *file, poll_table *wait) + { + struct hidraw_list *list = file->private_data; ++ unsigned int mask = POLLOUT | POLLWRNORM; /* hidraw is always writable */ + + poll_wait(file, &list->hidraw->wait, wait); + if (list->head != list->tail) +- return POLLIN | POLLRDNORM; ++ mask |= POLLIN | POLLRDNORM; + if (!list->hidraw->exist) +- return POLLERR | POLLHUP; +- return POLLOUT | POLLWRNORM; ++ mask |= POLLERR | POLLHUP; ++ return mask; + } + + static int hidraw_open(struct inode *inode, struct file *file) +diff --git a/drivers/hid/uhid.c b/drivers/hid/uhid.c +index d9b46da0e0aa..731a7b3e0187 100644 +--- a/drivers/hid/uhid.c ++++ b/drivers/hid/uhid.c +@@ -769,13 +769,14 @@ unlock: + static unsigned int uhid_char_poll(struct file *file, poll_table *wait) + { + struct uhid_device *uhid = file->private_data; ++ unsigned int mask = POLLOUT | POLLWRNORM; /* uhid is always writable */ + + poll_wait(file, &uhid->waitq, wait); + + if (uhid->head != uhid->tail) +- return POLLIN | POLLRDNORM; ++ mask |= POLLIN | POLLRDNORM; + +- return EPOLLOUT | EPOLLWRNORM; ++ return mask; + } + + static const struct file_operations uhid_fops = { +-- +2.20.1 + diff --git a/queue-4.9/hidraw-return-epollout-from-hidraw_poll.patch b/queue-4.9/hidraw-return-epollout-from-hidraw_poll.patch new file mode 100644 index 00000000000..00ea2400092 --- /dev/null +++ b/queue-4.9/hidraw-return-epollout-from-hidraw_poll.patch @@ -0,0 +1,40 @@ +From 4f098fbd838c3dcb020a86661e2efe4b445df45f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 9 Jul 2019 13:03:37 +0200 +Subject: hidraw: Return EPOLLOUT from hidraw_poll + +From: Fabian Henneke + +[ Upstream commit 378b80370aa1fe50f9c48a3ac8af3e416e73b89f ] + +Always return EPOLLOUT from hidraw_poll when a device is connected. +This is safe since writes are always possible (but will always block). + +hidraw does not support non-blocking writes and instead always calls +blocking backend functions on write requests. Hence, so far, a call to +poll never returned EPOLLOUT, which confuses tools like socat. + +Signed-off-by: Fabian Henneke +In-reply-to: +Signed-off-by: Jiri Kosina +Signed-off-by: Sasha Levin +--- + drivers/hid/hidraw.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/hid/hidraw.c b/drivers/hid/hidraw.c +index 750c16897130..225456c1a39a 100644 +--- a/drivers/hid/hidraw.c ++++ b/drivers/hid/hidraw.c +@@ -260,7 +260,7 @@ static unsigned int hidraw_poll(struct file *file, poll_table *wait) + + poll_wait(file, &list->hidraw->wait, wait); + if (list->head != list->tail) +- return POLLIN | POLLRDNORM; ++ return POLLIN | POLLRDNORM | POLLOUT; + if (!list->hidraw->exist) + return POLLERR | POLLHUP; + return 0; +-- +2.20.1 + diff --git a/queue-4.9/series b/queue-4.9/series new file mode 100644 index 00000000000..4d1cfae346e --- /dev/null +++ b/queue-4.9/series @@ -0,0 +1,3 @@ +hidraw-return-epollout-from-hidraw_poll.patch +hid-hidraw-fix-returning-epollout-from-hidraw_poll.patch +hid-hidraw-uhid-always-report-epollout.patch -- 2.47.3