From d9a48b8feed9e54908efdbaf084d3b4acca15fdf Mon Sep 17 00:00:00 2001 From: Fabian Keil Date: Sun, 6 Aug 2017 19:01:53 +0200 Subject: [PATCH 218/325] cam iosched: Add sysctl to show the units used by the currently active limiter (XXX: or not) XXX: Doesn't work properly yet, sysctl always shows none. Obtained from: ElectroBSD --- sys/cam/cam_iosched.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/sys/cam/cam_iosched.c b/sys/cam/cam_iosched.c index 6750c04f2358..e89b4674c156 100644 --- a/sys/cam/cam_iosched.c +++ b/sys/cam/cam_iosched.c @@ -211,6 +211,7 @@ struct iop_stats { * Information about the current rate limiters, if any */ io_limiter limiter; /* How are I/Os being limited */ + char *units; /* Current rate limiter unit (exported as sysctl) */ int min; /* Low range of limit */ int max; /* High range of limit */ int current; /* Current rate limiter */ @@ -627,8 +628,8 @@ cam_iosched_cl_init(struct control_loop *clp, struct cam_iosched_softc *isc) clp->type = set_max; } -static const char * -cam_iosched_get_limiter_unit_string(enum io_limiter limiter) +static char * +cam_iosched_get_limiter_unit_string(int limiter) { KASSERT(none <= limiter && limiter < limiter_max, "Invalid limiter"); @@ -652,10 +653,9 @@ cam_iosched_cl_maybe_steer(struct control_loop *clp) case set_max: if (isc->write_stats.current != isc->write_stats.max && isc->write_stats.limiter != none) { - const char *units; - units = cam_iosched_get_limiter_unit_string(isc->write_stats.limiter); printf("Steering write from %d %s to %d %s\n", - isc->write_stats.current, units, isc->write_stats.max, units); + isc->write_stats.current, isc->write_stats.units, + isc->write_stats.max, isc->write_stats.units); } isc->read_stats.current = isc->read_stats.max; isc->write_stats.current = isc->write_stats.max; @@ -798,6 +798,7 @@ cam_iosched_iop_stats_init(struct cam_iosched_softc *isc, struct iop_stats *ios) { ios->limiter = none; + ios->units = cam_iosched_get_limiter_unit_string(ios->limiter); ios->in = 0; ios->max = ios->current = 300000; ios->min = 1; @@ -840,9 +841,15 @@ cam_iosched_limiter_sysctl(SYSCTL_HANDLER_ARGS) if (strcmp(buf, cam_iosched_limiter_names[i]) != 0) continue; ios->limiter = i; + ios->units = cam_iosched_get_limiter_unit_string(i); error = cam_iosched_limiter_init(ios); if (error != 0) { + /* + * Continue with the previous limiter, + * ios->units remains valid. + */ ios->limiter = value; + ios->units = cam_iosched_get_limiter_unit_string(value); cam_periph_unlock(isc->periph); return error; } @@ -1003,6 +1010,10 @@ cam_iosched_iop_stats_sysctl_init(struct cam_iosched_softc *isc, struct iop_stat OID_AUTO, "limiter", CTLTYPE_STRING | CTLFLAG_RW, ios, 0, cam_iosched_limiter_sysctl, "A", "Current limiting type. Valid values: 'none', 'queue_depth', 'iops' and 'bandwidth'"); + SYSCTL_ADD_STRING(ctx, n, + OID_AUTO, "units", CTLFLAG_RD, + ios->units, 0, + "Units used by currently active limiter (read-only)"); SYSCTL_ADD_INT(ctx, n, OID_AUTO, "min", CTLFLAG_RW, &ios->min, 0, -- 2.32.0