Commit ba91c849 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Jens Axboe
Browse files

blk-rq-qos: store a gendisk instead of request_queue in struct rq_qos



This is what about half of the users already want, and it's only going to
grow more.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarAndreas Herrmann <aherrmann@suse.de>
Acked-by: default avatarTejun Heo <tj@kernel.org>
Link: https://lore.kernel.org/r/20230203150400.3199230-16-hch@lst.de


Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 3963d84d
Loading
Loading
Loading
Loading
+6 −6
Original line number Original line Diff line number Diff line
@@ -669,7 +669,7 @@ static struct ioc *q_to_ioc(struct request_queue *q)


static const char __maybe_unused *ioc_name(struct ioc *ioc)
static const char __maybe_unused *ioc_name(struct ioc *ioc)
{
{
	struct gendisk *disk = ioc->rqos.q->disk;
	struct gendisk *disk = ioc->rqos.disk;


	if (!disk)
	if (!disk)
		return "<unknown>";
		return "<unknown>";
@@ -808,11 +808,11 @@ static int ioc_autop_idx(struct ioc *ioc)
	u64 now_ns;
	u64 now_ns;


	/* rotational? */
	/* rotational? */
	if (!blk_queue_nonrot(ioc->rqos.q))
	if (!blk_queue_nonrot(ioc->rqos.disk->queue))
		return AUTOP_HDD;
		return AUTOP_HDD;


	/* handle SATA SSDs w/ broken NCQ */
	/* handle SATA SSDs w/ broken NCQ */
	if (blk_queue_depth(ioc->rqos.q) == 1)
	if (blk_queue_depth(ioc->rqos.disk->queue) == 1)
		return AUTOP_SSD_QD1;
		return AUTOP_SSD_QD1;


	/* use one of the normal ssd sets */
	/* use one of the normal ssd sets */
@@ -2649,7 +2649,7 @@ static void ioc_rqos_throttle(struct rq_qos *rqos, struct bio *bio)
	if (use_debt) {
	if (use_debt) {
		iocg_incur_debt(iocg, abs_cost, &now);
		iocg_incur_debt(iocg, abs_cost, &now);
		if (iocg_kick_delay(iocg, &now))
		if (iocg_kick_delay(iocg, &now))
			blkcg_schedule_throttle(rqos->q->disk,
			blkcg_schedule_throttle(rqos->disk,
					(bio->bi_opf & REQ_SWAP) == REQ_SWAP);
					(bio->bi_opf & REQ_SWAP) == REQ_SWAP);
		iocg_unlock(iocg, ioc_locked, &flags);
		iocg_unlock(iocg, ioc_locked, &flags);
		return;
		return;
@@ -2750,7 +2750,7 @@ static void ioc_rqos_merge(struct rq_qos *rqos, struct request *rq,
	if (likely(!list_empty(&iocg->active_list))) {
	if (likely(!list_empty(&iocg->active_list))) {
		iocg_incur_debt(iocg, abs_cost, &now);
		iocg_incur_debt(iocg, abs_cost, &now);
		if (iocg_kick_delay(iocg, &now))
		if (iocg_kick_delay(iocg, &now))
			blkcg_schedule_throttle(rqos->q->disk,
			blkcg_schedule_throttle(rqos->disk,
					(bio->bi_opf & REQ_SWAP) == REQ_SWAP);
					(bio->bi_opf & REQ_SWAP) == REQ_SWAP);
	} else {
	} else {
		iocg_commit_bio(iocg, bio, abs_cost, cost);
		iocg_commit_bio(iocg, bio, abs_cost, cost);
@@ -2821,7 +2821,7 @@ static void ioc_rqos_exit(struct rq_qos *rqos)
{
{
	struct ioc *ioc = rqos_to_ioc(rqos);
	struct ioc *ioc = rqos_to_ioc(rqos);


	blkcg_deactivate_policy(rqos->q, &blkcg_policy_iocost);
	blkcg_deactivate_policy(rqos->disk->queue, &blkcg_policy_iocost);


	spin_lock_irq(&ioc->lock);
	spin_lock_irq(&ioc->lock);
	ioc->running = IOC_STOP;
	ioc->running = IOC_STOP;
+7 −7
Original line number Original line Diff line number Diff line
@@ -292,7 +292,7 @@ static void __blkcg_iolatency_throttle(struct rq_qos *rqos,
	unsigned use_delay = atomic_read(&lat_to_blkg(iolat)->use_delay);
	unsigned use_delay = atomic_read(&lat_to_blkg(iolat)->use_delay);


	if (use_delay)
	if (use_delay)
		blkcg_schedule_throttle(rqos->q->disk, use_memdelay);
		blkcg_schedule_throttle(rqos->disk, use_memdelay);


	/*
	/*
	 * To avoid priority inversions we want to just take a slot if we are
	 * To avoid priority inversions we want to just take a slot if we are
@@ -330,7 +330,7 @@ static void scale_cookie_change(struct blk_iolatency *blkiolat,
				struct child_latency_info *lat_info,
				struct child_latency_info *lat_info,
				bool up)
				bool up)
{
{
	unsigned long qd = blkiolat->rqos.q->nr_requests;
	unsigned long qd = blkiolat->rqos.disk->queue->nr_requests;
	unsigned long scale = scale_amount(qd, up);
	unsigned long scale = scale_amount(qd, up);
	unsigned long old = atomic_read(&lat_info->scale_cookie);
	unsigned long old = atomic_read(&lat_info->scale_cookie);
	unsigned long max_scale = qd << 1;
	unsigned long max_scale = qd << 1;
@@ -372,7 +372,7 @@ static void scale_cookie_change(struct blk_iolatency *blkiolat,
 */
 */
static void scale_change(struct iolatency_grp *iolat, bool up)
static void scale_change(struct iolatency_grp *iolat, bool up)
{
{
	unsigned long qd = iolat->blkiolat->rqos.q->nr_requests;
	unsigned long qd = iolat->blkiolat->rqos.disk->queue->nr_requests;
	unsigned long scale = scale_amount(qd, up);
	unsigned long scale = scale_amount(qd, up);
	unsigned long old = iolat->max_depth;
	unsigned long old = iolat->max_depth;


@@ -646,7 +646,7 @@ static void blkcg_iolatency_exit(struct rq_qos *rqos)


	timer_shutdown_sync(&blkiolat->timer);
	timer_shutdown_sync(&blkiolat->timer);
	flush_work(&blkiolat->enable_work);
	flush_work(&blkiolat->enable_work);
	blkcg_deactivate_policy(rqos->q, &blkcg_policy_iolatency);
	blkcg_deactivate_policy(rqos->disk->queue, &blkcg_policy_iolatency);
	kfree(blkiolat);
	kfree(blkiolat);
}
}


@@ -665,7 +665,7 @@ static void blkiolatency_timer_fn(struct timer_list *t)


	rcu_read_lock();
	rcu_read_lock();
	blkg_for_each_descendant_pre(blkg, pos_css,
	blkg_for_each_descendant_pre(blkg, pos_css,
				     blkiolat->rqos.q->root_blkg) {
				     blkiolat->rqos.disk->queue->root_blkg) {
		struct iolatency_grp *iolat;
		struct iolatency_grp *iolat;
		struct child_latency_info *lat_info;
		struct child_latency_info *lat_info;
		unsigned long flags;
		unsigned long flags;
@@ -749,9 +749,9 @@ static void blkiolatency_enable_work_fn(struct work_struct *work)
	 */
	 */
	enabled = atomic_read(&blkiolat->enable_cnt);
	enabled = atomic_read(&blkiolat->enable_cnt);
	if (enabled != blkiolat->enabled) {
	if (enabled != blkiolat->enabled) {
		blk_mq_freeze_queue(blkiolat->rqos.q);
		blk_mq_freeze_queue(blkiolat->rqos.disk->queue);
		blkiolat->enabled = enabled;
		blkiolat->enabled = enabled;
		blk_mq_unfreeze_queue(blkiolat->rqos.q);
		blk_mq_unfreeze_queue(blkiolat->rqos.disk->queue);
	}
	}
}
}


+4 −6
Original line number Original line Diff line number Diff line
@@ -813,9 +813,9 @@ static const char *rq_qos_id_to_name(enum rq_qos_id id)


void blk_mq_debugfs_unregister_rqos(struct rq_qos *rqos)
void blk_mq_debugfs_unregister_rqos(struct rq_qos *rqos)
{
{
	lockdep_assert_held(&rqos->q->debugfs_mutex);
	lockdep_assert_held(&rqos->disk->queue->debugfs_mutex);


	if (!rqos->q->debugfs_dir)
	if (!rqos->disk->queue->debugfs_dir)
		return;
		return;
	debugfs_remove_recursive(rqos->debugfs_dir);
	debugfs_remove_recursive(rqos->debugfs_dir);
	rqos->debugfs_dir = NULL;
	rqos->debugfs_dir = NULL;
@@ -823,7 +823,7 @@ void blk_mq_debugfs_unregister_rqos(struct rq_qos *rqos)


void blk_mq_debugfs_register_rqos(struct rq_qos *rqos)
void blk_mq_debugfs_register_rqos(struct rq_qos *rqos)
{
{
	struct request_queue *q = rqos->q;
	struct request_queue *q = rqos->disk->queue;
	const char *dir_name = rq_qos_id_to_name(rqos->id);
	const char *dir_name = rq_qos_id_to_name(rqos->id);


	lockdep_assert_held(&q->debugfs_mutex);
	lockdep_assert_held(&q->debugfs_mutex);
@@ -835,9 +835,7 @@ void blk_mq_debugfs_register_rqos(struct rq_qos *rqos)
		q->rqos_debugfs_dir = debugfs_create_dir("rqos",
		q->rqos_debugfs_dir = debugfs_create_dir("rqos",
							 q->debugfs_dir);
							 q->debugfs_dir);


	rqos->debugfs_dir = debugfs_create_dir(dir_name,
	rqos->debugfs_dir = debugfs_create_dir(dir_name, q->rqos_debugfs_dir);
					       rqos->q->rqos_debugfs_dir);

	debugfs_create_files(rqos->debugfs_dir, rqos, rqos->ops->debugfs_attrs);
	debugfs_create_files(rqos->debugfs_dir, rqos, rqos->ops->debugfs_attrs);
}
}


+2 −2
Original line number Original line Diff line number Diff line
@@ -300,7 +300,7 @@ int rq_qos_add(struct rq_qos *rqos, struct gendisk *disk, enum rq_qos_id id,
{
{
	struct request_queue *q = disk->queue;
	struct request_queue *q = disk->queue;


	rqos->q = q;
	rqos->disk = disk;
	rqos->id = id;
	rqos->id = id;
	rqos->ops = ops;
	rqos->ops = ops;


@@ -337,7 +337,7 @@ int rq_qos_add(struct rq_qos *rqos, struct gendisk *disk, enum rq_qos_id id,


void rq_qos_del(struct rq_qos *rqos)
void rq_qos_del(struct rq_qos *rqos)
{
{
	struct request_queue *q = rqos->q;
	struct request_queue *q = rqos->disk->queue;
	struct rq_qos **cur;
	struct rq_qos **cur;


	/*
	/*
+1 −1
Original line number Original line Diff line number Diff line
@@ -26,7 +26,7 @@ struct rq_wait {


struct rq_qos {
struct rq_qos {
	const struct rq_qos_ops *ops;
	const struct rq_qos_ops *ops;
	struct request_queue *q;
	struct gendisk *disk;
	enum rq_qos_id id;
	enum rq_qos_id id;
	struct rq_qos *next;
	struct rq_qos *next;
#ifdef CONFIG_BLK_DEBUG_FS
#ifdef CONFIG_BLK_DEBUG_FS
Loading