This Linux kernel change "io_uring: remove unnecessary barrier before reading cq head" is included in the Linux 5.1 release. This change is authored by Stefan Bühler <source [at] stbuehler.de> on Wed Apr 24 23:54:18 2019 +0200. The commit for this change in Linux stable tree is 115e12e (patch).
io_uring: remove unnecessary barrier before reading cq head The memory operations before reading cq head are unrelated and we don't care about their order. Document that the control dependency in combination with READ_ONCE and WRITE_ONCE forms a barrier we need. Signed-off-by: Stefan Bühler <[email protected]> Signed-off-by: Jens Axboe <[email protected]>
There are 7 lines of Linux source code added/deleted in this change. Code changes to Linux kernel are as follows.
fs/io_uring.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/fs/io_uring.c b/fs/io_uring.c index bb71b7f..3671a65 100644 --- a/fs/io_uring.c +++ b/fs/io_uring.c @@ -431,8 +431,11 @@ static struct io_uring_cqe *io_get_cqring(struct io_ring_ctx *ctx) unsigned tail; tail = ctx->cached_cq_tail; - /* See comment at the top of the file */ - smp_rmb(); + /* + * writes to the cq entry need to come after reading head; the + * control dependency is enough as we're using WRITE_ONCE to + * fill the cq entry + */ if (tail - READ_ONCE(ring->r.head) == ring->ring_entries) return NULL;