In current throttling/upper limit policy of blkio cgroup
blkio.throttle.io_service_bytes does not exactly represent
the number of bytes issued to the disk by the group, sometimes
this number could be counted multiple times of real bytes.
This fix introduces BIO_COUNTED flag to avoid multiple counting
for same bio.

Signed-off-by: Chengguang Xu <cgxu...@icloud.com>
---
 include/linux/blk-cgroup.h | 4 ++++
 include/linux/blk_types.h  | 1 +
 2 files changed, 5 insertions(+)

diff --git a/include/linux/blk-cgroup.h b/include/linux/blk-cgroup.h
index 69bea82..6c77711 100644
--- a/include/linux/blk-cgroup.h
+++ b/include/linux/blk-cgroup.h
@@ -686,6 +686,9 @@ static inline bool blkcg_bio_issue_check(struct 
request_queue *q,
        struct blkcg_gq *blkg;
        bool throtl = false;
 
+       if (bio_flagged(bio, BIO_COUNTED))
+               return !throtl;
+
        rcu_read_lock();
        blkcg = bio_blkcg(bio);
 
@@ -708,6 +711,7 @@ static inline bool blkcg_bio_issue_check(struct 
request_queue *q,
                blkg_rwstat_add(&blkg->stat_bytes, bio->bi_opf,
                                bio->bi_iter.bi_size);
                blkg_rwstat_add(&blkg->stat_ios, bio->bi_opf, 1);
+               bio_set_flag(bio, BIO_COUNTED);
        }
 
        rcu_read_unlock();
diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h
index bf18b95..23b83e7 100644
--- a/include/linux/blk_types.h
+++ b/include/linux/blk_types.h
@@ -181,6 +181,7 @@ struct bio {
                                 * throttling rules. Don't do it again. */
 #define BIO_TRACE_COMPLETION 10        /* bio_endio() should trace the final 
completion
                                 * of this bio. */
+#define BIO_COUNTED    11      /* This bio has already been counted. */
 /* See BVEC_POOL_OFFSET below before adding new flags */
 
 /*
-- 
1.8.3.1

Reply via email to