David Howells ec03510e0a watch_queue: Fix lack of barrier/sync/lock between post and read
commit 2ed147f015af2b48f41c6f0b6746aa9ea85c19f3 upstream.

There's nothing to synchronise post_one_notification() versus
pipe_read().  Whilst posting is done under pipe->rd_wait.lock, the
reader only takes pipe->mutex which cannot bar notification posting as
that may need to be made from contexts that cannot sleep.

Fix this by setting pipe->head with a barrier in post_one_notification()
and reading pipe->head with a barrier in pipe_read().

If that's not sufficient, the rd_wait.lock will need to be taken,
possibly in a ->confirm() op so that it only applies to notifications.
The lock would, however, have to be dropped before copy_page_to_iter()
is invoked.

Fixes: c73be61cede5 ("pipe: Add general notification queue support")
Reported-by: Jann Horn <jannh@google.com>
Signed-off-by: David Howells <dhowells@redhat.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2022-03-16 14:16:02 +01:00
..
2020-10-16 11:11:22 -07:00
2021-09-18 13:40:15 +02:00
2021-11-18 14:04:15 +01:00
2021-07-14 16:56:12 +02:00
2020-09-10 14:03:31 -07:00
2021-12-22 09:30:57 +01:00
2020-08-04 21:02:38 -04:00
2021-11-26 10:39:22 +01:00
2020-07-31 08:16:01 +02:00
2020-10-23 11:33:41 -07:00
2020-10-23 11:33:41 -07:00
2021-12-14 11:32:40 +01:00
2020-10-24 12:40:18 -07:00
2020-08-27 16:06:47 -04:00
2020-07-31 08:16:01 +02:00