> Il giorno 16 giu 2017, alle ore 18:15, Christoph Hellwig <hch@xxxxxx> ha scritto: > > No need to have two different callouts of bfq vs kyber. > > Signed-off-by: Christoph Hellwig <hch@xxxxxx> > --- > block/bfq-iosched.c | 6 +++--- > block/blk-mq.c | 11 ++++------- > block/kyber-iosched.c | 8 +++----- > include/linux/elevator.h | 3 +-- > 4 files changed, 11 insertions(+), 17 deletions(-) > > diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c > index ed93da2462ab..4f69e39c2f89 100644 > --- a/block/bfq-iosched.c > +++ b/block/bfq-iosched.c > @@ -4290,7 +4290,7 @@ static void bfq_put_rq_priv_body(struct bfq_queue *bfqq) > bfq_put_queue(bfqq); > } > > -static void bfq_put_rq_private(struct request_queue *q, struct request *rq) > +static void bfq_finish_request(struct request *rq) > { > struct bfq_queue *bfqq = RQ_BFQQ(rq); > struct bfq_data *bfqd = bfqq->bfqd; > @@ -4324,7 +4324,7 @@ static void bfq_put_rq_private(struct request_queue *q, struct request *rq) > */ > > if (!RB_EMPTY_NODE(&rq->rb_node)) > - bfq_remove_request(q, rq); > + bfq_remove_request(rq->q, rq); > bfq_put_rq_priv_body(bfqq); > } > > @@ -4951,7 +4951,7 @@ static struct elv_fs_entry bfq_attrs[] = { > static struct elevator_type iosched_bfq_mq = { > .ops.mq = { > .get_rq_priv = bfq_get_rq_private, > - .put_rq_priv = bfq_put_rq_private, > + .finish_request = bfq_finish_request, > .exit_icq = bfq_exit_icq, > .insert_requests = bfq_insert_requests, > .dispatch_request = bfq_dispatch_request, > diff --git a/block/blk-mq.c b/block/blk-mq.c > index 1a45c287db64..9df7e0394a48 100644 > --- a/block/blk-mq.c > +++ b/block/blk-mq.c > @@ -437,19 +437,16 @@ void blk_mq_free_request(struct request *rq) > struct request_queue *q = rq->q; > struct elevator_queue *e = q->elevator; > > - if (rq->rq_flags & RQF_ELVPRIV) { > - if (e && e->type->ops.mq.put_rq_priv) > - e->type->ops.mq.put_rq_priv(q, rq); > + if (rq->rq_flags & (RQF_ELVPRIV | RQF_QUEUED)) { > + if (e && e->type->ops.mq.finish_request) > + e->type->ops.mq.finish_request(rq); > if (rq->elv.icq) { > put_io_context(rq->elv.icq->ioc); > rq->elv.icq = NULL; > } > } > > - if ((rq->rq_flags & RQF_QUEUED) && e && e->type->ops.mq.put_request) > - e->type->ops.mq.put_request(rq); > - else > - blk_mq_finish_request(rq); > + blk_mq_finish_request(rq); > } My only concern is that this last change is, and will remain, functionally equivalent to the previous version of the code (choice between put_request and finish_request). In fact, bfq doesn't use put_request at all, and, in former bfq_put_rq_private assumes that rq->elv.priv is still properly set. If this change enjoys, as it seems to me, this invariance, then, for the part related to bfq, Acked-by: Paolo Valente <paolo.valente@xxxxxxxxxx> > EXPORT_SYMBOL_GPL(blk_mq_free_request); > > diff --git a/block/kyber-iosched.c b/block/kyber-iosched.c > index b9faabc75fdb..2557b399f0a8 100644 > --- a/block/kyber-iosched.c > +++ b/block/kyber-iosched.c > @@ -446,13 +446,11 @@ static struct request *kyber_get_request(struct request_queue *q, > return rq; > } > > -static void kyber_put_request(struct request *rq) > +static void kyber_finish_request(struct request *rq) > { > - struct request_queue *q = rq->q; > - struct kyber_queue_data *kqd = q->elevator->elevator_data; > + struct kyber_queue_data *kqd = rq->q->elevator->elevator_data; > > rq_clear_domain_token(kqd, rq); > - blk_mq_finish_request(rq); > } > > static void kyber_completed_request(struct request *rq) > @@ -816,7 +814,7 @@ static struct elevator_type kyber_sched = { > .init_hctx = kyber_init_hctx, > .exit_hctx = kyber_exit_hctx, > .get_request = kyber_get_request, > - .put_request = kyber_put_request, > + .finish_request = kyber_finish_request, > .completed_request = kyber_completed_request, > .dispatch_request = kyber_dispatch_request, > .has_work = kyber_has_work, > diff --git a/include/linux/elevator.h b/include/linux/elevator.h > index 0e306c5a86d6..4acea351d43f 100644 > --- a/include/linux/elevator.h > +++ b/include/linux/elevator.h > @@ -105,7 +105,7 @@ struct elevator_mq_ops { > void (*request_merged)(struct request_queue *, struct request *, enum elv_merge); > void (*requests_merged)(struct request_queue *, struct request *, struct request *); > struct request *(*get_request)(struct request_queue *, unsigned int, struct blk_mq_alloc_data *); > - void (*put_request)(struct request *); > + void (*finish_request)(struct request *); > void (*insert_requests)(struct blk_mq_hw_ctx *, struct list_head *, bool); > struct request *(*dispatch_request)(struct blk_mq_hw_ctx *); > bool (*has_work)(struct blk_mq_hw_ctx *); > @@ -115,7 +115,6 @@ struct elevator_mq_ops { > struct request *(*former_request)(struct request_queue *, struct request *); > struct request *(*next_request)(struct request_queue *, struct request *); > int (*get_rq_priv)(struct request_queue *, struct request *, struct bio *); > - void (*put_rq_priv)(struct request_queue *, struct request *); > void (*init_icq)(struct io_cq *); > void (*exit_icq)(struct io_cq *); > }; > -- > 2.11.0 >