aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWarner Losh <imp@FreeBSD.org>2017-09-22 02:36:36 +0000
committerWarner Losh <imp@FreeBSD.org>2017-09-22 02:36:36 +0000
commit78ed811e6cf758e3c200d339dda2a6921c5d8cea (patch)
tree8763674865d7c1828fb54f99ac4e1dabadf2e625
parentf777123b838fc0f2ac5ebc448384cebcedf0ab49 (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.c23
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;
}