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