|
|
1.1 root 1: /*
2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * The contents of this file constitute Original Code as defined in and
7: * are subject to the Apple Public Source License Version 1.1 (the
8: * "License"). You may not use this file except in compliance with the
9: * License. Please obtain a copy of the License at
10: * http://www.apple.com/publicsource and read it before using this file.
11: *
12: * This Original Code and all software distributed under the License are
13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17: * License for the specific language governing rights and limitations
18: * under the License.
19: *
20: * @APPLE_LICENSE_HEADER_END@
21: */
22: /*
23: * @OSF_COPYRIGHT@
24: */
25: /*
26: * Mach Operating System
27: * Copyright (c) 1991,1990,1989,1988,1987 Carnegie Mellon University
28: * All Rights Reserved.
29: *
30: * Permission to use, copy, modify and distribute this software and its
31: * documentation is hereby granted, provided that both the copyright
32: * notice and this permission notice appear in all copies of the
33: * software, derivative works or modified versions, and any portions
34: * thereof, and that both notices appear in supporting documentation.
35: *
36: * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
37: * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
38: * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
39: *
40: * Carnegie Mellon requests users of this software to return to
41: *
42: * Software Distribution Coordinator or [email protected]
43: * School of Computer Science
44: * Carnegie Mellon University
45: * Pittsburgh PA 15213-3890
46: *
47: * any improvements or extensions that they make and grant Carnegie Mellon
48: * the rights to redistribute these changes.
49: */
50: /*
51: */
52: /*
53: * File: kern/mach_factor.c
54: * Author: Avadis Tevanian, Jr.
55: * Date: 1986
56: *
57: * Compute the Mach Factor.
58: */
59:
60: #include <cpus.h>
61:
62: #include <mach/machine.h>
63: #include <mach/processor_info.h>
64: #include <kern/sched.h>
65: #include <kern/assert.h>
66: #include <kern/processor.h>
67: #include <kern/thread.h>
68: #if MACH_KERNEL
69: #include <mach/kern_return.h>
70: #include <mach/port.h>
71: #endif /* MACH_KERNEL */
72:
73: integer_t avenrun[3] = {0, 0, 0};
74: integer_t mach_factor[3] = {0, 0, 0};
75:
76: /*
77: * Values are scaled by LOAD_SCALE, defined in processor_info.h
78: */
79: static long fract[3] = {
80: 800, /* (4.0/5.0) 5 second average */
81: 966, /* (29.0/30.0) 30 second average */
82: 983, /* (59.0/60.) 1 minute average */
83: };
84:
85: void
86: compute_mach_factor(void)
87: {
88: register processor_set_t pset;
89: register processor_t processor;
90: register int ncpus;
91: register int nthreads;
92: register long factor_now;
93: register long average_now;
94: register long load_now;
95:
96: mutex_lock(&all_psets_lock);
97: pset = (processor_set_t) queue_first(&all_psets);
98: while (!queue_end(&all_psets, (queue_entry_t)pset)) {
99: /*
100: * If no processors, this pset is in suspended animation.
101: * No load calculations are performed.
102: */
103: pset_lock(pset);
104: if ((ncpus = pset->processor_count) > 0) {
105: /*
106: * Count number of threads.
107: */
108: nthreads = pset->runq.count - pset->runq.depress_count;
109: #if NCPUS > 1
110: processor = (processor_t)queue_first(&pset->processors);
111: while (!queue_end(&pset->processors, (queue_entry_t)processor)) {
112: nthreads += processor->runq.count -
113: processor->runq.depress_count;
114: processor = (processor_t)queue_next(&processor->processors);
115: }
116: #endif
117:
118: /*
119: * account for threads on cpus.
120: */
121: nthreads += ncpus - pset->idle_count;
122:
123: /*
124: * The current thread (running this calculation)
125: * doesn't count; it's always in the default pset.
126: */
127: if (pset == &default_pset)
128: nthreads -= 1;
129:
130: if (nthreads >= ncpus) {
131: factor_now = (ncpus * LOAD_SCALE) / (nthreads + 1);
132: load_now = (nthreads << SCHED_SHIFT) / ncpus;
133: }
134: else {
135: factor_now = (ncpus - nthreads) * LOAD_SCALE;
136: load_now = SCHED_SCALE;
137: }
138:
139: /*
140: * Load average and mach factor calculations for
141: * those that ask about these things.
142: */
143:
144: average_now = (nthreads * LOAD_SCALE) / ncpus;
145:
146: pset->mach_factor = ((pset->mach_factor << 2) + factor_now) / 5;
147: pset->load_average = ((pset->load_average << 2) + average_now) / 5;
148:
149: /*
150: * And some ugly stuff to keep w happy.
151: */
152: if (pset == &default_pset) {
153: register int i;
154:
155: for (i = 0; i < 3; i++) {
156: mach_factor[i] = ((mach_factor[i] * fract[i]) +
157: (factor_now * (LOAD_SCALE - fract[i]))) / LOAD_SCALE;
158:
159: avenrun[i] = ((avenrun[i] * fract[i]) +
160: (average_now * (LOAD_SCALE - fract[i]))) / LOAD_SCALE;
161: }
162: }
163:
164: /*
165: * sched_load is the only thing used by scheduler.
166: * It is always at least 1 (i.e. SCHED_SCALE).
167: */
168: pset->sched_load = (pset->sched_load + load_now) >> 1;
169: }
170:
171: pset_unlock(pset);
172: pset = (processor_set_t) queue_next(&pset->all_psets);
173: }
174:
175: mutex_unlock(&all_psets_lock);
176: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.