xref: /dragonfly/lib/libkinfo/kinfo_sched.c (revision 1975d09e)
1 /*
2  * Copyright (c) 2004 The DragonFly Project.  All rights reserved.
3  *
4  * This code is derived from software contributed to The DragonFly Project
5  * by Joerg Sonnenberger <joerg@bec.de>.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in
15  *    the documentation and/or other materials provided with the
16  *    distribution.
17  * 3. Neither the name of The DragonFly Project nor the names of its
18  *    contributors may be used to endorse or promote products derived
19  *    from this software without specific, prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
25  * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
29  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
31  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32  * SUCH DAMAGE.
33  */
34 
35 #include <sys/kinfo.h>
36 #include <sys/param.h>
37 #include <sys/sysctl.h>
38 
39 #include <assert.h>
40 #include <stdlib.h>
41 #include <errno.h>
42 #include <kinfo.h>
43 
44 int
45 kinfo_get_cpus(int *ncpus)
46 {
47 	size_t len = sizeof(*ncpus);
48 
49 	return(sysctlbyname("hw.ncpu", ncpus, &len, NULL, 0));
50 }
51 
52 int
53 kinfo_get_sched_cputime(struct kinfo_cputime *cputime)
54 {
55 	struct kinfo_cputime *percpu = NULL;
56 	size_t len = sizeof(struct kinfo_cputime) * SMP_MAXCPU;
57 	int cpucount, error = 0;
58 
59 	_DIAGASSERT(cputime != NULL);
60 
61 	if ((percpu = malloc(len)) == NULL) {
62 		error = ENOMEM;
63 		goto done;
64 	}
65 
66 	/* retrieve verbatim per-cpu statistics from kernel */
67 	if (sysctlbyname("kern.cputime", percpu, &len, NULL, 0) < 0) {
68 		error = errno;
69 		goto done;
70 	} else {
71 		percpu = reallocf(percpu, len);
72 		if (percpu == NULL) {
73 			error = ENOMEM;
74 			goto done;
75 		}
76 	}
77 
78 	/* aggregate per-cpu statistics retrieved from kernel */
79 	cpucount = len / sizeof(struct kinfo_cputime);
80 	cputime_pcpu_statistics(percpu, cputime, cpucount);
81 
82 done:
83 	if (percpu != NULL)
84 		free(percpu);
85 	return (error);
86 }
87 
88 int
89 kinfo_get_sched_hz(int *hz)
90 {
91 	struct kinfo_clockinfo clockinfo;
92 	size_t len = sizeof(clockinfo);
93 	int retval;
94 
95 	retval = sysctlbyname("kern.clockrate", &clockinfo, &len, NULL, 0);
96 	if (retval)
97 		return(retval);
98 
99 	*hz = clockinfo.ci_hz;
100 	return(0);
101 }
102 
103 int
104 kinfo_get_sched_stathz(int *stathz)
105 {
106 	struct kinfo_clockinfo clockinfo;
107 	size_t len = sizeof(clockinfo);
108 	int retval;
109 
110 	retval = sysctlbyname("kern.clockrate", &clockinfo, &len, NULL, 0);
111 	if (retval)
112 		return(retval);
113 
114 	*stathz = clockinfo.ci_stathz;
115 	return(0);
116 }
117 
118 int
119 kinfo_get_sched_profhz(int *profhz)
120 {
121 	struct kinfo_clockinfo clockinfo;
122 	size_t len = sizeof(clockinfo);
123 	int retval;
124 
125 	retval = sysctlbyname("kern.clockrate", &clockinfo, &len, NULL, 0);
126 	if (retval)
127 		return(retval);
128 
129 	*profhz = clockinfo.ci_profhz;
130 	return(0);
131 }
132