The throtl_slice is 100ms by default. This is a long time for SSD, a lot of IO can run. To make cgroups have smoother throughput, we choose a small value (20ms) for SSD.
Signed-off-by: Shaohua Li <[email protected]> --- block/blk-sysfs.c | 2 ++ block/blk-throttle.c | 18 +++++++++++++++--- block/blk.h | 2 ++ 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/block/blk-sysfs.c b/block/blk-sysfs.c index 0e3fb2a..7285f74 100644 --- a/block/blk-sysfs.c +++ b/block/blk-sysfs.c @@ -907,6 +907,8 @@ int blk_register_queue(struct gendisk *disk) blk_wb_init(q); + blk_throtl_register_queue(q); + if (!q->request_fn) return 0; diff --git a/block/blk-throttle.c b/block/blk-throttle.c index 49cad9a..2d05c91 100644 --- a/block/blk-throttle.c +++ b/block/blk-throttle.c @@ -18,8 +18,9 @@ static int throtl_grp_quantum = 8; /* Total max dispatch from all groups in one round */ static int throtl_quantum = 32; -/* Throttling is performed over 100ms slice and after that slice is renewed */ -#define DFL_THROTL_SLICE (HZ / 10) +/* Throttling is performed over a slice and after that slice is renewed */ +#define DFL_THROTL_SLICE_HD (HZ / 10) +#define DFL_THROTL_SLICE_SSD (HZ / 50) #define MAX_THROTL_SLICE (HZ) static struct blkcg_policy blkcg_policy_throtl; @@ -1957,7 +1958,6 @@ int blk_throtl_init(struct request_queue *q) q->td = td; td->queue = q; - td->throtl_slice = DFL_THROTL_SLICE; td->limit_valid[LIMIT_MAX] = true; td->limit_index = LIMIT_MAX; @@ -1978,6 +1978,18 @@ void blk_throtl_exit(struct request_queue *q) kfree(q->td); } +void blk_throtl_register_queue(struct request_queue *q) +{ + struct throtl_data *td; + + td = q->td; + BUG_ON(!td); + if (blk_queue_nonrot(q)) + td->throtl_slice = DFL_THROTL_SLICE_SSD; + else + td->throtl_slice = DFL_THROTL_SLICE_HD; +} + ssize_t blk_throtl_sample_time_show(struct request_queue *q, char *page) { if (!q->td) diff --git a/block/blk.h b/block/blk.h index e83e757..186c67d 100644 --- a/block/blk.h +++ b/block/blk.h @@ -293,10 +293,12 @@ extern void blk_throtl_exit(struct request_queue *q); extern ssize_t blk_throtl_sample_time_show(struct request_queue *q, char *page); extern ssize_t blk_throtl_sample_time_store(struct request_queue *q, const char *page, size_t count); +extern void blk_throtl_register_queue(struct request_queue *q); #else /* CONFIG_BLK_DEV_THROTTLING */ static inline void blk_throtl_drain(struct request_queue *q) { } static inline int blk_throtl_init(struct request_queue *q) { return 0; } static inline void blk_throtl_exit(struct request_queue *q) { } +static inline void blk_throtl_register_queue(struct request_queue *q) { } #endif /* CONFIG_BLK_DEV_THROTTLING */ #endif /* BLK_INTERNAL_H */ -- 2.9.3

