diff options
author | Warner Losh <imp@FreeBSD.org> | 2017-09-22 02:36:36 +0000 |
---|---|---|
committer | Warner Losh <imp@FreeBSD.org> | 2017-09-22 02:36:36 +0000 |
commit | 78ed811e6cf758e3c200d339dda2a6921c5d8cea (patch) | |
tree | 8763674865d7c1828fb54f99ac4e1dabadf2e625 | |
parent | f777123b838fc0f2ac5ebc448384cebcedf0ab49 (diff) |
cam iosched: Bettar account IOPS for smoother performance
Prevent cam_iosched_iops_tick() from discarding 'unspent' ios unless
it's a new accounting interval.
Previously ios that weren't used between ticks were lost, as a result
the iops limiter could enforce a limit below the configured maximum.
Obtained from: ElectroBSD
Submitted by: Fabian Keil
PR: 221974
Notes
Notes:
svn path=/head/; revision=323894
-rw-r--r-- | sys/cam/cam_iosched.c | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/sys/cam/cam_iosched.c b/sys/cam/cam_iosched.c index 63d774f0a0cf..b733978016f5 100644 --- a/sys/cam/cam_iosched.c +++ b/sys/cam/cam_iosched.c @@ -423,20 +423,31 @@ cam_iosched_iops_init(struct iop_stats *ios) static int cam_iosched_iops_tick(struct iop_stats *ios) { + int new_ios; - if ((ios->softc->total_ticks % ios->softc->quanta) == 0) - ios->l_value2 = 0; - - ios->l_value1 = (int)((ios->current * (uint64_t)ios->softc->this_frac) >> 16); /* * Allow at least one IO per tick until all * the IOs for this interval have been spent. */ - if (ios->l_value1 <= 0 && ios->l_value2 < ios->current) { - ios->l_value1 = 1; + new_ios = (int)((ios->current * (uint64_t)ios->softc->this_frac) >> 16); + if (new_ios < 1 && ios->l_value2 < ios->current) { + new_ios = 1; ios->l_value2++; } + /* + * If this a new accounting interval, discard any "unspent" ios + * granted in the previous interval. Otherwise add the new ios to + * the previously granted ones that haven't been spent yet. + */ + if ((ios->softc->total_ticks % ios->softc->quanta) == 0) { + ios->l_value1 = new_ios; + ios->l_value2 = 1; + } else { + ios->l_value1 += new_ios; + } + + return 0; } |