All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ming Lei <ming.lei@redhat.com>
To: Damien Le Moal <damien.lemoal@wdc.com>
Cc: linux-block@vger.kernel.org, Jens Axboe <axboe@kernel.dk>,
	linux-scsi@vger.kernel.org,
	"Martin K . Petersen" <martin.petersen@oracle.com>
Subject: Re: [PATCH v3 2/7] block: Change elevator_init_mq() to always succeed
Date: Wed, 4 Sep 2019 17:05:27 +0800	[thread overview]
Message-ID: <20190904090526.GE7578@ming.t460p> (raw)
In-Reply-To: <20190904084247.23338-3-damien.lemoal@wdc.com>

On Wed, Sep 04, 2019 at 05:42:42PM +0900, Damien Le Moal wrote:
> If the default elevator chosen is mq-deadline, elevator_init_mq() may
> return an error if mq-deadline initialization fails, leading to
> blk_mq_init_allocated_queue() returning an error, which in turn will
> cause the block device initialization to fail and the device not being
> exposed.
> 
> Instead of taking such extreme measure, handle mq-deadline
> initialization failures in the same manner as when mq-deadline is not
> available (no module to load), that is, default to the "none" scheduler.
> With this change, elevator_init_mq() return type can be changed to void.
> 
> Signed-off-by: Damien Le Moal <damien.lemoal@wdc.com>
> Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
> Reviewed-by: Christoph Hellwig <hch@lst.de>
> ---
>  block/blk-mq.c   |  8 +-------
>  block/blk.h      |  2 +-
>  block/elevator.c | 23 ++++++++++++-----------
>  3 files changed, 14 insertions(+), 19 deletions(-)
> 
> diff --git a/block/blk-mq.c b/block/blk-mq.c
> index 13923630e00a..ee4caf0c0807 100644
> --- a/block/blk-mq.c
> +++ b/block/blk-mq.c
> @@ -2842,8 +2842,6 @@ static unsigned int nr_hw_queues(struct blk_mq_tag_set *set)
>  struct request_queue *blk_mq_init_allocated_queue(struct blk_mq_tag_set *set,
>  						  struct request_queue *q)
>  {
> -	int ret = -ENOMEM;
> -
>  	/* mark the queue as mq asap */
>  	q->mq_ops = set->ops;
>  
> @@ -2904,14 +2902,10 @@ struct request_queue *blk_mq_init_allocated_queue(struct blk_mq_tag_set *set,
>  	blk_mq_add_queue_tag_set(set, q);
>  	blk_mq_map_swqueue(q);
>  
> -	ret = elevator_init_mq(q);
> -	if (ret)
> -		goto err_tag_set;
> +	elevator_init_mq(q);
>  
>  	return q;
>  
> -err_tag_set:
> -	blk_mq_del_queue_tag_set(q);
>  err_hctxs:
>  	kfree(q->queue_hw_ctx);
>  	q->nr_hw_queues = 0;
> diff --git a/block/blk.h b/block/blk.h
> index e4619fc5c99a..ed347f7a97b1 100644
> --- a/block/blk.h
> +++ b/block/blk.h
> @@ -184,7 +184,7 @@ void blk_account_io_done(struct request *req, u64 now);
>  
>  void blk_insert_flush(struct request *rq);
>  
> -int elevator_init_mq(struct request_queue *q);
> +void elevator_init_mq(struct request_queue *q);
>  int elevator_switch_mq(struct request_queue *q,
>  			      struct elevator_type *new_e);
>  void __elevator_exit(struct request_queue *, struct elevator_queue *);
> diff --git a/block/elevator.c b/block/elevator.c
> index 4721834815bb..2944c129760c 100644
> --- a/block/elevator.c
> +++ b/block/elevator.c
> @@ -628,34 +628,35 @@ static inline bool elv_support_iosched(struct request_queue *q)
>  
>  /*
>   * For blk-mq devices supporting IO scheduling, we default to using mq-deadline,
> - * if available, for single queue devices. If deadline isn't available OR we
> - * have multiple queues, default to "none".
> + * if available, for single queue devices. If deadline isn't available OR
> + * deadline initialization fails OR we have multiple queues, default to "none".
>   */
> -int elevator_init_mq(struct request_queue *q)
> +void elevator_init_mq(struct request_queue *q)
>  {
>  	struct elevator_type *e;
> -	int err = 0;
> +	int err;
>  
>  	if (!elv_support_iosched(q))
> -		return 0;
> +		return;
>  
>  	if (q->nr_hw_queues != 1)
> -		return 0;
> +		return;
>  
>  	WARN_ON_ONCE(test_bit(QUEUE_FLAG_REGISTERED, &q->queue_flags));
>  
>  	if (unlikely(q->elevator))
> -		goto out;
> +		return;
>  
>  	e = elevator_get(q, "mq-deadline", false);
>  	if (!e)
> -		goto out;
> +		return;
>  
>  	err = blk_mq_init_sched(q, e);
> -	if (err)
> +	if (err) {
> +		pr_warn("\"%s\" elevator initialization failed, "
> +			"falling back to \"none\"\n", e->elevator_name);
>  		elevator_put(e);
> -out:
> -	return err;
> +	}
>  }

Looks fine:

Reviewed-by: Ming Lei <ming.lei@redhat.com>

BTW, blk_mq_init_sched()'s failure patch should have restored
q->nr_request. And that could be done in another standalone patch.

-- 
Ming

  reply	other threads:[~2019-09-04  9:05 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-09-04  8:42 [PATCH v3 0/7] Elevator cleanups and improvements Damien Le Moal
2019-09-04  8:42 ` [PATCH v3 1/7] block: Cleanup elevator_init_mq() use Damien Le Moal
2019-09-04  9:02   ` Ming Lei
2019-09-04  8:42 ` [PATCH v3 2/7] block: Change elevator_init_mq() to always succeed Damien Le Moal
2019-09-04  9:05   ` Ming Lei [this message]
2019-09-04  8:42 ` [PATCH v3 3/7] block: Introduce elevator features Damien Le Moal
2019-09-04  8:42 ` [PATCH v3 4/7] block: Improve default elevator selection Damien Le Moal
2019-09-04  8:51   ` Johannes Thumshirn
2019-09-04  8:42 ` [PATCH v3 5/7] block: Delay default elevator initialization Damien Le Moal
2019-09-04  8:56   ` Johannes Thumshirn
2019-09-04  9:02     ` Damien Le Moal
2019-09-04 12:56       ` Jens Axboe
2019-09-05  4:30         ` Damien Le Moal
2019-09-04  9:29   ` Ming Lei
2019-09-04  9:29     ` Ming Lei
2019-09-04  8:42 ` [PATCH v3 6/7] block: Set ELEVATOR_F_ZBD_SEQ_WRITE for nullblk zoned disks Damien Le Moal
2019-09-04  8:52   ` Johannes Thumshirn
2019-09-04  8:42 ` [PATCH v3 7/7] sd: Set ELEVATOR_F_ZBD_SEQ_WRITE for ZBC disks Damien Le Moal
2019-09-04  8:52   ` Johannes Thumshirn

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190904090526.GE7578@ming.t460p \
    --to=ming.lei@redhat.com \
    --cc=axboe@kernel.dk \
    --cc=damien.lemoal@wdc.com \
    --cc=linux-block@vger.kernel.org \
    --cc=linux-scsi@vger.kernel.org \
    --cc=martin.petersen@oracle.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.