forked from Minki/linux
blk-cgroup: Fix the recursive blkg rwstat
The current blkio.throttle.io_service_bytes_recursive doesn't work correctly. As an example, for the following blkcg hierarchy: (Made 1GB READ in test1, 512MB READ in test2) test / \ test1 test2 $ head -n 1 test/test1/blkio.throttle.io_service_bytes_recursive 8:0 Read 1073684480 $ head -n 1 test/test2/blkio.throttle.io_service_bytes_recursive 8:0 Read 537448448 $ head -n 1 test/blkio.throttle.io_service_bytes_recursive 8:0 Read 537448448 Clearly, above data of "test" reflects "test2" not "test1"+"test2". Do the correct summary in blkg_rwstat_recursive_sum(). Signed-off-by: Xunlei Pang <xlpang@linux.alibaba.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
66f669a272
commit
4f44657d74
@ -109,6 +109,7 @@ void blkg_rwstat_recursive_sum(struct blkcg_gq *blkg, struct blkcg_policy *pol,
|
|||||||
|
|
||||||
lockdep_assert_held(&blkg->q->queue_lock);
|
lockdep_assert_held(&blkg->q->queue_lock);
|
||||||
|
|
||||||
|
memset(sum, 0, sizeof(*sum));
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
blkg_for_each_descendant_pre(pos_blkg, pos_css, blkg) {
|
blkg_for_each_descendant_pre(pos_blkg, pos_css, blkg) {
|
||||||
struct blkg_rwstat *rwstat;
|
struct blkg_rwstat *rwstat;
|
||||||
@ -122,7 +123,7 @@ void blkg_rwstat_recursive_sum(struct blkcg_gq *blkg, struct blkcg_policy *pol,
|
|||||||
rwstat = (void *)pos_blkg + off;
|
rwstat = (void *)pos_blkg + off;
|
||||||
|
|
||||||
for (i = 0; i < BLKG_RWSTAT_NR; i++)
|
for (i = 0; i < BLKG_RWSTAT_NR; i++)
|
||||||
sum->cnt[i] = blkg_rwstat_read_counter(rwstat, i);
|
sum->cnt[i] += blkg_rwstat_read_counter(rwstat, i);
|
||||||
}
|
}
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user