Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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>

authored by

Caleb Sander Mateos and committed by
Jens Axboe
1ceeedb5 8a8fe42d

+8 -1
+8 -1
drivers/block/ublk_drv.c
··· 2030 2030 struct ublk_queue *ubq = rq->mq_hctx->driver_data; 2031 2031 struct ublk_io *io = &ubq->ios[rq->tag]; 2032 2032 2033 - ublk_put_req_ref(ubq, io, rq); 2033 + /* 2034 + * task_registered_buffers may be 0 if buffers were registered off task 2035 + * but unregistered on task. Or after UBLK_IO_COMMIT_AND_FETCH_REQ. 2036 + */ 2037 + if (current == io->task && io->task_registered_buffers) 2038 + io->task_registered_buffers--; 2039 + else 2040 + ublk_put_req_ref(ubq, io, rq); 2034 2041 } 2035 2042 2036 2043 static int ublk_register_io_buf(struct io_uring_cmd *cmd,