Commit a748dca3 authored by Yu Kuai's avatar Yu Kuai
Browse files

blk-io-hierarchy: support new rq based stage rq_driver

hulk inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/IAGRKP


CVE: NA

--------------------------------

Like blk-throttle, following new debugfs entries will be created
as well:

/sys/kernel/debug/block/sda/blk_io_hierarchy/
|-- rq_driver
|   |-- io_dump
|   |-- stats
|   `-- threshold

User can use them to analyze how IO behaves in rq_driver.

Signed-off-by: default avatarYu Kuai <yukuai3@huawei.com>
parent 2c162b8c
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -1008,6 +1008,7 @@ static void blk_mq_unregister_default_hierarchy(struct request_queue *q)
	blk_mq_unregister_hierarchy(q, STAGE_PLUG);
	blk_mq_unregister_hierarchy(q, STAGE_HCTX);
	blk_mq_unregister_hierarchy(q, STAGE_REQUEUE);
	blk_mq_unregister_hierarchy(q, STAGE_RQ_DRIVER);
}

/**
+2 −0
Original line number Diff line number Diff line
@@ -458,6 +458,8 @@ static void mq_flush_data_end_io(struct request *rq, blk_status_t error)
		blk_mq_put_driver_tag_hctx(hctx, rq);
	}

	blk_rq_hierarchy_set_flush_done(rq);

	/*
	 * After populating an empty queue, kick it to avoid stall.  Read
	 * the comment in flush_end_io().
+10 −0
Original line number Diff line number Diff line
@@ -121,4 +121,14 @@ config HIERARCHY_REQUEUE

	If unsure, say N.

config HIERARCHY_RQ_DRIVER
	bool "Enable hierarchy stats layer rq_driver"
	default n
	help
	Enabling this lets blk hierarchy stats to record additional information
	for rq_driver. Such information can be helpful to debug performance
	and problems like io hang.

	If unsure, say N.

endif
+3 −0
Original line number Diff line number Diff line
@@ -46,6 +46,9 @@ static const char *stage_name[NR_STAGE_GROUPS] = {
#ifdef CONFIG_HIERARCHY_REQUEUE
	[STAGE_REQUEUE]		= "requeue",
#endif
#ifdef CONFIG_HIERARCHY_RQ_DRIVER
	[STAGE_RQ_DRIVER]	= "rq_driver",
#endif
};

const char *hierarchy_stage_name(enum stage_group stage)
+8 −0
Original line number Diff line number Diff line
@@ -590,6 +590,12 @@ inline void __blk_mq_end_request(struct request *rq, blk_status_t error)
		blk_stat_add(rq, now);
	}

	/*
	 * Avoid accounting flush request with data twice and request that is
	 * not started.
	 */
	if (blk_mq_request_started(rq) && !blk_rq_hierarchy_is_flush_done(rq))
		rq_hierarchy_end_io_acct(rq, STAGE_RQ_DRIVER);
	blk_account_io_done(rq, now);

	if (rq->end_io) {
@@ -729,6 +735,7 @@ void blk_mq_start_request(struct request *rq)
	blk_mq_sched_started_request(rq);

	trace_block_rq_issue(q, rq);
	rq_hierarchy_start_io_acct(rq, STAGE_RQ_DRIVER);

	if (test_bit(QUEUE_FLAG_STATS, &q->queue_flags)) {
		rq->io_start_time_ns = blk_time_get_ns();
@@ -767,6 +774,7 @@ static void __blk_mq_requeue_request(struct request *rq)
	if (blk_mq_request_started(rq)) {
		WRITE_ONCE(rq->state, MQ_RQ_IDLE);
		rq->rq_flags &= ~RQF_TIMED_OUT;
		rq_hierarchy_end_io_acct(rq, STAGE_RQ_DRIVER);
		if (q->dma_drain_size && blk_rq_bytes(rq))
			rq->nr_phys_segments--;
	}
Loading