Date: Fri, 17 Apr 2015 00:05:34 +0000 (UTC) From: Xin LI <delphij@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r281631 - in user/delphij/zfs-arc-rebase/sys/cddl/compat/opensolaris: kern sys Message-ID: <201504170005.t3H05Ytv071108@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201504170005.t3H05Ytv071108>