• Xiaoguang Wang's avatar
    io_uring: refactor file register/unregister/update handling · 05589553
    Xiaoguang Wang authored
    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/#tSigned-off-by: default avatarXiaoguang Wang <xiaoguang.wang@linux.alibaba.com>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    05589553
io_uring.c 189 KB