OSDN Git Service

Merge tag 'tomoyo-pr-20220322' of git://git.osdn.net/gitroot/tomoyo/tomoyo-test1
[uclinux-h8/linux.git] / block / blk-merge.c
index 4de34a3..ea69683 100644 (file)
@@ -9,6 +9,7 @@
 #include <linux/blk-integrity.h>
 #include <linux/scatterlist.h>
 #include <linux/part_stat.h>
+#include <linux/blk-cgroup.h>
 
 #include <trace/events/block.h>
 
@@ -368,8 +369,6 @@ void __blk_queue_split(struct request_queue *q, struct bio **bio,
                trace_block_split(split, (*bio)->bi_iter.bi_sector);
                submit_bio_noacct(*bio);
                *bio = split;
-
-               blk_throtl_charge_bio_split(*bio);
        }
 }
 
@@ -600,6 +599,9 @@ static inline unsigned int blk_rq_get_max_sectors(struct request *rq,
 static inline int ll_new_hw_segment(struct request *req, struct bio *bio,
                unsigned int nr_phys_segs)
 {
+       if (!blk_cgroup_mergeable(req, bio))
+               goto no_merge;
+
        if (blk_integrity_merge_bio(req->q, req, bio) == false)
                goto no_merge;
 
@@ -696,6 +698,9 @@ static int ll_merge_requests_fn(struct request_queue *q, struct request *req,
        if (total_phys_segments > blk_rq_get_max_segments(req))
                return 0;
 
+       if (!blk_cgroup_mergeable(req, next->bio))
+               return 0;
+
        if (blk_integrity_merge_rq(q, req, next) == false)
                return 0;
 
@@ -904,6 +909,10 @@ bool blk_rq_merge_ok(struct request *rq, struct bio *bio)
        if (bio_data_dir(bio) != rq_data_dir(rq))
                return false;
 
+       /* don't merge across cgroup boundaries */
+       if (!blk_cgroup_mergeable(rq, bio))
+               return false;
+
        /* only merge integrity protected bio into ditto rq */
        if (blk_integrity_merge_bio(rq->q, rq, bio) == false)
                return false;
@@ -1089,12 +1098,20 @@ bool blk_attempt_plug_merge(struct request_queue *q, struct bio *bio,
        if (!plug || rq_list_empty(plug->mq_list))
                return false;
 
-       /* check the previously added entry for a quick merge attempt */
-       rq = rq_list_peek(&plug->mq_list);
-       if (rq->q == q) {
-               if (blk_attempt_bio_merge(q, rq, bio, nr_segs, false) ==
-                               BIO_MERGE_OK)
-                       return true;
+       rq_list_for_each(&plug->mq_list, rq) {
+               if (rq->q == q) {
+                       if (blk_attempt_bio_merge(q, rq, bio, nr_segs, false) ==
+                           BIO_MERGE_OK)
+                               return true;
+                       break;
+               }
+
+               /*
+                * Only keep iterating plug list for merges if we have multiple
+                * queues
+                */
+               if (!plug->multiple_queues)
+                       break;
        }
        return false;
 }