On Fri, Jun 20, 2025 at 09:10:06AM -0600, Caleb Sander Mateos wrote: > 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@xxxxxxxxxxxxxxx> > --- > drivers/block/ublk_drv.c | 9 ++++++++- > 1 file changed, 8 insertions(+), 1 deletion(-) > > diff --git a/drivers/block/ublk_drv.c b/drivers/block/ublk_drv.c > index b2925e15279a..199028f36ec8 100644 > --- a/drivers/block/ublk_drv.c > +++ b/drivers/block/ublk_drv.c > @@ -2012,11 +2012,18 @@ static void ublk_io_release(void *priv) > { > struct request *rq = 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); > } Reviewed-by: Ming Lei <ming.lei@xxxxxxxxxx> Thanks, Ming