• Pavel Begunkov's avatar
    io_uring: ctx-wide rsrc nodes · a7f0ed5a
    Pavel Begunkov authored
    If we're going to ever support multiple types of resources we need
    shared rsrc nodes to not bloat requests, that is implemented in this
    patch. It also gives a nicer API and saves one pointer dereference
    in io_req_set_rsrc_node().
    
    We may say that all requests bound to a resource belong to one and only
    one rsrc node, and considering that nodes are removed and recycled
    strictly in-order, this separates requests into generations, where
    generation are changed on each node switch (i.e. io_rsrc_node_switch()).
    
    The API is simple, io_rsrc_node_switch() switches to a new generation if
    needed, and also optionally kills a passed in io_rsrc_data. Each call to
    io_rsrc_node_switch() have to be preceded with
    io_rsrc_node_switch_start(). The start function is idempotent and should
    not necessarily be followed by switch.
    
    One difference is that once a node was set it will always retain a valid
    rsrc node, even on unregister. It may be a nuisance at the moment, but
    makes much sense for multiple types of resources. Another thing changed
    is that nodes are bound to/associated with a io_rsrc_data later just
    before killing (i.e. switching).
    Signed-off-by: default avatarPavel Begunkov <asml.silence@gmail.com>
    Link: https://lore.kernel.org/r/7e9c693b4b9a2f47aa784b616ce29843021bb65a.1617287883.git.asml.silence@gmail.comSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
    a7f0ed5a
io_uring.c 244 KB