svn commit: r281631 - in user/delphij/zfs-arc-rebase/sys/cddl/compat/opensolaris: kern sys
Xin LI
delphij at FreeBSD.org
Fri Apr 17 00:05:35 UTC 2015
Author: delphij
Date: Fri Apr 17 00:05:34 2015
New Revision: 281631
URL: https://svnweb.freebsd.org/changeset/base/281631
Log:
Implement a hacky implementation of ks_update callback.
Modified:
user/delphij/zfs-arc-rebase/sys/cddl/compat/opensolaris/kern/opensolaris_kstat.c
user/delphij/zfs-arc-rebase/sys/cddl/compat/opensolaris/sys/kstat.h
Modified: user/delphij/zfs-arc-rebase/sys/cddl/compat/opensolaris/kern/opensolaris_kstat.c
==============================================================================
--- user/delphij/zfs-arc-rebase/sys/cddl/compat/opensolaris/kern/opensolaris_kstat.c Thu Apr 16 22:44:51 2015 (r281630)
+++ user/delphij/zfs-arc-rebase/sys/cddl/compat/opensolaris/kern/opensolaris_kstat.c Fri Apr 17 00:05:34 2015 (r281631)
@@ -56,6 +56,7 @@ kstat_create(char *module, int instance,
*/
ksp = malloc(sizeof(*ksp), M_KSTAT, M_WAITOK);
ksp->ks_ndata = ndata;
+ ksp->ks_update = NULL;
/*
* Create sysctl tree for those statistics:
@@ -96,6 +97,23 @@ kstat_create(char *module, int instance,
}
static int
+kstat_update(SYSCTL_HANDLER_ARGS)
+{
+ kstat_t *ksp = arg1;
+ uint64_t val;
+ struct bintime bt;
+
+ KASSERT(ksp->ks_update != NULL,
+ ("ksp(%p)->ks_update is NULL", ksp));
+
+ ksp->ks_update(ksp, KSTAT_READ);
+ bintime(&bt);
+ val = (uint64_t)(bttosbt(bt));
+
+ return sysctl_handle_64(oidp, &val, 0, req);
+}
+
+static int
kstat_sysctl(SYSCTL_HANDLER_ARGS)
{
kstat_named_t *ksent = arg1;
@@ -112,6 +130,7 @@ kstat_install(kstat_t *ksp)
u_int i;
ksent = ksp->ks_data;
+
for (i = 0; i < ksp->ks_ndata; i++, ksent++) {
KASSERT(ksent->data_type == KSTAT_DATA_UINT64,
("data_type=%d", ksent->data_type));
@@ -120,6 +139,17 @@ kstat_install(kstat_t *ksp)
CTLTYPE_U64 | CTLFLAG_RD, ksent, sizeof(*ksent),
kstat_sysctl, "QU", ksent->desc);
}
+ /*
+ * If we have a ks_update callback, create an additional sysctl
+ * node that would refresh the subtree and return the system time
+ * after that.
+ */
+ if (ksp->ks_update != NULL) {
+ SYSCTL_ADD_PROC(&ksp->ks_sysctl_ctx,
+ SYSCTL_CHILDREN(ksp->ks_sysctl_root), OID_AUTO, "snapshot_bintime",
+ CTLTYPE_U64 | CTLFLAG_RD, ksp, sizeof(*ksp),
+ kstat_update, "QU", "Snapshot time");
+ }
}
void
Modified: user/delphij/zfs-arc-rebase/sys/cddl/compat/opensolaris/sys/kstat.h
==============================================================================
--- user/delphij/zfs-arc-rebase/sys/cddl/compat/opensolaris/sys/kstat.h Thu Apr 16 22:44:51 2015 (r281630)
+++ user/delphij/zfs-arc-rebase/sys/cddl/compat/opensolaris/sys/kstat.h Fri Apr 17 00:05:34 2015 (r281631)
@@ -35,10 +35,14 @@
#define KSTAT_FLAG_VIRTUAL 0x01
+#define KSTAT_READ 0
+#define KSTAT_WRITE 1
+
typedef struct kstat {
void *ks_data;
u_int ks_ndata;
#ifdef _KERNEL
+ int (*ks_update)(struct kstat *, int); /* dynamic update callback */
struct sysctl_ctx_list ks_sysctl_ctx;
struct sysctl_oid *ks_sysctl_root;
#endif
More information about the svn-src-user
mailing list