summaryrefslogtreecommitdiffstats
path: root/sys/kern/subr_counter.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern/subr_counter.c')
-rw-r--r--sys/kern/subr_counter.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/sys/kern/subr_counter.c b/sys/kern/subr_counter.c
index ea2759c..5149f2d 100644
--- a/sys/kern/subr_counter.c
+++ b/sys/kern/subr_counter.c
@@ -94,3 +94,28 @@ sysctl_handle_counter_u64(SYSCTL_HANDLER_ARGS)
return (0);
}
+
+int
+sysctl_handle_counter_u64_array(SYSCTL_HANDLER_ARGS)
+{
+ uint64_t *out;
+ int error;
+
+ out = malloc(arg2 * sizeof(uint64_t), M_TEMP, M_WAITOK);
+ for (int i = 0; i < arg2; i++)
+ out[i] = counter_u64_fetch(((counter_u64_t *)arg1)[i]);
+
+ error = SYSCTL_OUT(req, out, arg2 * sizeof(uint64_t));
+ free(out, M_TEMP);
+
+ if (error || !req->newptr)
+ return (error);
+
+ /*
+ * Any write attempt to a counter zeroes it.
+ */
+ for (int i = 0; i < arg2; i++)
+ counter_u64_zero(((counter_u64_t *)arg1)[i]);
+
+ return (0);
+}
OpenPOWER on IntegriCloud