Home | History | Annotate | Line # | Download | only in kern
      1 /*	$NetBSD: kstat.c,v 1.3 2018/05/28 21:05:09 chs Exp $	*/
      2 
      3 /*-
      4  * Copyright (c) 2009 The NetBSD Foundation, Inc.
      5  * All rights reserved.
      6  *
      7  * This code is derived from software contributed to The NetBSD Foundation
      8  * by Andrew Doran.
      9  *
     10  * Redistribution and use in source and binary forms, with or without
     11  * modification, are permitted provided that the following conditions
     12  * are met:
     13  * 1. Redistributions of source code must retain the above copyright
     14  *    notice, this list of conditions and the following disclaimer.
     15  * 2. Redistributions in binary form must reproduce the above copyright
     16  *    notice, this list of conditions and the following disclaimer in the
     17  *    documentation and/or other materials provided with the distribution.
     18  *
     19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     29  * POSSIBILITY OF SUCH DAMAGE.
     30  */
     31 
     32 /*-
     33  * Copyright (c) 2007 Pawel Jakub Dawidek <pjd (at) FreeBSD.org>
     34  * All rights reserved.
     35  *
     36  * Redistribution and use in source and binary forms, with or without
     37  * modification, are permitted provided that the following conditions
     38  * are met:
     39  * 1. Redistributions of source code must retain the above copyright
     40  *    notice, this list of conditions and the following disclaimer.
     41  * 2. Redistributions in binary form must reproduce the above copyright
     42  *    notice, this list of conditions and the following disclaimer in the
     43  *    documentation and/or other materials provided with the distribution.
     44  *
     45  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
     46  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     47  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     48  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
     49  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     50  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     51  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     52  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     53  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     54  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     55  * SUCH DAMAGE.
     56  */
     57 
     58 #include <sys/param.h>
     59 #include <sys/kernel.h>
     60 #include <sys/systm.h>
     61 #include <sys/kmem.h>
     62 #include <sys/sysctl.h>
     63 #include <sys/kstat.h>
     64 
     65 kstat_t *
     66 kstat_create(char *module, int instance, char *name, char *class, uchar_t type,
     67 	     ulong_t ndata, uchar_t flags)
     68 {
     69 	struct sysctl_oid *root;
     70 	const struct sysctlnode *rnode, *mnode, *cnode;
     71 	kstat_t *ks;
     72 
     73 	KASSERT(instance == 0);
     74 	KASSERT(type == KSTAT_TYPE_NAMED);
     75 	KASSERT(flags == KSTAT_FLAG_VIRTUAL);
     76 
     77 	ks = kmem_zalloc(sizeof(*ks), KM_SLEEP);
     78 	ks->ks_ndata = ndata;
     79 
     80 	sysctl_createv(&ks->ks_clog, 0, NULL, &rnode,
     81 		CTLFLAG_PERMANENT,
     82 		CTLTYPE_NODE, "kstat", NULL,
     83 		NULL, 0, NULL, 0,
     84 		CTL_CREATE, CTL_EOL);
     85 	sysctl_createv(&ks->ks_clog, 0, &rnode, &mnode,
     86 		CTLFLAG_PERMANENT,
     87 		CTLTYPE_NODE, module, NULL,
     88 		NULL, 0, NULL, 0,
     89 		CTL_CREATE, CTL_EOL);
     90 	sysctl_createv(&ks->ks_clog, 0, &mnode, &cnode,
     91 		CTLFLAG_PERMANENT,
     92 		CTLTYPE_NODE, class, NULL,
     93 		NULL, 0, NULL, 0,
     94 		CTL_CREATE, CTL_EOL);
     95 	sysctl_createv(&ks->ks_clog, 0, &cnode, &ks->ks_node,
     96 		CTLFLAG_PERMANENT,
     97 		CTLTYPE_NODE, name, NULL,
     98 		NULL, 0, NULL, 0,
     99 		CTL_CREATE, CTL_EOL);
    100 
    101 	return (ks);
    102 }
    103 
    104 void
    105 kstat_install(kstat_t *ks)
    106 {
    107 	kstat_named_t *ksent;
    108 	u_int i;
    109 
    110 	ksent = ks->ks_data;
    111 
    112 	for (i = 0; i < ks->ks_ndata; i++, ksent++) {
    113 		KASSERT(ksent->data_type == KSTAT_DATA_UINT64);
    114 		sysctl_createv(&ks->ks_clog, 0, &ks->ks_node, NULL,
    115 			CTLFLAG_PERMANENT | CTLFLAG_READONLY,
    116 			CTLTYPE_QUAD, ksent->name, NULL,
    117 			NULL, 0, &ksent->value.ui64, 0,
    118 			CTL_CREATE, CTL_EOL);
    119 	}
    120 }
    121 
    122 void
    123 kstat_delete(kstat_t *ks)
    124 {
    125 
    126 	sysctl_teardown(&ks->ks_clog);
    127 	kmem_free(ks, sizeof(*ks));
    128 }
    129 
    130 void
    131 kstat_set_string(char *dst, const char *src)
    132 {
    133 
    134 	memset(dst, 0, KSTAT_STRLEN);
    135 	(void) strncpy(dst, src, KSTAT_STRLEN - 1);
    136 }
    137 
    138 void
    139 kstat_named_init(kstat_named_t *knp, const char *name, uchar_t data_type)
    140 {
    141 
    142 	kstat_set_string(knp->name, name);
    143 	knp->data_type = data_type;
    144 }
    145