block: don't account for split bio's size in cgroup stats
authorJosef Bacik <josef@toxicpanda.com>
Mon, 30 Jul 2018 14:10:01 +0000 (10:10 -0400)
committerJens Axboe <axboe@kernel.dk>
Mon, 30 Jul 2018 14:25:55 +0000 (08:25 -0600)
We need to check in blkcg_bio_issue_check if the bio is flagged as
QUEUE_ENTERED, because if it is then we've already accounted for the
size of the IO in the cgroup stats.  We can still however account for
the extra IO since it'll be another request.

Reported-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
include/linux/blk-cgroup.h

index 3bed5e02a8732f2e1981075e8fc4f28021c4df3b..f7b910768306e41e5932cdae5acb1408ba8f5cff 100644 (file)
@@ -769,8 +769,14 @@ static inline bool blkcg_bio_issue_check(struct request_queue *q,
 
        if (!throtl) {
                blkg = blkg ?: q->root_blkg;
-               blkg_rwstat_add(&blkg->stat_bytes, bio->bi_opf,
-                               bio->bi_iter.bi_size);
+               /*
+                * If the bio is flagged with BIO_QUEUE_ENTERED it means this
+                * is a split bio and we would have already accounted for the
+                * size of the bio.
+                */
+               if (!bio_flagged(bio, BIO_QUEUE_ENTERED))
+                       blkg_rwstat_add(&blkg->stat_bytes, bio->bi_opf,
+                                       bio->bi_iter.bi_size);
                blkg_rwstat_add(&blkg->stat_ios, bio->bi_opf, 1);
        }