io_uring: always go async for unsupported fadvise flags
authorDylan Yudaken <dylany@meta.com>
Fri, 27 Jan 2023 13:52:26 +0000 (05:52 -0800)
committerJens Axboe <axboe@kernel.dk>
Sun, 29 Jan 2023 22:18:26 +0000 (15:18 -0700)
No point in issuing -> return -EAGAIN -> go async, when it can be done upfront.

Signed-off-by: Dylan Yudaken <dylany@meta.com>
Link: https://lore.kernel.org/r/20230127135227.3646353-4-dylany@meta.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
io_uring/advise.c

index cf600579bffe886043c44b45db01c3c5a181f6bd..7085804c513c09aba69c9d04d04bc3f90c3bbf6d 100644 (file)
@@ -62,6 +62,18 @@ int io_madvise(struct io_kiocb *req, unsigned int issue_flags)
 #endif
 }
 
+static bool io_fadvise_force_async(struct io_fadvise *fa)
+{
+       switch (fa->advice) {
+       case POSIX_FADV_NORMAL:
+       case POSIX_FADV_RANDOM:
+       case POSIX_FADV_SEQUENTIAL:
+               return false;
+       default:
+               return true;
+       }
+}
+
 int io_fadvise_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
 {
        struct io_fadvise *fa = io_kiocb_to_cmd(req, struct io_fadvise);
@@ -72,6 +84,8 @@ int io_fadvise_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
        fa->offset = READ_ONCE(sqe->off);
        fa->len = READ_ONCE(sqe->len);
        fa->advice = READ_ONCE(sqe->fadvise_advice);
+       if (io_fadvise_force_async(fa))
+               req->flags |= REQ_F_FORCE_ASYNC;
        return 0;
 }
 
@@ -80,16 +94,7 @@ int io_fadvise(struct io_kiocb *req, unsigned int issue_flags)
        struct io_fadvise *fa = io_kiocb_to_cmd(req, struct io_fadvise);
        int ret;
 
-       if (issue_flags & IO_URING_F_NONBLOCK) {
-               switch (fa->advice) {
-               case POSIX_FADV_NORMAL:
-               case POSIX_FADV_RANDOM:
-               case POSIX_FADV_SEQUENTIAL:
-                       break;
-               default:
-                       return -EAGAIN;
-               }
-       }
+       WARN_ON_ONCE(issue_flags & IO_URING_F_NONBLOCK && io_fadvise_force_async(fa));
 
        ret = vfs_fadvise(req->file, fa->offset, fa->len, fa->advice);
        if (ret < 0)