Commit 2c162b8c authored by Yu Kuai's avatar Yu Kuai
Browse files

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

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/
|-- requeue
|   |-- io_dump
|   |-- stats
|   `-- threshold

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

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

/**
+10 −0
Original line number Diff line number Diff line
@@ -111,4 +111,14 @@ config HIERARCHY_HCTX

	If unsure, say N.

config HIERARCHY_REQUEUE
	bool "Enable hierarchy stats layer requeue"
	default n
	help
	Enabling this lets blk hierarchy stats to record additional information
	for requeue. 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
@@ -43,6 +43,9 @@ static const char *stage_name[NR_STAGE_GROUPS] = {
#ifdef CONFIG_HIERARCHY_HCTX
	[STAGE_HCTX]		= "hctx",
#endif
#ifdef CONFIG_HIERARCHY_REQUEUE
	[STAGE_REQUEUE]		= "requeue",
#endif
};

const char *hierarchy_stage_name(enum stage_group stage)
+2 −0
Original line number Diff line number Diff line
@@ -794,6 +794,7 @@ static void blk_mq_requeue_work(struct work_struct *work)
	spin_lock_irq(&q->requeue_lock);
	list_splice_init(&q->requeue_list, &rq_list);
	spin_unlock_irq(&q->requeue_lock);
	rq_list_hierarchy_end_io_acct(&rq_list, STAGE_REQUEUE);

	list_for_each_entry_safe(rq, next, &rq_list, queuelist) {
		if (!(rq->rq_flags & (RQF_SOFTBARRIER | RQF_DONTPREP)))
@@ -833,6 +834,7 @@ void blk_mq_add_to_requeue_list(struct request *rq, bool at_head,
	 */
	BUG_ON(rq->rq_flags & RQF_SOFTBARRIER);

	rq_hierarchy_start_io_acct(rq, STAGE_REQUEUE);
	spin_lock_irqsave(&q->requeue_lock, flags);
	if (at_head) {
		rq->rq_flags |= RQF_SOFTBARRIER;
+1 −0
Original line number Diff line number Diff line
@@ -933,6 +933,7 @@ static void blk_mq_register_default_hierarchy(struct request_queue *q)
	blk_mq_register_hierarchy(q, STAGE_GETTAG);
	blk_mq_register_hierarchy(q, STAGE_PLUG);
	blk_mq_register_hierarchy(q, STAGE_HCTX);
	blk_mq_register_hierarchy(q, STAGE_REQUEUE);
}

/**
Loading