xref: /dragonfly/lib/libkcore/kcore_sched.c (revision e4700cfb)
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 
383a1e37f3SHiten Pandya #include <assert.h>
39f5d21610SJoerg Sonnenberger #include <err.h>
40f5d21610SJoerg Sonnenberger #include <errno.h>
41f5d21610SJoerg Sonnenberger #include <kcore.h>
42f5d21610SJoerg Sonnenberger #include <kvm.h>
43f5d21610SJoerg Sonnenberger #include <nlist.h>
443a1e37f3SHiten Pandya #include <stdlib.h>
45f5d21610SJoerg Sonnenberger 
46f5d21610SJoerg Sonnenberger #include "kcore_private.h"
47f5d21610SJoerg Sonnenberger 
48f5d21610SJoerg Sonnenberger int
kcore_get_cpus(struct kcore_data * kc,int * ncpus)49f5d21610SJoerg Sonnenberger kcore_get_cpus(struct kcore_data *kc, int *ncpus)
50f5d21610SJoerg Sonnenberger {
51f5d21610SJoerg Sonnenberger 	static struct nlist nl[] = {
52f5d21610SJoerg Sonnenberger 		{ "_ncpus", 0, 0, 0, 0},
53f5d21610SJoerg Sonnenberger 		{ NULL, 0, 0, 0, 0}
54f5d21610SJoerg Sonnenberger 	};
55f5d21610SJoerg Sonnenberger 
56f5d21610SJoerg Sonnenberger 	/* XXX always include ncpus in the kernel. */
57f5d21610SJoerg Sonnenberger 	if (kcore_get_generic(kc, nl, ncpus, sizeof(*ncpus)))
58f5d21610SJoerg Sonnenberger 		*ncpus = 1;
59f5d21610SJoerg Sonnenberger 	return(0);
60f5d21610SJoerg Sonnenberger }
61f5d21610SJoerg Sonnenberger 
62f5d21610SJoerg Sonnenberger int
kcore_get_sched_cputime(struct kcore_data * kc,struct kinfo_cputime * cputime)63f5d21610SJoerg Sonnenberger kcore_get_sched_cputime(struct kcore_data *kc, struct kinfo_cputime *cputime)
64f5d21610SJoerg Sonnenberger {
653a1e37f3SHiten Pandya 	struct kinfo_cputime *percpu = NULL;
66f5d21610SJoerg Sonnenberger 	static struct nlist nl[] = {
677827df93SHiten Pandya 		{ "cputime_percpu", 0, 0, 0, 0},
68f5d21610SJoerg Sonnenberger 		{ NULL, 0, 0, 0, 0}
69f5d21610SJoerg Sonnenberger 	};
70dba87daeSHiten Pandya 	size_t len;
71dba87daeSHiten Pandya 	int cpucount, error = 0;
72f5d21610SJoerg Sonnenberger 
733a1e37f3SHiten Pandya 	_DIAGASSERT(cputime != NULL);
743a1e37f3SHiten Pandya 
753a1e37f3SHiten Pandya 	error = kcore_get_cpus(kc, &cpucount);
763a1e37f3SHiten Pandya 	if (error)
773a1e37f3SHiten Pandya 		goto done;
783a1e37f3SHiten Pandya 
793a1e37f3SHiten Pandya 	len = sizeof(*percpu) * cpucount;
803a1e37f3SHiten Pandya 
813a1e37f3SHiten Pandya 	if ((percpu = malloc(len)) == NULL) {
823a1e37f3SHiten Pandya 		error = ENOMEM;
833a1e37f3SHiten Pandya 		goto done;
843a1e37f3SHiten Pandya 	}
853a1e37f3SHiten Pandya 
863a1e37f3SHiten Pandya 	/* retrieve verbatim per-cpu statistics from kernel core */
873a1e37f3SHiten Pandya 	error = kcore_get_generic(kc, nl, percpu, len);
883a1e37f3SHiten Pandya 	if (error)
893a1e37f3SHiten Pandya 		goto done;
903a1e37f3SHiten Pandya 
913a1e37f3SHiten Pandya 	/* aggregate per-cpu statistics retrieved from kernel core */
923a1e37f3SHiten Pandya 	cputime_pcpu_statistics(percpu, cputime, cpucount);
933a1e37f3SHiten Pandya 
943a1e37f3SHiten Pandya done:
953a1e37f3SHiten Pandya 	if (percpu != NULL) {
963a1e37f3SHiten Pandya 		free(percpu);
973a1e37f3SHiten Pandya 		percpu = NULL;
983a1e37f3SHiten Pandya 	}
993a1e37f3SHiten Pandya 	return (error);
100f5d21610SJoerg Sonnenberger }
101f5d21610SJoerg Sonnenberger 
102f5d21610SJoerg Sonnenberger int
kcore_get_sched_hz(struct kcore_data * kc,int * hz)103f5d21610SJoerg Sonnenberger kcore_get_sched_hz(struct kcore_data *kc, int *hz)
104f5d21610SJoerg Sonnenberger {
105f5d21610SJoerg Sonnenberger 	static struct nlist nl[] = {
106f5d21610SJoerg Sonnenberger 		{ "_hz", 0, 0, 0, 0},
107f5d21610SJoerg Sonnenberger 		{ NULL, 0, 0, 0, 0}
108f5d21610SJoerg Sonnenberger 	};
109f5d21610SJoerg Sonnenberger 
110f5d21610SJoerg Sonnenberger 	return(kcore_get_generic(kc, nl, hz, sizeof(*hz)));
111f5d21610SJoerg Sonnenberger }
112f5d21610SJoerg Sonnenberger 
113f5d21610SJoerg Sonnenberger int
kcore_get_sched_profhz(struct kcore_data * kc,int * profhz)114f5d21610SJoerg Sonnenberger kcore_get_sched_profhz(struct kcore_data *kc, int *profhz)
115f5d21610SJoerg Sonnenberger {
116f5d21610SJoerg Sonnenberger 	static struct nlist nl[] = {
117f5d21610SJoerg Sonnenberger 		{ "_profhz", 0, 0, 0, 0},
118f5d21610SJoerg Sonnenberger 		{ NULL, 0, 0, 0, 0}
119f5d21610SJoerg Sonnenberger 	};
120f5d21610SJoerg Sonnenberger 
121f5d21610SJoerg Sonnenberger 	return(kcore_get_generic(kc, nl, profhz, sizeof(*profhz)));
122f5d21610SJoerg Sonnenberger }
123f5d21610SJoerg Sonnenberger 
124f5d21610SJoerg Sonnenberger int
kcore_get_sched_stathz(struct kcore_data * kc,int * stathz)125f5d21610SJoerg Sonnenberger kcore_get_sched_stathz(struct kcore_data *kc, int *stathz)
126f5d21610SJoerg Sonnenberger {
127f5d21610SJoerg Sonnenberger 	static struct nlist nl[] = {
128f5d21610SJoerg Sonnenberger 		{ "_stathz", 0, 0, 0, 0},
129f5d21610SJoerg Sonnenberger 		{ NULL, 0, 0, 0, 0}
130f5d21610SJoerg Sonnenberger 	};
131f5d21610SJoerg Sonnenberger 	int retval;
132f5d21610SJoerg Sonnenberger 
133*fc6d0222SSascha Wildner 	retval = kcore_get_generic(kc, nl, stathz, sizeof(*stathz));
134f5d21610SJoerg Sonnenberger 	if (retval == 0 && *stathz == 0)
135f5d21610SJoerg Sonnenberger 		return(kcore_get_sched_hz(kc, stathz));
136f5d21610SJoerg Sonnenberger 	return(retval);
137f5d21610SJoerg Sonnenberger }
138