diff options
Diffstat (limited to 'block')
-rw-r--r-- | block/blk-cgroup.c | 8 | ||||
-rw-r--r-- | block/blk-cgroup.h | 4 | ||||
-rw-r--r-- | block/blk-throttle.c | 3 |
3 files changed, 5 insertions, 10 deletions
diff --git a/block/blk-cgroup.c b/block/blk-cgroup.c index 54ad00292edf..e90c7c164c83 100644 --- a/block/blk-cgroup.c +++ b/block/blk-cgroup.c | |||
@@ -615,12 +615,10 @@ u64 blkg_stat_recursive_sum(struct blkg_policy_data *pd, int off) | |||
615 | struct blkcg_policy *pol = blkcg_policy[pd->plid]; | 615 | struct blkcg_policy *pol = blkcg_policy[pd->plid]; |
616 | struct blkcg_gq *pos_blkg; | 616 | struct blkcg_gq *pos_blkg; |
617 | struct cgroup_subsys_state *pos_css; | 617 | struct cgroup_subsys_state *pos_css; |
618 | u64 sum; | 618 | u64 sum = 0; |
619 | 619 | ||
620 | lockdep_assert_held(pd->blkg->q->queue_lock); | 620 | lockdep_assert_held(pd->blkg->q->queue_lock); |
621 | 621 | ||
622 | sum = blkg_stat_read((void *)pd + off); | ||
623 | |||
624 | rcu_read_lock(); | 622 | rcu_read_lock(); |
625 | blkg_for_each_descendant_pre(pos_blkg, pos_css, pd_to_blkg(pd)) { | 623 | blkg_for_each_descendant_pre(pos_blkg, pos_css, pd_to_blkg(pd)) { |
626 | struct blkg_policy_data *pos_pd = blkg_to_pd(pos_blkg, pol); | 624 | struct blkg_policy_data *pos_pd = blkg_to_pd(pos_blkg, pol); |
@@ -650,13 +648,11 @@ struct blkg_rwstat blkg_rwstat_recursive_sum(struct blkg_policy_data *pd, | |||
650 | struct blkcg_policy *pol = blkcg_policy[pd->plid]; | 648 | struct blkcg_policy *pol = blkcg_policy[pd->plid]; |
651 | struct blkcg_gq *pos_blkg; | 649 | struct blkcg_gq *pos_blkg; |
652 | struct cgroup_subsys_state *pos_css; | 650 | struct cgroup_subsys_state *pos_css; |
653 | struct blkg_rwstat sum; | 651 | struct blkg_rwstat sum = { }; |
654 | int i; | 652 | int i; |
655 | 653 | ||
656 | lockdep_assert_held(pd->blkg->q->queue_lock); | 654 | lockdep_assert_held(pd->blkg->q->queue_lock); |
657 | 655 | ||
658 | sum = blkg_rwstat_read((void *)pd + off); | ||
659 | |||
660 | rcu_read_lock(); | 656 | rcu_read_lock(); |
661 | blkg_for_each_descendant_pre(pos_blkg, pos_css, pd_to_blkg(pd)) { | 657 | blkg_for_each_descendant_pre(pos_blkg, pos_css, pd_to_blkg(pd)) { |
662 | struct blkg_policy_data *pos_pd = blkg_to_pd(pos_blkg, pol); | 658 | struct blkg_policy_data *pos_pd = blkg_to_pd(pos_blkg, pol); |
diff --git a/block/blk-cgroup.h b/block/blk-cgroup.h index 855538630300..ae6969a7ffd4 100644 --- a/block/blk-cgroup.h +++ b/block/blk-cgroup.h | |||
@@ -291,6 +291,7 @@ struct blkcg_gq *__blkg_lookup(struct blkcg *blkcg, struct request_queue *q, | |||
291 | * read locked. If called under either blkcg or queue lock, the iteration | 291 | * read locked. If called under either blkcg or queue lock, the iteration |
292 | * is guaranteed to include all and only online blkgs. The caller may | 292 | * is guaranteed to include all and only online blkgs. The caller may |
293 | * update @pos_css by calling css_rightmost_descendant() to skip subtree. | 293 | * update @pos_css by calling css_rightmost_descendant() to skip subtree. |
294 | * @p_blkg is included in the iteration and the first node to be visited. | ||
294 | */ | 295 | */ |
295 | #define blkg_for_each_descendant_pre(d_blkg, pos_css, p_blkg) \ | 296 | #define blkg_for_each_descendant_pre(d_blkg, pos_css, p_blkg) \ |
296 | css_for_each_descendant_pre((pos_css), &(p_blkg)->blkcg->css) \ | 297 | css_for_each_descendant_pre((pos_css), &(p_blkg)->blkcg->css) \ |
@@ -304,7 +305,8 @@ struct blkcg_gq *__blkg_lookup(struct blkcg *blkcg, struct request_queue *q, | |||
304 | * @p_blkg: target blkg to walk descendants of | 305 | * @p_blkg: target blkg to walk descendants of |
305 | * | 306 | * |
306 | * Similar to blkg_for_each_descendant_pre() but performs post-order | 307 | * Similar to blkg_for_each_descendant_pre() but performs post-order |
307 | * traversal instead. Synchronization rules are the same. | 308 | * traversal instead. Synchronization rules are the same. @p_blkg is |
309 | * included in the iteration and the last node to be visited. | ||
308 | */ | 310 | */ |
309 | #define blkg_for_each_descendant_post(d_blkg, pos_css, p_blkg) \ | 311 | #define blkg_for_each_descendant_post(d_blkg, pos_css, p_blkg) \ |
310 | css_for_each_descendant_post((pos_css), &(p_blkg)->blkcg->css) \ | 312 | css_for_each_descendant_post((pos_css), &(p_blkg)->blkcg->css) \ |
diff --git a/block/blk-throttle.c b/block/blk-throttle.c index 8cefa7f8590e..8331aba9426f 100644 --- a/block/blk-throttle.c +++ b/block/blk-throttle.c | |||
@@ -1379,7 +1379,6 @@ static int tg_set_conf(struct cgroup_subsys_state *css, struct cftype *cft, | |||
1379 | * restrictions in the whole hierarchy and allows them to bypass | 1379 | * restrictions in the whole hierarchy and allows them to bypass |
1380 | * blk-throttle. | 1380 | * blk-throttle. |
1381 | */ | 1381 | */ |
1382 | tg_update_has_rules(tg); | ||
1383 | blkg_for_each_descendant_pre(blkg, pos_css, ctx.blkg) | 1382 | blkg_for_each_descendant_pre(blkg, pos_css, ctx.blkg) |
1384 | tg_update_has_rules(blkg_to_tg(blkg)); | 1383 | tg_update_has_rules(blkg_to_tg(blkg)); |
1385 | 1384 | ||
@@ -1639,8 +1638,6 @@ void blk_throtl_drain(struct request_queue *q) | |||
1639 | blkg_for_each_descendant_post(blkg, pos_css, td->queue->root_blkg) | 1638 | blkg_for_each_descendant_post(blkg, pos_css, td->queue->root_blkg) |
1640 | tg_drain_bios(&blkg_to_tg(blkg)->service_queue); | 1639 | tg_drain_bios(&blkg_to_tg(blkg)->service_queue); |
1641 | 1640 | ||
1642 | tg_drain_bios(&td_root_tg(td)->service_queue); | ||
1643 | |||
1644 | /* finally, transfer bios from top-level tg's into the td */ | 1641 | /* finally, transfer bios from top-level tg's into the td */ |
1645 | tg_drain_bios(&td->service_queue); | 1642 | tg_drain_bios(&td->service_queue); |
1646 | 1643 | ||