Re: [PATCH 14/24] cfq-iosched: convert cfq_group_slice() to use cfqg->vfraction
On Fri, Dec 28, 2012 at 12:35:36PM -0800, Tejun Heo wrote: > 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 Acked-by: Vivek Goyal Vivek -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH 14/24] cfq-iosched: convert cfq_group_slice() to use cfqg-vfraction
On Fri, Dec 28, 2012 at 12:35:36PM -0800, Tejun Heo wrote: 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 t...@kernel.org Acked-by: Vivek Goyal vgo...@redhat.com Vivek -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[PATCH 14/24] 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 --- block/cfq-iosched.c | 7 +-- 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c index b24acf6..ee34282 100644 --- a/block/cfq-iosched.c +++ b/block/cfq-iosched.c @@ -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 = >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(>rb_node)) cfq_rb_erase(>rb_node, st); } -- 1.8.0.2 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[PATCH 14/24] 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 t...@kernel.org --- block/cfq-iosched.c | 7 +-- 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c index b24acf6..ee34282 100644 --- a/block/cfq-iosched.c +++ b/block/cfq-iosched.c @@ -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); } -- 1.8.0.2 -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/