]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - block/blk-throttle.c
drm/amdgpu:Add DPG mode support for vcn 1.0
[linux.git] / block / blk-throttle.c
index 82282e6fdcf82cb1b662c1eac468e8de71d6826d..01d0620a4e4a5e829c9de5c2dec0ac5e0b2b3ab3 100644 (file)
@@ -579,8 +579,10 @@ static void blk_throtl_update_limit_valid(struct throtl_data *td)
                struct throtl_grp *tg = blkg_to_tg(blkg);
 
                if (tg->bps[READ][LIMIT_LOW] || tg->bps[WRITE][LIMIT_LOW] ||
-                   tg->iops[READ][LIMIT_LOW] || tg->iops[WRITE][LIMIT_LOW])
+                   tg->iops[READ][LIMIT_LOW] || tg->iops[WRITE][LIMIT_LOW]) {
                        low_valid = true;
+                       break;
+               }
        }
        rcu_read_unlock();
 
@@ -920,12 +922,7 @@ static bool tg_with_in_iops_limit(struct throtl_grp *tg, struct bio *bio,
        }
 
        /* Calc approx time to dispatch */
-       jiffy_wait = ((tg->io_disp[rw] + 1) * HZ) / tg_iops_limit(tg, rw) + 1;
-
-       if (jiffy_wait > jiffy_elapsed)
-               jiffy_wait = jiffy_wait - jiffy_elapsed;
-       else
-               jiffy_wait = 1;
+       jiffy_wait = jiffy_elapsed_rnd - jiffy_elapsed;
 
        if (wait)
                *wait = jiffy_wait;
@@ -2132,12 +2129,9 @@ static inline void throtl_update_latency_buckets(struct throtl_data *td)
 static void blk_throtl_assoc_bio(struct throtl_grp *tg, struct bio *bio)
 {
 #ifdef CONFIG_BLK_DEV_THROTTLING_LOW
-       if (bio->bi_css) {
-               if (bio->bi_cg_private)
-                       blkg_put(tg_to_blkg(bio->bi_cg_private));
-               bio->bi_cg_private = tg;
-               blkg_get(tg_to_blkg(tg));
-       }
+       /* fallback to root_blkg if we fail to get a blkg ref */
+       if (bio->bi_css && (bio_associate_blkg(bio, tg_to_blkg(tg)) == -ENODEV))
+               bio_associate_blkg(bio, bio->bi_disk->queue->root_blkg);
        bio_issue_init(&bio->bi_issue, bio_sectors(bio));
 #endif
 }
@@ -2285,6 +2279,7 @@ void blk_throtl_stat_add(struct request *rq, u64 time_ns)
 
 void blk_throtl_bio_endio(struct bio *bio)
 {
+       struct blkcg_gq *blkg;
        struct throtl_grp *tg;
        u64 finish_time_ns;
        unsigned long finish_time;
@@ -2292,20 +2287,18 @@ void blk_throtl_bio_endio(struct bio *bio)
        unsigned long lat;
        int rw = bio_data_dir(bio);
 
-       tg = bio->bi_cg_private;
-       if (!tg)
+       blkg = bio->bi_blkg;
+       if (!blkg)
                return;
-       bio->bi_cg_private = NULL;
+       tg = blkg_to_tg(blkg);
 
        finish_time_ns = ktime_get_ns();
        tg->last_finish_time = finish_time_ns >> 10;
 
        start_time = bio_issue_time(&bio->bi_issue) >> 10;
        finish_time = __bio_issue_time(finish_time_ns) >> 10;
-       if (!start_time || finish_time <= start_time) {
-               blkg_put(tg_to_blkg(tg));
+       if (!start_time || finish_time <= start_time)
                return;
-       }
 
        lat = finish_time - start_time;
        /* this is only for bio based driver */
@@ -2334,8 +2327,6 @@ void blk_throtl_bio_endio(struct bio *bio)
                tg->bio_cnt /= 2;
                tg->bad_bio_cnt /= 2;
        }
-
-       blkg_put(tg_to_blkg(tg));
 }
 #endif