Unverified Commit 391056ff authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!13966 blk-mq/scsi: tracking device queue depth via sbitmap

Merge Pull Request from: @ci-robot 
 
PR sync from: Zheng Qixing <zhengqixing@huawei.com>
https://mailweb.openeuler.org/hyperkitty/list/kernel@openeuler.org/message/25UIZ4CSF2GZXNSH5TANFX4ZN2VCN4HM/ 
Linux mainline-5.13 uses sbitmap to track the queue depth of SCSI
devices. This patch set backports the mainline patches to OLK-5.10
and fixes some KABI issues.

Tests on scsi_debug show that this method can improve IO performance
by more than 30%.

Bart Van Assche (2):
  scsi: sbitmap: Silence a debug kernel warning triggered by
    sbitmap_put()
  scsi: core: Fix scsi_device_max_queue_depth()

Kashyap Desai (1):
  scsi: megaraid_sas: Replace sdev_busy with local counter

Ming Lei (12):
  scsi: sbitmap: Remove sbitmap_clear_bit_unlock
  scsi: sbitmap: Maintain allocation round_robin in sbitmap
  scsi: sbitmap: Add helpers for updating allocation hint
  scsi: sbitmap: Move allocation hint into sbitmap
  scsi: sbitmap: Export sbitmap_weight
  scsi: sbitmap: Add sbitmap_calculate_shift() helper
  scsi: blk-mq: Add callbacks for storing & retrieving budget token
  scsi: blk-mq: Return budget token from .get_budget callback
  scsi: core: Add scsi_device_busy() wrapper
  scsi: core: Make sure sdev->queue_depth is <= max(shost->can_queue,
    1024)
  scsi: core: Replace sdev->device_busy with sbitmap
  scsi: blk-mq: Fix build warning when making htmldocs

Pavel Begunkov (1):
  sbitmap: optimise sbitmap_deferred_clear()

Sumit Saxena (1):
  scsi: core: Increase max device queue_depth to 4096

Zheng Qixing (3):
  sbitmap: fix kabi broken by adding struct sbitmap_extend
  sbitmap: fix kabi broken in struct blk_mq_ops and struct scsi_cmnd
  sbitmap: fix kabi broken in struct scsi_device


-- 
2.39.2
 
https://gitee.com/openeuler/kernel/issues/IB4C27 
 
Link:https://gitee.com/openeuler/kernel/pulls/13966

 

Reviewed-by: default avatarYu Kuai <yukuai3@huawei.com>
Reviewed-by: default avatarLi Nan <linan122@huawei.com>
Signed-off-by: default avatarLi Nan <linan122@huawei.com>
parents 904d8467 ef9d11d6
Loading
Loading
Loading
Loading
+13 −4
Original line number Diff line number Diff line
@@ -131,6 +131,7 @@ static int __blk_mq_do_dispatch_sched(struct blk_mq_hw_ctx *hctx)

	do {
		struct request *rq;
		int budget_token;

		if (e->type->ops.has_work && !e->type->ops.has_work(hctx))
			break;
@@ -140,12 +141,13 @@ static int __blk_mq_do_dispatch_sched(struct blk_mq_hw_ctx *hctx)
			break;
		}

		if (!blk_mq_get_dispatch_budget(q))
		budget_token = blk_mq_get_dispatch_budget(q);
		if (budget_token < 0)
			break;

		rq = e->type->ops.dispatch_request(hctx);
		if (!rq) {
			blk_mq_put_dispatch_budget(q);
			blk_mq_put_dispatch_budget(q, budget_token);
			/*
			 * We're releasing without dispatching. Holding the
			 * budget could have blocked any "hctx"s with the
@@ -157,6 +159,8 @@ static int __blk_mq_do_dispatch_sched(struct blk_mq_hw_ctx *hctx)
			break;
		}

		blk_mq_set_rq_budget_token(rq, budget_token);

		/*
		 * Now this rq owns the budget which has to be released
		 * if this rq won't be queued to driver via .queue_rq()
@@ -237,6 +241,8 @@ static int blk_mq_do_dispatch_ctx(struct blk_mq_hw_ctx *hctx)
	struct request *rq;

	do {
		int budget_token;

		if (!list_empty_careful(&hctx->dispatch)) {
			ret = -EAGAIN;
			break;
@@ -245,12 +251,13 @@ static int blk_mq_do_dispatch_ctx(struct blk_mq_hw_ctx *hctx)
		if (!sbitmap_any_bit_set(&hctx->ctx_map))
			break;

		if (!blk_mq_get_dispatch_budget(q))
		budget_token = blk_mq_get_dispatch_budget(q);
		if (budget_token < 0)
			break;

		rq = blk_mq_dequeue_from_ctx(hctx, ctx);
		if (!rq) {
			blk_mq_put_dispatch_budget(q);
			blk_mq_put_dispatch_budget(q, budget_token);
			/*
			 * We're releasing without dispatching. Holding the
			 * budget could have blocked any "hctx"s with the
@@ -262,6 +269,8 @@ static int blk_mq_do_dispatch_ctx(struct blk_mq_hw_ctx *hctx)
			break;
		}

		blk_mq_set_rq_budget_token(rq, budget_token);

		/*
		 * Now this rq owns the budget which has to be released
		 * if this rq won't be queued to driver via .queue_rq()
+26 −12
Original line number Diff line number Diff line
@@ -1391,11 +1391,16 @@ static enum prep_dispatch blk_mq_prep_dispatch_rq(struct request *rq,
						  bool need_budget)
{
	struct blk_mq_hw_ctx *hctx = rq->mq_hctx;
	int budget_token = -1;

	if (need_budget && !blk_mq_get_dispatch_budget(rq->q)) {
	if (need_budget) {
		budget_token = blk_mq_get_dispatch_budget(rq->q);
		if (budget_token < 0) {
			blk_mq_put_driver_tag(rq);
			return PREP_DISPATCH_NO_BUDGET;
		}
		blk_mq_set_rq_budget_token(rq, budget_token);
	}

	if (!blk_mq_get_driver_tag(rq)) {
		/*
@@ -1411,7 +1416,7 @@ static enum prep_dispatch blk_mq_prep_dispatch_rq(struct request *rq,
			 * together during handling partial dispatch
			 */
			if (need_budget)
				blk_mq_put_dispatch_budget(rq->q);
				blk_mq_put_dispatch_budget(rq->q, budget_token);
			return PREP_DISPATCH_NO_TAG;
		}
	}
@@ -1421,12 +1426,16 @@ static enum prep_dispatch blk_mq_prep_dispatch_rq(struct request *rq,

/* release all allocated budgets before calling to blk_mq_dispatch_rq_list */
static void blk_mq_release_budgets(struct request_queue *q,
		unsigned int nr_budgets)
		struct list_head *list)
{
	int i;
	struct request *rq;

	for (i = 0; i < nr_budgets; i++)
		blk_mq_put_dispatch_budget(q);
	list_for_each_entry(rq, list, queuelist) {
		int budget_token = blk_mq_get_rq_budget_token(rq);

		if (budget_token >= 0)
			blk_mq_put_dispatch_budget(q, budget_token);
	}
}

/*
@@ -1529,7 +1538,8 @@ bool blk_mq_dispatch_rq_list(struct blk_mq_hw_ctx *hctx, struct list_head *list,
			((hctx->flags & BLK_MQ_F_TAG_QUEUE_SHARED) ||
			blk_mq_is_sbitmap_shared(hctx->flags));

		blk_mq_release_budgets(q, nr_budgets);
		if (nr_budgets)
			blk_mq_release_budgets(q, list);

		spin_lock(&hctx->lock);
		list_splice_tail_init(list, &hctx->dispatch);
@@ -2179,6 +2189,7 @@ static blk_status_t __blk_mq_try_issue_directly(struct blk_mq_hw_ctx *hctx,
{
	struct request_queue *q = rq->q;
	bool run_queue = true;
	int budget_token;

	/*
	 * RCU or SRCU read lock is needed before checking quiesced flag.
@@ -2196,11 +2207,14 @@ static blk_status_t __blk_mq_try_issue_directly(struct blk_mq_hw_ctx *hctx,
	if (q->elevator && !bypass_insert)
		goto insert;

	if (!blk_mq_get_dispatch_budget(q))
	budget_token = blk_mq_get_dispatch_budget(q);
	if (budget_token < 0)
		goto insert;

	blk_mq_set_rq_budget_token(rq, budget_token);

	if (!blk_mq_get_driver_tag(rq)) {
		blk_mq_put_dispatch_budget(q);
		blk_mq_put_dispatch_budget(q, budget_token);
		goto insert;
	}

@@ -2967,7 +2981,7 @@ blk_mq_alloc_hctx(struct request_queue *q, struct blk_mq_tag_set *set,
		goto free_cpumask;

	if (sbitmap_init_node(&hctx->ctx_map, nr_cpu_ids, ilog2(8),
				gfp, node))
				gfp, node, false, false))
		goto free_ctxs;
	hctx->nr_ctx = 0;

+21 −4
Original line number Diff line number Diff line
@@ -203,17 +203,34 @@ unsigned int blk_mq_in_flight_with_stat(struct request_queue *q,
					struct hd_struct *part);
#endif

static inline void blk_mq_put_dispatch_budget(struct request_queue *q)
static inline void blk_mq_put_dispatch_budget(struct request_queue *q,
					      int budget_token)
{
	if (q->mq_ops->put_budget)
		q->mq_ops->put_budget(q);
		q->mq_ops->put_budget(q, budget_token);
}

static inline bool blk_mq_get_dispatch_budget(struct request_queue *q)
static inline int blk_mq_get_dispatch_budget(struct request_queue *q)
{
	if (q->mq_ops->get_budget)
		return q->mq_ops->get_budget(q);
	return true;
	return 0;
}

static inline void blk_mq_set_rq_budget_token(struct request *rq, int token)
{
	if (token < 0)
		return;

	if (rq->q->mq_ops->set_rq_budget_token)
		rq->q->mq_ops->set_rq_budget_token(rq, token);
}

static inline int blk_mq_get_rq_budget_token(struct request *rq)
{
	if (rq->q->mq_ops->get_rq_budget_token)
		return rq->q->mq_ops->get_rq_budget_token(rq);
	return -1;
}

static inline void __blk_mq_inc_active_requests(struct blk_mq_hw_ctx *hctx)
+2 −1
Original line number Diff line number Diff line
@@ -476,7 +476,8 @@ static int kyber_init_hctx(struct blk_mq_hw_ctx *hctx, unsigned int hctx_idx)

	for (i = 0; i < KYBER_NUM_DOMAINS; i++) {
		if (sbitmap_init_node(&khd->kcq_map[i], hctx->nr_ctx,
				      ilog2(8), GFP_KERNEL, hctx->numa_node)) {
				      ilog2(8), GFP_KERNEL, hctx->numa_node,
				      false, false)) {
			while (--i >= 0)
				sbitmap_free(&khd->kcq_map[i]);
			goto err_kcqs;
+1 −1
Original line number Diff line number Diff line
@@ -3756,7 +3756,7 @@ mptsas_send_link_status_event(struct fw_event_work *fw_event)
						printk(MYIOC_s_DEBUG_FMT
						"SDEV OUTSTANDING CMDS"
						"%d\n", ioc->name,
						atomic_read(&sdev->device_busy)));
						scsi_device_busy(sdev)));
				}

			}
Loading