|
@@ -2134,12 +2134,8 @@ 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));
|
|
|
- }
|
|
|
+ if (bio->bi_css)
|
|
|
+ bio_associate_blkg(bio, tg_to_blkg(tg));
|
|
|
bio_issue_init(&bio->bi_issue, bio_sectors(bio));
|
|
|
#endif
|
|
|
}
|
|
@@ -2287,6 +2283,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;
|
|
@@ -2294,20 +2291,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 */
|
|
@@ -2336,8 +2331,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
|
|
|
|