From e3346f0dffcf225a05eb8826aa08380f89ed62bf Mon Sep 17 00:00:00 2001 From: Sasha Levin Date: Tue, 14 Jan 2020 21:49:07 -0500 Subject: [PATCH] fixes for 4.19 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.19/series | 3 + 4 files changed, 160 insertions(+) create mode 100644 queue-4.19/hid-hidraw-fix-returning-epollout-from-hidraw_poll.patch create mode 100644 queue-4.19/hid-hidraw-uhid-always-report-epollout.patch create mode 100644 queue-4.19/hidraw-return-epollout-from-hidraw_poll.patch create mode 100644 queue-4.19/series diff --git a/queue-4.19/hid-hidraw-fix-returning-epollout-from-hidraw_poll.patch b/queue-4.19/hid-hidraw-fix-returning-epollout-from-hidraw_poll.patch new file mode 100644 index 00000000000..055df6508ac --- /dev/null +++ b/queue-4.19/hid-hidraw-fix-returning-epollout-from-hidraw_poll.patch @@ -0,0 +1,48 @@ +From f3cd5b3c0d811db627b5018dc9eada0638487f12 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 c75b66d58636..a025b6961896 100644 +--- a/drivers/hid/hidraw.c ++++ b/drivers/hid/hidraw.c +@@ -260,10 +260,10 @@ static __poll_t hidraw_poll(struct file *file, poll_table *wait) + + poll_wait(file, &list->hidraw->wait, wait); + if (list->head != list->tail) +- return EPOLLIN | EPOLLRDNORM | EPOLLOUT; ++ return EPOLLIN | EPOLLRDNORM; + if (!list->hidraw->exist) + return EPOLLERR | EPOLLHUP; +- return 0; ++ return EPOLLOUT | EPOLLWRNORM; + } + + static int hidraw_open(struct inode *inode, struct file *file) +-- +2.20.1 + diff --git a/queue-4.19/hid-hidraw-uhid-always-report-epollout.patch b/queue-4.19/hid-hidraw-uhid-always-report-epollout.patch new file mode 100644 index 00000000000..bd97acecf16 --- /dev/null +++ b/queue-4.19/hid-hidraw-uhid-always-report-epollout.patch @@ -0,0 +1,69 @@ +From 8463233399307d149345276e9bf61229fd27f976 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 a025b6961896..c4ba2d28dd73 100644 +--- a/drivers/hid/hidraw.c ++++ b/drivers/hid/hidraw.c +@@ -257,13 +257,14 @@ out: + static __poll_t hidraw_poll(struct file *file, poll_table *wait) + { + struct hidraw_list *list = file->private_data; ++ __poll_t mask = EPOLLOUT | EPOLLWRNORM; /* hidraw is always writable */ + + poll_wait(file, &list->hidraw->wait, wait); + if (list->head != list->tail) +- return EPOLLIN | EPOLLRDNORM; ++ mask |= EPOLLIN | EPOLLRDNORM; + if (!list->hidraw->exist) +- return EPOLLERR | EPOLLHUP; +- return EPOLLOUT | EPOLLWRNORM; ++ mask |= EPOLLERR | EPOLLHUP; ++ 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 8508dbac2657..29e63330c1b5 100644 +--- a/drivers/hid/uhid.c ++++ b/drivers/hid/uhid.c +@@ -769,13 +769,14 @@ unlock: + static __poll_t uhid_char_poll(struct file *file, poll_table *wait) + { + struct uhid_device *uhid = file->private_data; ++ __poll_t mask = EPOLLOUT | EPOLLWRNORM; /* uhid is always writable */ + + poll_wait(file, &uhid->waitq, wait); + + if (uhid->head != uhid->tail) +- return EPOLLIN | EPOLLRDNORM; ++ mask |= EPOLLIN | EPOLLRDNORM; + +- return EPOLLOUT | EPOLLWRNORM; ++ return mask; + } + + static const struct file_operations uhid_fops = { +-- +2.20.1 + diff --git a/queue-4.19/hidraw-return-epollout-from-hidraw_poll.patch b/queue-4.19/hidraw-return-epollout-from-hidraw_poll.patch new file mode 100644 index 00000000000..c4f19d033ef --- /dev/null +++ b/queue-4.19/hidraw-return-epollout-from-hidraw_poll.patch @@ -0,0 +1,40 @@ +From 4b0bb801751ef1d2e2464336003bc34fd30678e8 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 c7cff929b419..c75b66d58636 100644 +--- a/drivers/hid/hidraw.c ++++ b/drivers/hid/hidraw.c +@@ -260,7 +260,7 @@ static __poll_t hidraw_poll(struct file *file, poll_table *wait) + + poll_wait(file, &list->hidraw->wait, wait); + if (list->head != list->tail) +- return EPOLLIN | EPOLLRDNORM; ++ return EPOLLIN | EPOLLRDNORM | EPOLLOUT; + if (!list->hidraw->exist) + return EPOLLERR | EPOLLHUP; + return 0; +-- +2.20.1 + diff --git a/queue-4.19/series b/queue-4.19/series new file mode 100644 index 00000000000..4d1cfae346e --- /dev/null +++ b/queue-4.19/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