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