diff options
author | Tejun Heo <tj@kernel.org> | 2013-05-14 16:52:38 -0400 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2013-05-14 16:52:38 -0400 |
commit | 9138125beabbb76b4a373d4a619870f6f5d86fc5 (patch) | |
tree | 61ccabf042ff21b81c6dcd074ea8edeb77fedfa8 /block | |
parent | 693e751e70843c29884cde326016e746fa16073a (diff) |
blk-throttle: implement proper hierarchy support
With the recent updates, blk-throttle is finally ready for proper
hierarchy support. Dispatching now honors service_queue->parent_sq
and propagates correctly. The only thing missing is setting
->parent_sq correctly so that throtl_grp hierarchy matches the cgroup
hierarchy.
This patch updates throtl_pd_init() such that service_queues form the
same hierarchy as the cgroup hierarchy if sane_behavior is enabled.
As this concludes proper hierarchy support for blkcg, the shameful
.broken_hierarchy tag is removed from blkio_subsys.
v2: Updated blkio-controller.txt as suggested by Vivek.
Signed-off-by: Tejun Heo <tj@kernel.org>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
Cc: Li Zefan <lizefan@huawei.com>
Diffstat (limited to 'block')
-rw-r--r-- | block/blk-cgroup.c | 8 | ||||
-rw-r--r-- | block/blk-throttle.c | 22 |
2 files changed, 21 insertions, 9 deletions
diff --git a/block/blk-cgroup.c b/block/blk-cgroup.c index d0747605f56c..290792a13e3c 100644 --- a/block/blk-cgroup.c +++ b/block/blk-cgroup.c | |||
@@ -911,14 +911,6 @@ struct cgroup_subsys blkio_subsys = { | |||
911 | .subsys_id = blkio_subsys_id, | 911 | .subsys_id = blkio_subsys_id, |
912 | .base_cftypes = blkcg_files, | 912 | .base_cftypes = blkcg_files, |
913 | .module = THIS_MODULE, | 913 | .module = THIS_MODULE, |
914 | |||
915 | /* | ||
916 | * blkio subsystem is utterly broken in terms of hierarchy support. | ||
917 | * It treats all cgroups equally regardless of where they're | ||
918 | * located in the hierarchy - all cgroups are treated as if they're | ||
919 | * right below the root. Fix it and remove the following. | ||
920 | */ | ||
921 | .broken_hierarchy = true, | ||
922 | }; | 914 | }; |
923 | EXPORT_SYMBOL_GPL(blkio_subsys); | 915 | EXPORT_SYMBOL_GPL(blkio_subsys); |
924 | 916 | ||
diff --git a/block/blk-throttle.c b/block/blk-throttle.c index 27f006bb363b..08a32dfd3844 100644 --- a/block/blk-throttle.c +++ b/block/blk-throttle.c | |||
@@ -397,10 +397,30 @@ static void throtl_pd_init(struct blkcg_gq *blkg) | |||
397 | { | 397 | { |
398 | struct throtl_grp *tg = blkg_to_tg(blkg); | 398 | struct throtl_grp *tg = blkg_to_tg(blkg); |
399 | struct throtl_data *td = blkg->q->td; | 399 | struct throtl_data *td = blkg->q->td; |
400 | struct throtl_service_queue *parent_sq; | ||
400 | unsigned long flags; | 401 | unsigned long flags; |
401 | int rw; | 402 | int rw; |
402 | 403 | ||
403 | throtl_service_queue_init(&tg->service_queue, &td->service_queue); | 404 | /* |
405 | * If sane_hierarchy is enabled, we switch to properly hierarchical | ||
406 | * behavior where limits on a given throtl_grp are applied to the | ||
407 | * whole subtree rather than just the group itself. e.g. If 16M | ||
408 | * read_bps limit is set on the root group, the whole system can't | ||
409 | * exceed 16M for the device. | ||
410 | * | ||
411 | * If sane_hierarchy is not enabled, the broken flat hierarchy | ||
412 | * behavior is retained where all throtl_grps are treated as if | ||
413 | * they're all separate root groups right below throtl_data. | ||
414 | * Limits of a group don't interact with limits of other groups | ||
415 | * regardless of the position of the group in the hierarchy. | ||
416 | */ | ||
417 | parent_sq = &td->service_queue; | ||
418 | |||
419 | if (cgroup_sane_behavior(blkg->blkcg->css.cgroup) && blkg->parent) | ||
420 | parent_sq = &blkg_to_tg(blkg->parent)->service_queue; | ||
421 | |||
422 | throtl_service_queue_init(&tg->service_queue, parent_sq); | ||
423 | |||
404 | for (rw = READ; rw <= WRITE; rw++) { | 424 | for (rw = READ; rw <= WRITE; rw++) { |
405 | throtl_qnode_init(&tg->qnode_on_self[rw], tg); | 425 | throtl_qnode_init(&tg->qnode_on_self[rw], tg); |
406 | throtl_qnode_init(&tg->qnode_on_parent[rw], tg); | 426 | throtl_qnode_init(&tg->qnode_on_parent[rw], tg); |