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: Tejun Heo <tj@kernel.org> Acked-by: Vivek Goyal <vgoyal@redhat.com>
This commit is contained in:
parent
1d3650f713
commit
41cad6ab2c
1 changed files with 1 additions and 6 deletions
|
@ -85,7 +85,6 @@ struct cfq_rb_root {
|
|||
struct rb_root rb;
|
||||
struct rb_node *left;
|
||||
unsigned count;
|
||||
unsigned total_weight;
|
||||
u64 min_vdisktime;
|
||||
struct cfq_ttime ttime;
|
||||
};
|
||||
|
@ -979,9 +978,7 @@ static inline unsigned cfq_group_get_avg_queues(struct cfq_data *cfqd,
|
|||
static inline unsigned
|
||||
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->weight / st->total_weight;
|
||||
return cfqd->cfq_target_latency * cfqg->vfraction >> CFQ_SERVICE_SHIFT;
|
||||
}
|
||||
|
||||
static inline unsigned
|
||||
|
@ -1273,7 +1270,6 @@ cfq_group_service_tree_add(struct cfq_rb_root *st, struct cfq_group *cfqg)
|
|||
|
||||
cfq_update_group_weight(cfqg);
|
||||
__cfq_group_service_tree_add(st, cfqg);
|
||||
st->total_weight += cfqg->weight;
|
||||
|
||||
/*
|
||||
* 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)
|
|||
}
|
||||
|
||||
/* remove from the service tree */
|
||||
st->total_weight -= cfqg->weight;
|
||||
if (!RB_EMPTY_NODE(&cfqg->rb_node))
|
||||
cfq_rb_erase(&cfqg->rb_node, st);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue