Patch "cfq-iosched: fix the delay of cfq_group's vdisktime under iops mode" has been added to the 4.9-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
cfq-iosched: fix the delay of cfq_group's vdisktime under iops mode
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
cfq-iosched-fix-the-delay-of-cfq_group-s-vdisktime-under-iops-mode.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
5be6b75610cefd1e21b98a218211922c2feb6e08Mon Sep 17 00:00:00 2001
From: Hou Tao <[email protected]>
Date: Wed, 1 Mar 2017 09:02:33 +0800
Subject: cfq-iosched: fix the delay of cfq_group's vdisktime under iops mode
From: Hou Tao <[email protected]>
commit 5be6b75610cefd1e21b98a218211922c2feb6e08 upstream.
When adding a cfq_group into the cfq service tree, we use CFQ_IDLE_DELAY as the delay of cfq_group's vdisktime if there have been other cfq_groups already.
When cfq is under iops mode, commit 9a7f38c42c2b ("cfq-iosched: Convert from jiffies to nanoseconds") could result in a large iops delay and lead to an abnormal io schedule delay for the added cfq_group. To fix it, we just need to revert to the old CFQ_IDLE_DELAY value: HZ / 5 when iops mode is enabled.
Despite having the same value, the delay of a cfq_queue in idle class and the delay of cfq_group are different things, so I define two new macros for the delay of a cfq_group under time-slice mode and iops mode.
--- block/cfq-iosched.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-)
block/cfq-iosched.c +15 -2
@@ -36,9 +36,13 @@ static const u64 cfq_target_latency = (ustatic const int cfq_hist_divisor =4 ;/* -* offset from end of service tree +* offset from end of queue service tree for idle class */ #define CFQ_IDLE_DELAY (NSEC_PER_SEC / 5) +/* offset from end of group service tree under time slice mode */ +#define CFQ_SLICE_MODE_GROUP_DELAY (NSEC_PER_SEC / 5) +/* offset from end of group service under IOPS mode */ +#define CFQ_IOPS_MODE_GROUP_DELAY (HZ / 5)/* * below this threshold, we consider thinktime immediate
@@ -1370,6 +1374,14 @@ cfq_group_service_tree_add(struct cfq_rb cfqg->vfraction =max_t (unsigned, vfr,1 ); } +static inline u64 cfq_get_cfqg_vdisktime_delay (struct cfq_data *cfqd) +{ +if (!iops_mode (cfqd)) +return CFQ_SLICE_MODE_GROUP_DELAY ; +else +return CFQ_IOPS_MODE_GROUP_DELAY ; +} +static void cfq_group_notify_queue_add (struct cfq_data *cfqd,struct cfq_group *cfqg) {
@@ -1389,7 +1401,8 @@ cfq_group_notify_queue_add(struct cfq_da n =rb_last (&st->rb);if (n) { __cfqg =rb_entry_cfqg (n); - cfqg->vdisktime = __cfqg->vdisktime +CFQ_IDLE_DELAY ; + cfqg->vdisktime = __cfqg->vdisktime + +cfq_get_cfqg_vdisktime_delay (cfqd); }else cfqg->vdisktime = st->min_vdisktime;cfq_group_service_tree_add (st, cfqg);
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/cfq-iosched-fix-the-delay-of-cfq_group-s-vdisktime-under-iops-mode.patch