mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-18 22:14:16 +00:00
ublk: optimize UBLK_IO_UNREGISTER_IO_BUF on daemon task
ublk_io_release() performs an expensive atomic refcount decrement. This atomic operation is unnecessary in the common case where the request's buffer is registered and unregistered on the daemon task before handling UBLK_IO_COMMIT_AND_FETCH_REQ for the I/O. So if ublk_io_release() is called on the daemon task and task_registered_buffers is positive, just decrement task_registered_buffers (nonatomically). ublk_sub_req_ref() will apply this decrement when it atomically subtracts from io->ref. Signed-off-by: Caleb Sander Mateos <csander@purestorage.com> Reviewed-by: Ming Lei <ming.lei@redhat.com> Link: https://lore.kernel.org/r/20250620151008.3976463-13-csander@purestorage.com Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
8a8fe42d76
commit
1ceeedb597
1 changed files with 8 additions and 1 deletions
|
@ -2030,7 +2030,14 @@ static void ublk_io_release(void *priv)
|
|||
struct ublk_queue *ubq = rq->mq_hctx->driver_data;
|
||||
struct ublk_io *io = &ubq->ios[rq->tag];
|
||||
|
||||
ublk_put_req_ref(ubq, io, rq);
|
||||
/*
|
||||
* task_registered_buffers may be 0 if buffers were registered off task
|
||||
* but unregistered on task. Or after UBLK_IO_COMMIT_AND_FETCH_REQ.
|
||||
*/
|
||||
if (current == io->task && io->task_registered_buffers)
|
||||
io->task_registered_buffers--;
|
||||
else
|
||||
ublk_put_req_ref(ubq, io, rq);
|
||||
}
|
||||
|
||||
static int ublk_register_io_buf(struct io_uring_cmd *cmd,
|
||||
|
|
Loading…
Add table
Reference in a new issue