linux-stable/io_uring
Pavel Begunkov 154cdff899 io_uring/poll: fix double poll req->flags races
[ Upstream commit 30a33669fa ]

io_poll_double_prepare()            | io_poll_wake()
                                    | poll->head = NULL
smp_load(&poll->head); /* NULL */   |
flags = req->flags;                 |
                                    | req->flags &= ~SINGLE_POLL;
req->flags = flags | DOUBLE_POLL    |

The idea behind io_poll_double_prepare() is to serialise with the
first poll entry by taking the wq lock. However, it's not safe to assume
that io_poll_wake() is not running when we can't grab the lock and so we
may race modifying req->flags.

Skip double poll setup if that happens. It's ok because the first poll
entry will only be removed when it's definitely completing, e.g.
pollfree or oneshot with a valid mask.

Fixes: 49f1c68e04 ("io_uring: optimise submission side poll_refs")
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Link: https://lore.kernel.org/r/b7fab2d502f6121a7d7b199fe4d914a43ca9cdfd.1668184658.git.asml.silence@gmail.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2022-11-26 09:27:33 +01:00
..
advise.c io_uring: make io_kiocb_to_cmd() typesafe 2022-08-12 17:01:00 -06:00
advise.h
alloc_cache.h
cancel.c io_uring: fix off-by-one in sync cancelation file check 2022-08-23 07:26:08 -06:00
cancel.h
epoll.c io_uring: make io_kiocb_to_cmd() typesafe 2022-08-12 17:01:00 -06:00
epoll.h
fdinfo.c io_uring: fix fdinfo sqe offsets calculation 2022-10-21 12:39:29 +02:00
fdinfo.h
filetable.c
filetable.h
fs.c io_uring: make io_kiocb_to_cmd() typesafe 2022-08-12 17:01:00 -06:00
fs.h
io-wq.c io-wq: Fix memory leak in worker creation 2022-10-26 12:22:57 +02:00
io-wq.h
io_uring.c io_uring: calculate CQEs from the user visible value 2022-11-26 09:27:29 +01:00
io_uring.h io_uring: don't gate task_work run on TIF_NOTIFY_SIGNAL 2022-10-29 10:08:35 +02:00
kbuf.c io_uring: check for rollover of buffer ID when providing buffers 2022-11-16 10:04:09 +01:00
kbuf.h io_uring/kbuf: fix not advancing READV kbuf ring 2022-09-07 10:36:10 -06:00
Makefile
msg_ring.c io_uring/msg_ring: Fix NULL pointer dereference in io_msg_send_fd() 2022-10-29 10:08:35 +02:00
msg_ring.h
net.c io_uring/net: fail zc send when unsupported by socket 2022-10-26 12:22:55 +02:00
net.h io_uring/net: rename io_sendzc() 2022-10-21 12:39:27 +02:00
nop.c
nop.h
notif.c io_uring/notif: Remove the unused function io_notif_complete() 2022-09-05 11:42:39 -06:00
notif.h io_uring/net: simplify zerocopy send user API 2022-09-01 09:13:33 -06:00
opdef.c io_uring/net: rename io_sendzc() 2022-10-21 12:39:27 +02:00
opdef.h io_uring: add custom opcode hooks on fail 2022-10-21 12:37:32 +02:00
openclose.c io_uring: make io_kiocb_to_cmd() typesafe 2022-08-12 17:01:00 -06:00
openclose.h
poll.c io_uring/poll: fix double poll req->flags races 2022-11-26 09:27:33 +01:00
poll.h
refs.h
rsrc.c io_uring/af_unix: defer registered files gc to io_uring release 2022-10-21 12:37:33 +02:00
rsrc.h Revert "io_uring: rename IORING_OP_FILES_UPDATE" 2022-09-01 09:13:33 -06:00
rw.c io_uring/rw: remove leftover debug statement 2022-10-29 10:08:33 +02:00
rw.h io_uring/rw: don't lose partial IO result on fail 2022-10-21 12:37:32 +02:00
slist.h
splice.c io_uring: make io_kiocb_to_cmd() typesafe 2022-08-12 17:01:00 -06:00
splice.h
sqpoll.c
sqpoll.h
statx.c io_uring: make io_kiocb_to_cmd() typesafe 2022-08-12 17:01:00 -06:00
statx.h
sync.c io_uring: make io_kiocb_to_cmd() typesafe 2022-08-12 17:01:00 -06:00
sync.h
tctx.c
tctx.h
timeout.c io_uring: make io_kiocb_to_cmd() typesafe 2022-08-12 17:01:00 -06:00
timeout.h
uring_cmd.c lsm/stable-6.0 PR 20220829 2022-08-31 09:23:16 -07:00
uring_cmd.h
xattr.c io_uring: make io_kiocb_to_cmd() typesafe 2022-08-12 17:01:00 -06:00
xattr.h