On Mon, Apr 28, 2025 at 2:45 AM Ming Lei <ming.lei@xxxxxxxxxx> wrote: > > Convert to refcount_t and prepare for supporting to register bvec buffer > automatically, which needs to initialize reference counter as 2, and > kref doesn't provide this interface, so convert to refcount_t. > > Suggested-by: Caleb Sander Mateos <csander@xxxxxxxxxxxxxxx> > Signed-off-by: Ming Lei <ming.lei@xxxxxxxxxx> > --- > drivers/block/ublk_drv.c | 19 +++++-------------- > 1 file changed, 5 insertions(+), 14 deletions(-) > > diff --git a/drivers/block/ublk_drv.c b/drivers/block/ublk_drv.c > index ac56482b55f5..9cd331d12fa6 100644 > --- a/drivers/block/ublk_drv.c > +++ b/drivers/block/ublk_drv.c > @@ -79,7 +79,7 @@ > UBLK_PARAM_TYPE_DMA_ALIGN | UBLK_PARAM_TYPE_SEGMENT) > > struct ublk_rq_data { > - struct kref ref; > + refcount_t ref; > }; > > struct ublk_uring_cmd_pdu { > @@ -484,7 +484,6 @@ static blk_status_t ublk_setup_iod_zoned(struct ublk_queue *ubq, > #endif > > static inline void __ublk_complete_rq(struct request *req); > -static void ublk_complete_rq(struct kref *ref); > > static dev_t ublk_chr_devt; > static const struct class ublk_chr_class = { > @@ -644,7 +643,7 @@ static inline void ublk_init_req_ref(const struct ublk_queue *ubq, > if (ublk_need_req_ref(ubq)) { > struct ublk_rq_data *data = blk_mq_rq_to_pdu(req); > > - kref_init(&data->ref); > + refcount_set(&data->ref, 1); > } > } > > @@ -654,7 +653,7 @@ static inline bool ublk_get_req_ref(const struct ublk_queue *ubq, > if (ublk_need_req_ref(ubq)) { > struct ublk_rq_data *data = blk_mq_rq_to_pdu(req); > > - return kref_get_unless_zero(&data->ref); > + return refcount_inc_not_zero(&data->ref); > } > > return true; > @@ -666,7 +665,8 @@ static inline void ublk_put_req_ref(const struct ublk_queue *ubq, > if (ublk_need_req_ref(ubq)) { > struct ublk_rq_data *data = blk_mq_rq_to_pdu(req); > > - kref_put(&data->ref, ublk_complete_rq); > + if(refcount_dec_and_test(&data->ref)) nit: missing space after if Other than that, Reviewed-by: Caleb Sander Mateos <csander@xxxxxxxxxxxxxxx> > + __ublk_complete_rq(req); > } else { > __ublk_complete_rq(req); > } > @@ -1124,15 +1124,6 @@ static inline void __ublk_complete_rq(struct request *req) > blk_mq_end_request(req, res); > } > > -static void ublk_complete_rq(struct kref *ref) > -{ > - struct ublk_rq_data *data = container_of(ref, struct ublk_rq_data, > - ref); > - struct request *req = blk_mq_rq_from_pdu(data); > - > - __ublk_complete_rq(req); > -} > - > static void ublk_complete_io_cmd(struct ublk_io *io, struct request *req, > int res, unsigned issue_flags) > { > -- > 2.47.0 >