Commit 41cad6ab authored by Tejun Heo's avatar Tejun Heo

cfq-iosched: convert cfq_group_slice() to use cfqg->vfraction

cfq_group_slice() calculates slice by taking a fraction of
cfq_target_latency according to the ratio of cfqg->weight against
service_tree->total_weight.  This currently works only because all
cfqgs are treated to be at the same level.

To prepare for proper hierarchy support, convert cfq_group_slice() to
base the calculation on cfqg->vfraction.  As cfqg->vfraction is always
a fraction of 1 and represents the fraction allocated to the cfqg with
hierarchy considered, the slice can be simply calculated by
multiplying cfqg->vfraction to cfq_target_latency (with fixed point
shift factored in).

As vfraction calculation currently treats all non-root cfqgs as
children of the root cfqg, this patch doesn't introduce noticeable
behavior difference.
Signed-off-by: default avatarTejun Heo <tj@kernel.org>
Acked-by: default avatarVivek Goyal <vgoyal@redhat.com>
parent 1d3650f7
...@@ -85,7 +85,6 @@ struct cfq_rb_root { ...@@ -85,7 +85,6 @@ struct cfq_rb_root {
struct rb_root rb; struct rb_root rb;
struct rb_node *left; struct rb_node *left;
unsigned count; unsigned count;
unsigned total_weight;
u64 min_vdisktime; u64 min_vdisktime;
struct cfq_ttime ttime; struct cfq_ttime ttime;
}; };
...@@ -979,9 +978,7 @@ static inline unsigned cfq_group_get_avg_queues(struct cfq_data *cfqd, ...@@ -979,9 +978,7 @@ static inline unsigned cfq_group_get_avg_queues(struct cfq_data *cfqd,
static inline unsigned static inline unsigned
cfq_group_slice(struct cfq_data *cfqd, struct cfq_group *cfqg) cfq_group_slice(struct cfq_data *cfqd, struct cfq_group *cfqg)
{ {
struct cfq_rb_root *st = &cfqd->grp_service_tree; return cfqd->cfq_target_latency * cfqg->vfraction >> CFQ_SERVICE_SHIFT;
return cfqd->cfq_target_latency * cfqg->weight / st->total_weight;
} }
static inline unsigned static inline unsigned
...@@ -1273,7 +1270,6 @@ cfq_group_service_tree_add(struct cfq_rb_root *st, struct cfq_group *cfqg) ...@@ -1273,7 +1270,6 @@ cfq_group_service_tree_add(struct cfq_rb_root *st, struct cfq_group *cfqg)
cfq_update_group_weight(cfqg); cfq_update_group_weight(cfqg);
__cfq_group_service_tree_add(st, cfqg); __cfq_group_service_tree_add(st, cfqg);
st->total_weight += cfqg->weight;
/* /*
* Activate @cfqg and calculate the portion of vfraction @cfqg is * Activate @cfqg and calculate the portion of vfraction @cfqg is
...@@ -1360,7 +1356,6 @@ cfq_group_service_tree_del(struct cfq_rb_root *st, struct cfq_group *cfqg) ...@@ -1360,7 +1356,6 @@ cfq_group_service_tree_del(struct cfq_rb_root *st, struct cfq_group *cfqg)
} }
/* remove from the service tree */ /* remove from the service tree */
st->total_weight -= cfqg->weight;
if (!RB_EMPTY_NODE(&cfqg->rb_node)) if (!RB_EMPTY_NODE(&cfqg->rb_node))
cfq_rb_erase(&cfqg->rb_node, st); cfq_rb_erase(&cfqg->rb_node, st);
} }
......
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