> Il giorno 16 giu 2017, alle ore 18:15, Christoph Hellwig <[email protected]> ha 
> scritto:
> 
> No need to have two different callouts of bfq vs kyber.
> 
> Signed-off-by: Christoph Hellwig <[email protected]>
> ---
> 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 <[email protected]>


> 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
> 

Reply via email to