Message ID | 20200207121828.105456-1-sgarzare@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | io_uring: flush overflowed CQ events in the io_uring_poll() | expand |
On 2/7/20 5:18 AM, Stefano Garzarella wrote: > In io_uring_poll() we must flush overflowed CQ events before to > check if there are CQ events available, to avoid missing events. > > We call the io_cqring_events() that checks and flushes any overflow > and returns the number of CQ events available. > > We can avoid taking the 'uring_lock' since the flush is already > protected by 'completion_lock'. Thanks, applied. I dropped that last sentence, as a) it doesn't really matter, and b) we may very well already have it held here if someone is doing a poll on the io_uring fd itself.
On Fri, Feb 07, 2020 at 09:12:39AM -0700, Jens Axboe wrote: > On 2/7/20 5:18 AM, Stefano Garzarella wrote: > > In io_uring_poll() we must flush overflowed CQ events before to > > check if there are CQ events available, to avoid missing events. > > > > We call the io_cqring_events() that checks and flushes any overflow > > and returns the number of CQ events available. > > > > We can avoid taking the 'uring_lock' since the flush is already > > protected by 'completion_lock'. > > Thanks, applied. I dropped that last sentence, as a) it doesn't > really matter, and b) we may very well already have it held here > if someone is doing a poll on the io_uring fd itself. Sure, indeed I was undecided whether to put it after the three dashes as a response to your yesterday's request. Thanks, Stefano
diff --git a/fs/io_uring.c b/fs/io_uring.c index 77f22c3da30f..02e77e86abaf 100644 --- a/fs/io_uring.c +++ b/fs/io_uring.c @@ -6301,7 +6301,7 @@ static __poll_t io_uring_poll(struct file *file, poll_table *wait) if (READ_ONCE(ctx->rings->sq.tail) - ctx->cached_sq_head != ctx->rings->sq_ring_entries) mask |= EPOLLOUT | EPOLLWRNORM; - if (READ_ONCE(ctx->rings->cq.head) != ctx->cached_cq_tail) + if (io_cqring_events(ctx, false)) mask |= EPOLLIN | EPOLLRDNORM; return mask;
In io_uring_poll() we must flush overflowed CQ events before to check if there are CQ events available, to avoid missing events. We call the io_cqring_events() that checks and flushes any overflow and returns the number of CQ events available. We can avoid taking the 'uring_lock' since the flush is already protected by 'completion_lock'. Signed-off-by: Stefano Garzarella <sgarzare@redhat.com> --- fs/io_uring.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)