• Jens Axboe's avatar
    io_uring/kbuf: use vm_insert_pages() for mmap'ed pbuf ring · 87585b05
    Jens Axboe authored
    Rather than use remap_pfn_range() for this and manually free later,
    switch to using vm_insert_page() and have it Just Work.
    
    This requires a bit of effort on the mmap lookup side, as the ctx
    uring_lock isn't held, which  otherwise protects buffer_lists from being
    torn down, and it's not safe to grab from mmap context that would
    introduce an ABBA deadlock between the mmap lock and the ctx uring_lock.
    Instead, lookup the buffer_list under RCU, as the the list is RCU freed
    already. Use the existing reference count to determine whether it's
    possible to safely grab a reference to it (eg if it's not zero already),
    and drop that reference when done with the mapping. If the mmap
    reference is the last one, the buffer_list and the associated memory can
    go away, since the vma insertion has references to the inserted pages at
    that point.
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    87585b05
io_uring.h 13 KB