Skip to content

Commit e8368b5

Browse files
YuKuai-huaweiaxboe
authored andcommitted
blk-throttle: use calculate_io/bytes_allowed() for throtl_trim_slice()
There are no functional changes, just make the code cleaner. Signed-off-by: Yu Kuai <yukuai3@huawei.com> Acked-by: Tejun Heo <tj@kernel.org> Link: https://lore.kernel.org/r/20230816012708.1193747-4-yukuai1@huaweicloud.com Signed-off-by: Jens Axboe <axboe@kernel.dk>
1 parent bb8d558 commit e8368b5

File tree

1 file changed

+41
-45
lines changed

1 file changed

+41
-45
lines changed

block/blk-throttle.c

Lines changed: 41 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -697,11 +697,40 @@ static bool throtl_slice_used(struct throtl_grp *tg, bool rw)
697697
return true;
698698
}
699699

700+
static unsigned int calculate_io_allowed(u32 iops_limit,
701+
unsigned long jiffy_elapsed)
702+
{
703+
unsigned int io_allowed;
704+
u64 tmp;
705+
706+
/*
707+
* jiffy_elapsed should not be a big value as minimum iops can be
708+
* 1 then at max jiffy elapsed should be equivalent of 1 second as we
709+
* will allow dispatch after 1 second and after that slice should
710+
* have been trimmed.
711+
*/
712+
713+
tmp = (u64)iops_limit * jiffy_elapsed;
714+
do_div(tmp, HZ);
715+
716+
if (tmp > UINT_MAX)
717+
io_allowed = UINT_MAX;
718+
else
719+
io_allowed = tmp;
720+
721+
return io_allowed;
722+
}
723+
724+
static u64 calculate_bytes_allowed(u64 bps_limit, unsigned long jiffy_elapsed)
725+
{
726+
return mul_u64_u64_div_u64(bps_limit, (u64)jiffy_elapsed, (u64)HZ);
727+
}
728+
700729
/* Trim the used slices and adjust slice start accordingly */
701730
static inline void throtl_trim_slice(struct throtl_grp *tg, bool rw)
702731
{
703-
unsigned long nr_slices, time_elapsed, io_trim;
704-
u64 bytes_trim, tmp;
732+
unsigned long time_elapsed, io_trim;
733+
u64 bytes_trim;
705734

706735
BUG_ON(time_before(tg->slice_end[rw], tg->slice_start[rw]));
707736

@@ -723,19 +752,14 @@ static inline void throtl_trim_slice(struct throtl_grp *tg, bool rw)
723752

724753
throtl_set_slice_end(tg, rw, jiffies + tg->td->throtl_slice);
725754

726-
time_elapsed = jiffies - tg->slice_start[rw];
727-
728-
nr_slices = time_elapsed / tg->td->throtl_slice;
729-
730-
if (!nr_slices)
755+
time_elapsed = rounddown(jiffies - tg->slice_start[rw],
756+
tg->td->throtl_slice);
757+
if (!time_elapsed)
731758
return;
732-
tmp = tg_bps_limit(tg, rw) * tg->td->throtl_slice * nr_slices;
733-
do_div(tmp, HZ);
734-
bytes_trim = tmp;
735-
736-
io_trim = (tg_iops_limit(tg, rw) * tg->td->throtl_slice * nr_slices) /
737-
HZ;
738759

760+
bytes_trim = calculate_bytes_allowed(tg_bps_limit(tg, rw),
761+
time_elapsed);
762+
io_trim = calculate_io_allowed(tg_iops_limit(tg, rw), time_elapsed);
739763
if (!bytes_trim && !io_trim)
740764
return;
741765

@@ -749,41 +773,13 @@ static inline void throtl_trim_slice(struct throtl_grp *tg, bool rw)
749773
else
750774
tg->io_disp[rw] = 0;
751775

752-
tg->slice_start[rw] += nr_slices * tg->td->throtl_slice;
776+
tg->slice_start[rw] += time_elapsed;
753777

754778
throtl_log(&tg->service_queue,
755779
"[%c] trim slice nr=%lu bytes=%llu io=%lu start=%lu end=%lu jiffies=%lu",
756-
rw == READ ? 'R' : 'W', nr_slices, bytes_trim, io_trim,
757-
tg->slice_start[rw], tg->slice_end[rw], jiffies);
758-
}
759-
760-
static unsigned int calculate_io_allowed(u32 iops_limit,
761-
unsigned long jiffy_elapsed)
762-
{
763-
unsigned int io_allowed;
764-
u64 tmp;
765-
766-
/*
767-
* jiffy_elapsed should not be a big value as minimum iops can be
768-
* 1 then at max jiffy elapsed should be equivalent of 1 second as we
769-
* will allow dispatch after 1 second and after that slice should
770-
* have been trimmed.
771-
*/
772-
773-
tmp = (u64)iops_limit * jiffy_elapsed;
774-
do_div(tmp, HZ);
775-
776-
if (tmp > UINT_MAX)
777-
io_allowed = UINT_MAX;
778-
else
779-
io_allowed = tmp;
780-
781-
return io_allowed;
782-
}
783-
784-
static u64 calculate_bytes_allowed(u64 bps_limit, unsigned long jiffy_elapsed)
785-
{
786-
return mul_u64_u64_div_u64(bps_limit, (u64)jiffy_elapsed, (u64)HZ);
780+
rw == READ ? 'R' : 'W', time_elapsed / tg->td->throtl_slice,
781+
bytes_trim, io_trim, tg->slice_start[rw], tg->slice_end[rw],
782+
jiffies);
787783
}
788784

789785
static void __tg_update_carryover(struct throtl_grp *tg, bool rw)

0 commit comments

Comments
 (0)