On 02/06/2020 15:34, Pavel Begunkov wrote: > Trying to use them with IORING_SETUP_IOPOLL: > > RIP: 0010:io_iopoll_getevents+0x111/0x5a0 > Call Trace: > ? _raw_spin_unlock_irqrestore+0x24/0x40 > ? do_send_sig_info+0x64/0x90 > io_iopoll_reap_events.part.0+0x5e/0xa0 > io_ring_ctx_wait_and_kill+0x132/0x1c0 > io_uring_release+0x20/0x30 > __fput+0xcd/0x230 > ____fput+0xe/0x10 > task_work_run+0x67/0xa0 > do_exit+0x353/0xb10 > ? handle_mm_fault+0xd4/0x200 > ? syscall_trace_enter+0x18c/0x2c0 > do_group_exit+0x43/0xa0 > __x64_sys_exit_group+0x18/0x20 > do_syscall_64+0x60/0x1e0 > entry_SYSCALL_64_after_hwframe+0x44/0xa9 io_do_iopoll() { ... ret = kiocb->*ki_filp*->f_op->iopoll(kiocb, spin); } Hmm, I'll double check later that only read*/write* can be done with IOPOLL, and send a follow-up patch if necessary. > > Also SQPOLL thread can't know which file table to use with > open/close. Disallow all these cases. > > Signed-off-by: Pavel Begunkov <asml.silence@xxxxxxxxx> > --- > fs/io_uring.c | 8 ++++++++ > 1 file changed, 8 insertions(+) > > diff --git a/fs/io_uring.c b/fs/io_uring.c > index 732ec73ec3c0..7208f91e9e77 100644 > --- a/fs/io_uring.c > +++ b/fs/io_uring.c > @@ -2990,6 +2990,8 @@ static int io_openat_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe) > const char __user *fname; > int ret; > > + if (unlikely(req->ctx->flags & (IORING_SETUP_IOPOLL|IORING_SETUP_SQPOLL))) > + return -EINVAL; > if (sqe->ioprio || sqe->buf_index) > return -EINVAL; > if (req->flags & REQ_F_FIXED_FILE) > @@ -3023,6 +3025,8 @@ static int io_openat2_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe) > size_t len; > int ret; > > + if (unlikely(req->ctx->flags & (IORING_SETUP_IOPOLL|IORING_SETUP_SQPOLL))) > + return -EINVAL; > if (sqe->ioprio || sqe->buf_index) > return -EINVAL; > if (req->flags & REQ_F_FIXED_FILE) > @@ -3373,6 +3377,8 @@ static int io_fadvise(struct io_kiocb *req, bool force_nonblock) > > static int io_statx_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe) > { > + if (unlikely(req->ctx->flags & IORING_SETUP_IOPOLL)) > + return -EINVAL; > if (sqe->ioprio || sqe->buf_index) > return -EINVAL; > if (req->flags & REQ_F_FIXED_FILE) > @@ -3417,6 +3423,8 @@ static int io_close_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe) > */ > req->work.flags |= IO_WQ_WORK_NO_CANCEL; > > + if (unlikely(req->ctx->flags & (IORING_SETUP_IOPOLL|IORING_SETUP_SQPOLL))) > + return -EINVAL; > if (sqe->ioprio || sqe->off || sqe->addr || sqe->len || > sqe->rw_flags || sqe->buf_index) > return -EINVAL; > -- Pavel Begunkov