]> git.baikalelectronics.ru Git - kernel.git/commit
io_uring: refactor file register/unregister/update handling
authorXiaoguang Wang <xiaoguang.wang@linux.alibaba.com>
Tue, 31 Mar 2020 06:05:18 +0000 (14:05 +0800)
committerJens Axboe <axboe@kernel.dk>
Tue, 31 Mar 2020 14:47:54 +0000 (08:47 -0600)
commit94fb5e69010529b568a1aa6cbc8d19b4239d9aa4
tree407425dc65c1a466b8c7a8691373cfb95218f56e
parentd4e6d4a52226d44829e9eddb6d03a26fb7fa5c04
io_uring: refactor file register/unregister/update handling

While diving into io_uring fileset register/unregister/update codes, we
found one bug in the fileset update handling. io_uring fileset update
use a percpu_ref variable to check whether we can put the previously
registered file, only when the refcnt of the perfcpu_ref variable
reaches zero, can we safely put these files. But this doesn't work so
well. If applications always issue requests continually, this
perfcpu_ref will never have an chance to reach zero, and it'll always be
in atomic mode, also will defeat the gains introduced by fileset
register/unresiger/update feature, which are used to reduce the atomic
operation overhead of fput/fget.

To fix this issue, while applications do IORING_REGISTER_FILES or
IORING_REGISTER_FILES_UPDATE operations, we allocate a new percpu_ref
and kill the old percpu_ref, new requests will use the new percpu_ref.
Once all previous old requests complete, old percpu_refs will be dropped
and registered files will be put safely.

Link: https://lore.kernel.org/io-uring/5a8dac33-4ca2-4847-b091-f7dcd3ad0ff3@linux.alibaba.com/T/#t
Signed-off-by: Xiaoguang Wang <xiaoguang.wang@linux.alibaba.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/io_uring.c