]> git.baikalelectronics.ru Git - kernel.git/commit
io_uring: avoid ring quiesce for fixed file set unregister and update
authorJens Axboe <axboe@kernel.dk>
Mon, 9 Dec 2019 18:22:50 +0000 (11:22 -0700)
committerJens Axboe <axboe@kernel.dk>
Tue, 21 Jan 2020 00:03:50 +0000 (17:03 -0700)
commit617803dc1ab8dbd09d3865c67348dd32e9179286
tree12408872bb2940e587749e2a80a9ef084eaed869
parent49cd3c774d5dd0f30a545638b6a3a92e196d902c
io_uring: avoid ring quiesce for fixed file set unregister and update

We currently fully quiesce the ring before an unregister or update of
the fixed fileset. This is very expensive, and we can be a bit smarter
about this.

Add a percpu refcount for the file tables as a whole. Grab a percpu ref
when we use a registered file, and put it on completion. This is cheap
to do. Upon removal of a file from a set, switch the ref count to atomic
mode. When we hit zero ref on the completion side, then we know we can
drop the previously registered files. When the old files have been
dropped, switch the ref back to percpu mode for normal operation.

Since there's a period between doing the update and the kernel being
done with it, add a IORING_OP_FILES_UPDATE opcode that can perform the
same action. The application knows the update has completed when it gets
the CQE for it. Between doing the update and receiving this completion,
the application must continue to use the unregistered fd if submitting
IO on this particular file.

This takes the runtime of test/file-register from liburing from 14s to
about 0.7s.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/io_uring.c
include/uapi/linux/io_uring.h