io_uring: remove unnecessary barrier before wq_has_sleeper [Linux 5.1]

io_uring: remove unnecessary barrier before wq_has_sleeper [Linux 5.1]

This Linux kernel change "io_uring: remove unnecessary barrier before wq_has_sleeper" 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:17 2019 +0200. The commit for this change in Linux stable tree is 4f7067c (patch).

io_uring: remove unnecessary barrier before wq_has_sleeper

wq_has_sleeper has a full barrier internally. The smp_rmb barrier in
io_uring_poll synchronizes with it.

Signed-off-by: Stefan Bühler <[email protected]>
Signed-off-by: Jens Axboe <[email protected]>

There are 11 lines of Linux source code added/deleted in this change. Code changes to Linux kernel are as follows.

 fs/io_uring.c | 11 ++++-------
 1 file changed, 4 insertions(+), 7 deletions(-)

diff --git a/fs/io_uring.c b/fs/io_uring.c
index 7ab93e8..bb71b7f 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -418,12 +418,6 @@ static void io_commit_cqring(struct io_ring_ctx *ctx)
        /* order cqe stores with ring update */
        smp_store_release(&ring->r.tail, ctx->cached_cq_tail);

-       /*
-        * Write sider barrier of tail update, app has read side. See
-        * comment at the top of this file.
-        */
-       smp_wmb();
-
        if (wq_has_sleeper(&ctx->cq_wait)) {
            wake_up_interruptible(&ctx->cq_wait);
            kill_fasync(&ctx->cq_fasync, SIGIO, POLL_IN);
@@ -2677,7 +2671,10 @@ static __poll_t io_uring_poll(struct file *file, poll_table *wait)
    __poll_t mask = 0;

    poll_wait(file, &ctx->cq_wait, wait);
-   /* See comment at the top of this file */
+   /*
+    * synchronizes with barrier from wq_has_sleeper call in
+    * io_commit_cqring
+    */
    smp_rmb();
    if (READ_ONCE(ctx->sq_ring->r.tail) - ctx->cached_sq_head !=
        ctx->sq_ring->ring_entries)

Leave a Reply

Your email address will not be published. Required fields are marked *