From: Omar Sandoval <osandov@osandov.com>
To: Ming Lei <ming.lei@redhat.com>
Cc: Jens Axboe <axboe@fb.com>,
linux-block@vger.kernel.org,
Christoph Hellwig <hch@infradead.org>,
Bart Van Assche <bart.vanassche@sandisk.com>,
Laurence Oberman <loberman@redhat.com>,
Paolo Valente <paolo.valente@linaro.org>,
Mel Gorman <mgorman@techsingularity.net>
Subject: Re: [PATCH V4 03/14] blk-mq: introduce blk_mq_dispatch_rq_from_ctx()
Date: Thu, 14 Sep 2017 17:04:13 -0700 [thread overview]
Message-ID: <20170915000413.GA15772@vader> (raw)
In-Reply-To: <20170902151729.6162-4-ming.lei@redhat.com>
On Sat, Sep 02, 2017 at 11:17:18PM +0800, Ming Lei wrote:
> This function is introduced for dequeuing request
> from sw queue so that we can dispatch it in
> scheduler's way.
>
> More importantly, some SCSI devices may set
> q->queue_depth, which is a per-request_queue limit,
> and applied on pending I/O from all hctxs. This
> function is introduced for avoiding to dequeue too
> many requests from sw queue when ->dispatch isn't
> flushed completely.
blk_mq_dispatch_rq_from_ctx() doesn't actually dispatch the request. Can
you please rename it blk_mq_dequeue_from_ctx() or something like that?
(Same for the dispatch_rq_from_ctx helper.)
> Reviewed-by: Bart Van Assche <bart.vanassche@wdc.com>
> Signed-off-by: Ming Lei <ming.lei@redhat.com>
> ---
> block/blk-mq.c | 38 ++++++++++++++++++++++++++++++++++++++
> block/blk-mq.h | 2 ++
> 2 files changed, 40 insertions(+)
>
> diff --git a/block/blk-mq.c b/block/blk-mq.c
> index 3f18cff80050..f063dd0f197f 100644
> --- a/block/blk-mq.c
> +++ b/block/blk-mq.c
> @@ -880,6 +880,44 @@ void blk_mq_flush_busy_ctxs(struct blk_mq_hw_ctx *hctx, struct list_head *list)
> }
> EXPORT_SYMBOL_GPL(blk_mq_flush_busy_ctxs);
>
> +struct dispatch_rq_data {
> + struct blk_mq_hw_ctx *hctx;
> + struct request *rq;
> +};
> +
> +static bool dispatch_rq_from_ctx(struct sbitmap *sb, unsigned int bitnr, void *data)
> +{
> + struct dispatch_rq_data *dispatch_data = data;
> + struct blk_mq_hw_ctx *hctx = dispatch_data->hctx;
> + struct blk_mq_ctx *ctx = hctx->ctxs[bitnr];
> +
> + spin_lock(&ctx->lock);
> + if (unlikely(!list_empty(&ctx->rq_list))) {
> + dispatch_data->rq = list_entry_rq(ctx->rq_list.next);
> + list_del_init(&dispatch_data->rq->queuelist);
> + if (list_empty(&ctx->rq_list))
> + sbitmap_clear_bit(sb, bitnr);
> + }
> + spin_unlock(&ctx->lock);
> +
> + return !dispatch_data->rq;
> +}
> +
> +struct request *blk_mq_dispatch_rq_from_ctx(struct blk_mq_hw_ctx *hctx,
> + struct blk_mq_ctx *start)
> +{
> + unsigned off = start ? start->index_hw : 0;
> + struct dispatch_rq_data data = {
> + .hctx = hctx,
> + .rq = NULL,
> + };
> +
> + __sbitmap_for_each_set(&hctx->ctx_map, off,
> + dispatch_rq_from_ctx, &data);
> +
> + return data.rq;
> +}
> +
> static inline unsigned int queued_to_index(unsigned int queued)
> {
> if (!queued)
> diff --git a/block/blk-mq.h b/block/blk-mq.h
> index 98252b79b80b..e42748bfb959 100644
> --- a/block/blk-mq.h
> +++ b/block/blk-mq.h
> @@ -35,6 +35,8 @@ void blk_mq_flush_busy_ctxs(struct blk_mq_hw_ctx *hctx, struct list_head *list);
> bool blk_mq_hctx_has_pending(struct blk_mq_hw_ctx *hctx);
> bool blk_mq_get_driver_tag(struct request *rq, struct blk_mq_hw_ctx **hctx,
> bool wait);
> +struct request *blk_mq_dispatch_rq_from_ctx(struct blk_mq_hw_ctx *hctx,
> + struct blk_mq_ctx *start);
>
> /*
> * Internal helpers for allocating/freeing the request map
> --
> 2.9.5
>
next prev parent reply other threads:[~2017-09-15 0:04 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-09-02 15:17 [PATCH V4 00/14] blk-mq-sched: improve SCSI-MQ performance Ming Lei
2017-09-02 15:17 ` [PATCH V4 01/14] blk-mq-sched: fix scheduler bad performance Ming Lei
2017-09-08 20:48 ` Omar Sandoval
2017-09-08 20:54 ` Omar Sandoval
2017-09-08 20:56 ` Omar Sandoval
2017-09-09 7:43 ` Ming Lei
2017-09-09 7:33 ` Ming Lei
2017-09-02 15:17 ` [PATCH V4 02/14] sbitmap: introduce __sbitmap_for_each_set() Ming Lei
2017-09-08 20:43 ` Omar Sandoval
2017-09-09 9:38 ` Ming Lei
2017-09-10 17:20 ` Omar Sandoval
2017-09-11 4:08 ` Ming Lei
2017-09-13 18:37 ` Omar Sandoval
2017-09-14 1:56 ` Ming Lei
2017-09-14 14:59 ` Omar Sandoval
2017-09-14 15:18 ` Omar Sandoval
2017-09-15 1:57 ` Ming Lei
2017-09-02 15:17 ` [PATCH V4 03/14] blk-mq: introduce blk_mq_dispatch_rq_from_ctx() Ming Lei
2017-09-15 0:04 ` Omar Sandoval [this message]
2017-09-15 1:50 ` Ming Lei
2017-09-02 15:17 ` [PATCH V4 04/14] blk-mq-sched: move actual dispatching into one helper Ming Lei
2017-09-19 19:21 ` Omar Sandoval
2017-09-02 15:17 ` [PATCH V4 05/14] blk-mq-sched: improve dispatching from sw queue Ming Lei
2017-09-08 23:54 ` Omar Sandoval
2017-09-10 4:45 ` Ming Lei
2017-09-10 17:38 ` Omar Sandoval
2017-09-11 4:13 ` Ming Lei
2017-09-13 17:32 ` Omar Sandoval
2017-09-19 20:37 ` Jens Axboe
2017-09-20 2:37 ` Ming Lei
2017-09-20 12:20 ` Ming Lei
2017-09-22 2:15 ` Ming Lei
2017-09-02 15:17 ` [PATCH V4 06/14] blk-mq-sched: don't dequeue request until all in ->dispatch are flushed Ming Lei
2017-09-19 19:11 ` Omar Sandoval
2017-09-20 2:55 ` Ming Lei
2017-09-02 15:17 ` [PATCH V4 07/14] blk-mq-sched: introduce blk_mq_sched_queue_depth() Ming Lei
2017-09-02 15:17 ` [PATCH V4 08/14] blk-mq-sched: use q->queue_depth as hint for q->nr_requests Ming Lei
2017-09-02 15:17 ` [PATCH V4 09/14] block: introduce rqhash helpers Ming Lei
2017-09-02 15:17 ` [PATCH V4 10/14] block: move actual bio merge code into __elv_merge Ming Lei
2017-09-02 15:17 ` [PATCH V4 11/14] block: add check on elevator for supporting bio merge via hashtable from blk-mq sw queue Ming Lei
2017-09-02 15:17 ` [PATCH V4 12/14] block: introduce .last_merge and .hash to blk_mq_ctx Ming Lei
2017-09-02 15:17 ` [PATCH V4 13/14] blk-mq-sched: refactor blk_mq_sched_try_merge() Ming Lei
2017-09-02 15:17 ` [PATCH V4 14/14] blk-mq: improve bio merge from blk-mq sw queue Ming Lei
2017-09-04 9:12 ` [PATCH V4 00/14] blk-mq-sched: improve SCSI-MQ performance Paolo Valente
2017-09-05 1:39 ` Ming Lei
2017-09-06 15:27 ` Ming Lei
2017-09-19 19:25 ` Omar Sandoval
2017-09-20 3:18 ` Ming Lei
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=20170915000413.GA15772@vader \
--to=osandov@osandov.com \
--cc=axboe@fb.com \
--cc=bart.vanassche@sandisk.com \
--cc=hch@infradead.org \
--cc=linux-block@vger.kernel.org \
--cc=loberman@redhat.com \
--cc=mgorman@techsingularity.net \
--cc=ming.lei@redhat.com \
--cc=paolo.valente@linaro.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).