diff options
| author | Shaohua Li <shli@fb.com> | 2017-08-18 19:08:13 -0400 |
|---|---|---|
| committer | Jens Axboe <axboe@kernel.dk> | 2017-08-23 17:56:33 -0400 |
| commit | ea0ea2bc6dd8923d86a0fa98743dbeed98645486 (patch) | |
| tree | 462c57a8375b3c19d642d11dc43344a6f7aecab7 | |
| parent | 6470812e22261d2342ef1597be62e63a0423d691 (diff) | |
blk-throttle: cap discard request size
discard request usually is very big and easily use all bandwidth budget
of a cgroup. discard request size doesn't really mean the size of data
written, so it doesn't make sense to account it into bandwidth budget.
Jens pointed out treating the size 0 doesn't make sense too, because
discard request does have cost. But it's not easy to find the actual
cost. This patch simply makes the size one sector.
Signed-off-by: Shaohua Li <shli@fb.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
| -rw-r--r-- | block/blk-throttle.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/block/blk-throttle.c b/block/blk-throttle.c index a7285bf2831c..80f5481fe9f6 100644 --- a/block/blk-throttle.c +++ b/block/blk-throttle.c | |||
| @@ -382,6 +382,14 @@ static unsigned int tg_iops_limit(struct throtl_grp *tg, int rw) | |||
| 382 | } \ | 382 | } \ |
| 383 | } while (0) | 383 | } while (0) |
| 384 | 384 | ||
| 385 | static inline unsigned int throtl_bio_data_size(struct bio *bio) | ||
| 386 | { | ||
| 387 | /* assume it's one sector */ | ||
| 388 | if (unlikely(bio_op(bio) == REQ_OP_DISCARD)) | ||
| 389 | return 512; | ||
| 390 | return bio->bi_iter.bi_size; | ||
| 391 | } | ||
| 392 | |||
| 385 | static void throtl_qnode_init(struct throtl_qnode *qn, struct throtl_grp *tg) | 393 | static void throtl_qnode_init(struct throtl_qnode *qn, struct throtl_grp *tg) |
| 386 | { | 394 | { |
| 387 | INIT_LIST_HEAD(&qn->node); | 395 | INIT_LIST_HEAD(&qn->node); |
| @@ -934,6 +942,7 @@ static bool tg_with_in_bps_limit(struct throtl_grp *tg, struct bio *bio, | |||
| 934 | bool rw = bio_data_dir(bio); | 942 | bool rw = bio_data_dir(bio); |
| 935 | u64 bytes_allowed, extra_bytes, tmp; | 943 | u64 bytes_allowed, extra_bytes, tmp; |
| 936 | unsigned long jiffy_elapsed, jiffy_wait, jiffy_elapsed_rnd; | 944 | unsigned long jiffy_elapsed, jiffy_wait, jiffy_elapsed_rnd; |
| 945 | unsigned int bio_size = throtl_bio_data_size(bio); | ||
| 937 | 946 | ||
| 938 | jiffy_elapsed = jiffy_elapsed_rnd = jiffies - tg->slice_start[rw]; | 947 | jiffy_elapsed = jiffy_elapsed_rnd = jiffies - tg->slice_start[rw]; |
| 939 | 948 | ||
| @@ -947,14 +956,14 @@ static bool tg_with_in_bps_limit(struct throtl_grp *tg, struct bio *bio, | |||
| 947 | do_div(tmp, HZ); | 956 | do_div(tmp, HZ); |
| 948 | bytes_allowed = tmp; | 957 | bytes_allowed = tmp; |
| 949 | 958 | ||
| 950 | if (tg->bytes_disp[rw] + bio->bi_iter.bi_size <= bytes_allowed) { | 959 | if (tg->bytes_disp[rw] + bio_size <= bytes_allowed) { |
| 951 | if (wait) | 960 | if (wait) |
| 952 | *wait = 0; | 961 | *wait = 0; |
| 953 | return true; | 962 | return true; |
| 954 | } | 963 | } |
| 955 | 964 | ||
| 956 | /* Calc approx time to dispatch */ | 965 | /* Calc approx time to dispatch */ |
| 957 | extra_bytes = tg->bytes_disp[rw] + bio->bi_iter.bi_size - bytes_allowed; | 966 | extra_bytes = tg->bytes_disp[rw] + bio_size - bytes_allowed; |
| 958 | jiffy_wait = div64_u64(extra_bytes * HZ, tg_bps_limit(tg, rw)); | 967 | jiffy_wait = div64_u64(extra_bytes * HZ, tg_bps_limit(tg, rw)); |
| 959 | 968 | ||
| 960 | if (!jiffy_wait) | 969 | if (!jiffy_wait) |
| @@ -1034,11 +1043,12 @@ static bool tg_may_dispatch(struct throtl_grp *tg, struct bio *bio, | |||
| 1034 | static void throtl_charge_bio(struct throtl_grp *tg, struct bio *bio) | 1043 | static void throtl_charge_bio(struct throtl_grp *tg, struct bio *bio) |
| 1035 | { | 1044 | { |
| 1036 | bool rw = bio_data_dir(bio); | 1045 | bool rw = bio_data_dir(bio); |
| 1046 | unsigned int bio_size = throtl_bio_data_size(bio); | ||
| 1037 | 1047 | ||
| 1038 | /* Charge the bio to the group */ | 1048 | /* Charge the bio to the group */ |
| 1039 | tg->bytes_disp[rw] += bio->bi_iter.bi_size; | 1049 | tg->bytes_disp[rw] += bio_size; |
| 1040 | tg->io_disp[rw]++; | 1050 | tg->io_disp[rw]++; |
| 1041 | tg->last_bytes_disp[rw] += bio->bi_iter.bi_size; | 1051 | tg->last_bytes_disp[rw] += bio_size; |
| 1042 | tg->last_io_disp[rw]++; | 1052 | tg->last_io_disp[rw]++; |
| 1043 | 1053 | ||
| 1044 | /* | 1054 | /* |
