Block throttling is only used for file system I/O, so move the throtl_data pointer to the gendisk. Signed-off-by: Christoph Hellwig <hch@xxxxxx> --- block/blk-throttle.c | 39 ++++++++++++++++----------------------- include/linux/blkdev.h | 8 +++----- 2 files changed, 19 insertions(+), 28 deletions(-) diff --git a/block/blk-throttle.c b/block/blk-throttle.c index 6a8b82939a38ad..8cece10c56515d 100644 --- a/block/blk-throttle.c +++ b/block/blk-throttle.c @@ -387,7 +387,7 @@ static void throtl_pd_init(struct blkg_policy_data *pd) { struct throtl_grp *tg = pd_to_tg(pd); struct blkcg_gq *blkg = tg_to_blkg(tg); - struct throtl_data *td = blkg->disk->queue->td; + struct throtl_data *td = blkg->disk->td; struct throtl_service_queue *sq = &tg->service_queue; /* @@ -1685,13 +1685,6 @@ static struct cftype throtl_files[] = { { } /* terminate */ }; -static void throtl_shutdown_wq(struct request_queue *q) -{ - struct throtl_data *td = q->td; - - cancel_work_sync(&td->dispatch_work); -} - struct blkcg_policy blkcg_policy_throtl = { .dfl_cftypes = throtl_files, .legacy_cftypes = throtl_legacy_files, @@ -2297,7 +2290,7 @@ static void throtl_track_latency(struct throtl_data *td, sector_t size, void blk_throtl_stat_add(struct request *rq, u64 time_ns) { struct request_queue *q = rq->q; - struct throtl_data *td = q->td; + struct throtl_data *td = q->disk->td; throtl_track_latency(td, blk_rq_stats_sectors(rq), req_op(rq), time_ns >> 10); @@ -2383,7 +2376,7 @@ int blk_throtl_init(struct gendisk *disk) INIT_WORK(&td->dispatch_work, blk_throtl_dispatch_work_fn); throtl_service_queue_init(&td->service_queue); - disk->queue->td = td; + disk->td = td; td->disk = disk; td->limit_valid[LIMIT_MAX] = true; @@ -2403,25 +2396,24 @@ int blk_throtl_init(struct gendisk *disk) void blk_throtl_exit(struct gendisk *disk) { - struct request_queue *q = disk->queue; + struct throtl_data *td = disk->td; - if (!q->td) + if (!td) return; - del_timer_sync(&q->td->service_queue.pending_timer); - throtl_shutdown_wq(q); + del_timer_sync(&td->service_queue.pending_timer); + cancel_work_sync(&td->dispatch_work); blkcg_deactivate_policy(disk, &blkcg_policy_throtl); - free_percpu(q->td->latency_buckets[READ]); - free_percpu(q->td->latency_buckets[WRITE]); - kfree(q->td); + free_percpu(td->latency_buckets[READ]); + free_percpu(td->latency_buckets[WRITE]); + kfree(td); } void blk_throtl_register(struct gendisk *disk) { struct request_queue *q = disk->queue; - struct throtl_data *td; + struct throtl_data *td = disk->td; int i; - td = q->td; BUG_ON(!td); if (blk_queue_nonrot(q)) { @@ -2448,9 +2440,10 @@ void blk_throtl_register(struct gendisk *disk) #ifdef CONFIG_BLK_DEV_THROTTLING_LOW ssize_t blk_throtl_sample_time_show(struct request_queue *q, char *page) { - if (!q->td) + if (!q->disk->td) return -EINVAL; - return sprintf(page, "%u\n", jiffies_to_msecs(q->td->throtl_slice)); + return sprintf(page, "%u\n", + jiffies_to_msecs(q->disk->td->throtl_slice)); } ssize_t blk_throtl_sample_time_store(struct request_queue *q, @@ -2459,14 +2452,14 @@ ssize_t blk_throtl_sample_time_store(struct request_queue *q, unsigned long v; unsigned long t; - if (!q->td) + if (!q->disk->td) return -EINVAL; if (kstrtoul(page, 10, &v)) return -EINVAL; t = msecs_to_jiffies(v); if (t == 0 || t > MAX_THROTL_SLICE) return -EINVAL; - q->td->throtl_slice = t; + q->disk->td->throtl_slice = t; return count; } #endif diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 79aec4ebadb9e0..f07bc82c87f8b3 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -169,6 +169,9 @@ struct gendisk { struct list_head blkg_list; struct mutex blkcg_mutex; #endif /* CONFIG_BLK_CGROUP */ +#ifdef CONFIG_BLK_DEV_THROTTLING + struct throtl_data *td; +#endif #ifdef CONFIG_BLK_DEV_INTEGRITY struct kobject integrity_kobj; #endif /* CONFIG_BLK_DEV_INTEGRITY */ @@ -516,11 +519,6 @@ struct request_queue { spinlock_t unused_hctx_lock; int mq_freeze_depth; - -#ifdef CONFIG_BLK_DEV_THROTTLING - /* Throttle data */ - struct throtl_data *td; -#endif struct rcu_head rcu_head; wait_queue_head_t mq_freeze_wq; /* -- 2.39.1