Commit e4ea0c16 authored by Shaohua Li writes's avatar Shaohua Li writes Committed by Jens Axboe

block cfq: select new workload if priority changed

If priority is changed, continuing to check workload_expires and service tree
count of the previous workload does not make sense. We should always choose
the workload with lowest key of new priority in such case.
Signed-off-by: default avatarShaohua Li <shaohua.li@intel.com>
Reviewed-by: default avatarJeff Moyer <jmoyer@redhat.com>
Signed-off-by: default avatarJens Axboe <jaxboe@fusionio.com>
parent 760701bf
...@@ -2101,6 +2101,7 @@ static void choose_service_tree(struct cfq_data *cfqd, struct cfq_group *cfqg) ...@@ -2101,6 +2101,7 @@ static void choose_service_tree(struct cfq_data *cfqd, struct cfq_group *cfqg)
unsigned count; unsigned count;
struct cfq_rb_root *st; struct cfq_rb_root *st;
unsigned group_slice; unsigned group_slice;
enum wl_prio_t original_prio = cfqd->serving_prio;
if (!cfqg) { if (!cfqg) {
cfqd->serving_prio = IDLE_WORKLOAD; cfqd->serving_prio = IDLE_WORKLOAD;
...@@ -2119,6 +2120,9 @@ static void choose_service_tree(struct cfq_data *cfqd, struct cfq_group *cfqg) ...@@ -2119,6 +2120,9 @@ static void choose_service_tree(struct cfq_data *cfqd, struct cfq_group *cfqg)
return; return;
} }
if (original_prio != cfqd->serving_prio)
goto new_workload;
/* /*
* For RT and BE, we have to choose also the type * For RT and BE, we have to choose also the type
* (SYNC, SYNC_NOIDLE, ASYNC), and to compute a workload * (SYNC, SYNC_NOIDLE, ASYNC), and to compute a workload
...@@ -2133,6 +2137,7 @@ static void choose_service_tree(struct cfq_data *cfqd, struct cfq_group *cfqg) ...@@ -2133,6 +2137,7 @@ static void choose_service_tree(struct cfq_data *cfqd, struct cfq_group *cfqg)
if (count && !time_after(jiffies, cfqd->workload_expires)) if (count && !time_after(jiffies, cfqd->workload_expires))
return; return;
new_workload:
/* otherwise select new workload type */ /* otherwise select new workload type */
cfqd->serving_type = cfqd->serving_type =
cfq_choose_wl(cfqd, cfqg, cfqd->serving_prio); cfq_choose_wl(cfqd, cfqg, cfqd->serving_prio);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment