annotate usr/src/uts/common/syscall/lgrpsys.c @ 7887:f9ded24b041a

[fmac-discuss] [PATCH] Fix more cstyle issues Fix more cstyle issues introduced by prior patches, in particular the hasprocperm patch and the secctx patch. uts/common/syscall/lgrpsys.c is still not clean with regard to continuation indentation but the remaining warnings were not introduced by our patches.
author Stephen Smalley <sds@tycho.nsa.gov>
date Fri, 17 Oct 2008 13:28:50 -0400
parents e3677dd00778
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
4 * The contents of this file are subject to the terms of the
2685
80399c17fa47 PSARC 2006/421 MPO Control And Observability Tools
akolb
parents: 0
diff changeset
5 * Common Development and Distribution License (the "License").
80399c17fa47 PSARC 2006/421 MPO Control And Observability Tools
akolb
parents: 0
diff changeset
6 * You may not use this file except in compliance with the License.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
7 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
9 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
10 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
11 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
12 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
13 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
15 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
16 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
17 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
18 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
19 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
20 */
2685
80399c17fa47 PSARC 2006/421 MPO Control And Observability Tools
akolb
parents: 0
diff changeset
21
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
22 /*
2685
80399c17fa47 PSARC 2006/421 MPO Control And Observability Tools
akolb
parents: 0
diff changeset
23 * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
24 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
25 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
26
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
27 #pragma ident "%Z%%M% %I% %E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
28
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
29 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
30 * lgroup system calls
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
31 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
32
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
33 #include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
34 #include <sys/errno.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
35 #include <sys/sunddi.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
36 #include <sys/systm.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
37 #include <sys/mman.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
38 #include <sys/cpupart.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
39 #include <sys/lgrp.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
40 #include <sys/lgrp_user.h>
7873
e3677dd00778 Mediate some process operations
Stephen Smalley <sds@tycho.nsa.gov>
parents: 2988
diff changeset
41 #include <sys/fmac/av_permissions.h>
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
42 #include <sys/promif.h> /* for prom_printf() */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
43 #include <sys/sysmacros.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
44
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
45 #include <vm/as.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
46
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
47
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
48 /* definitions for mi_validity */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
49 #define VALID_ADDR 1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
50 #define VALID_REQ 2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
51
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
52 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
53 * run through the given number of addresses and requests and return the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
54 * corresponding memory information for each address
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
55 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
56 static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
57 meminfo(int addr_count, struct meminfo *mip)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
58 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
59 size_t in_size, out_size, req_size, val_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
60 struct as *as;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
61 struct hat *hat;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
62 int i, j, out_idx, info_count;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
63 lgrp_t *lgrp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
64 pfn_t pfn;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
65 ssize_t pgsz;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
66 int *req_array, *val_array;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
67 uint64_t *in_array, *out_array;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
68 uint64_t addr, paddr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
69 uintptr_t vaddr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
70 int ret = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
71 struct meminfo minfo;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
72 #if defined(_SYSCALL32_IMPL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
73 struct meminfo32 minfo32;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
74 #endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
75
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
76 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
77 * Make sure that there is at least one address to translate and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
78 * limit how many virtual addresses the kernel can do per call
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
79 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
80 if (addr_count < 1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
81 return (set_errno(EINVAL));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
82 else if (addr_count > MAX_MEMINFO_CNT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
83 addr_count = MAX_MEMINFO_CNT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
84
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
85 if (get_udatamodel() == DATAMODEL_NATIVE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
86 if (copyin(mip, &minfo, sizeof (struct meminfo)))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
87 return (set_errno(EFAULT));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
88 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
89 #if defined(_SYSCALL32_IMPL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
90 else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
91 bzero(&minfo, sizeof (minfo));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
92 if (copyin(mip, &minfo32, sizeof (struct meminfo32)))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
93 return (set_errno(EFAULT));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
94 minfo.mi_inaddr = (const uint64_t *)(uintptr_t)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
95 minfo32.mi_inaddr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
96 minfo.mi_info_req = (const uint_t *)(uintptr_t)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
97 minfo32.mi_info_req;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
98 minfo.mi_info_count = minfo32.mi_info_count;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
99 minfo.mi_outdata = (uint64_t *)(uintptr_t)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
100 minfo32.mi_outdata;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
101 minfo.mi_validity = (uint_t *)(uintptr_t)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
102 minfo32.mi_validity;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
103 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
104 #endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
105 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
106 * all the input parameters have been copied in:-
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
107 * addr_count - number of input addresses
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
108 * minfo.mi_inaddr - array of input addresses
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
109 * minfo.mi_info_req - array of types of information requested
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
110 * minfo.mi_info_count - no. of pieces of info requested for each addr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
111 * minfo.mi_outdata - array into which the results are placed
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
112 * minfo.mi_validity - array containing bitwise result codes; 0th bit
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
113 * evaluates validity of corresponding input
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
114 * address, 1st bit validity of response to first
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
115 * member of info_req, etc.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
116 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
117
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
118 /* make sure mi_info_count is within limit */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
119 info_count = minfo.mi_info_count;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
120 if (info_count < 1 || info_count > MAX_MEMINFO_REQ)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
121 return (set_errno(EINVAL));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
122
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
123 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
124 * allocate buffer in_array for the input addresses and copy them in
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
125 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
126 in_size = sizeof (uint64_t) * addr_count;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
127 in_array = kmem_alloc(in_size, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
128 if (copyin(minfo.mi_inaddr, in_array, in_size)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
129 kmem_free(in_array, in_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
130 return (set_errno(EFAULT));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
131 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
132
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
133 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
134 * allocate buffer req_array for the input info_reqs and copy them in
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
135 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
136 req_size = sizeof (uint_t) * info_count;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
137 req_array = kmem_alloc(req_size, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
138 if (copyin(minfo.mi_info_req, req_array, req_size)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
139 kmem_free(req_array, req_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
140 kmem_free(in_array, in_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
141 return (set_errno(EFAULT));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
142 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
143
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
144 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
145 * allocate buffer out_array which holds the results and will have
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
146 * to be copied out later
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
147 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
148 out_size = sizeof (uint64_t) * addr_count * info_count;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
149 out_array = kmem_alloc(out_size, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
150
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
151 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
152 * allocate buffer val_array which holds the validity bits and will
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
153 * have to be copied out later
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
154 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
155 val_size = sizeof (uint_t) * addr_count;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
156 val_array = kmem_alloc(val_size, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
157
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
158 if ((req_array[0] & MEMINFO_MASK) == MEMINFO_PLGRP) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
159 /* find the corresponding lgroup for each physical address */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
160 for (i = 0; i < addr_count; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
161 paddr = in_array[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
162 pfn = btop(paddr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
163 lgrp = lgrp_pfn_to_lgrp(pfn);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
164 if (lgrp) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
165 out_array[i] = lgrp->lgrp_id;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
166 val_array[i] = VALID_ADDR | VALID_REQ;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
167 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
168 out_array[i] = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
169 val_array[i] = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
170 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
171 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
172 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
173 /* get the corresponding memory info for each virtual address */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
174 as = curproc->p_as;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
175
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
176 AS_LOCK_ENTER(as, &as->a_lock, RW_READER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
177 hat = as->a_hat;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
178 for (i = out_idx = 0; i < addr_count; i++, out_idx +=
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
179 info_count) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
180 addr = in_array[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
181 vaddr = (uintptr_t)(addr & ~PAGEOFFSET);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
182 if (!as_segat(as, (caddr_t)vaddr)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
183 val_array[i] = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
184 continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
185 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
186 val_array[i] = VALID_ADDR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
187 pfn = hat_getpfnum(hat, (caddr_t)vaddr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
188 if (pfn != PFN_INVALID) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
189 paddr = (uint64_t)((pfn << PAGESHIFT) |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
190 (addr & PAGEOFFSET));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
191 for (j = 0; j < info_count; j++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
192 switch (req_array[j] & MEMINFO_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
193 case MEMINFO_VPHYSICAL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
194 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
195 * return the physical address
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
196 * corresponding to the input
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
197 * virtual address
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
198 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
199 out_array[out_idx + j] = paddr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
200 val_array[i] |= VALID_REQ << j;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
201 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
202 case MEMINFO_VLGRP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
203 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
204 * return the lgroup of physical
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
205 * page corresponding to the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
206 * input virtual address
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
207 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
208 lgrp = lgrp_pfn_to_lgrp(pfn);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
209 if (lgrp) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
210 out_array[out_idx + j] =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
211 lgrp->lgrp_id;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
212 val_array[i] |=
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
213 VALID_REQ << j;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
214 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
215 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
216 case MEMINFO_VPAGESIZE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
217 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
218 * return the size of physical
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
219 * page corresponding to the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
220 * input virtual address
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
221 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
222 pgsz = hat_getpagesize(hat,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
223 (caddr_t)vaddr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
224 if (pgsz != -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
225 out_array[out_idx + j] =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
226 pgsz;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
227 val_array[i] |=
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
228 VALID_REQ << j;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
229 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
230 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
231 case MEMINFO_VREPLCNT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
232 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
233 * for future use:-
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
234 * return the no. replicated
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
235 * physical pages corresponding
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
236 * to the input virtual address,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
237 * so it is always 0 at the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
238 * moment
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
239 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
240 out_array[out_idx + j] = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
241 val_array[i] |= VALID_REQ << j;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
242 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
243 case MEMINFO_VREPL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
244 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
245 * for future use:-
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
246 * return the nth physical
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
247 * replica of the specified
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
248 * virtual address
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
249 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
250 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
251 case MEMINFO_VREPL_LGRP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
252 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
253 * for future use:-
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
254 * return the lgroup of nth
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
255 * physical replica of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
256 * specified virtual address
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
257 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
258 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
259 case MEMINFO_PLGRP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
260 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
261 * this is for physical address
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
262 * only, shouldn't mix with
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
263 * virtual address
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
264 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
265 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
266 default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
267 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
268 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
269 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
270 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
271 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
272 AS_LOCK_EXIT(as, &as->a_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
273 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
274
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
275 /* copy out the results and validity bits and free the buffers */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
276 if ((copyout(out_array, minfo.mi_outdata, out_size) != 0) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
277 (copyout(val_array, minfo.mi_validity, val_size) != 0))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
278 ret = set_errno(EFAULT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
279
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
280 kmem_free(in_array, in_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
281 kmem_free(out_array, out_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
282 kmem_free(req_array, req_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
283 kmem_free(val_array, val_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
284
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
285 return (ret);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
286 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
287
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
288
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
289 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
290 * Initialize lgroup affinities for thread
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
291 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
292 void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
293 lgrp_affinity_init(lgrp_affinity_t **bufaddr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
294 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
295 if (bufaddr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
296 *bufaddr = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
297 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
298
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
299
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
300 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
301 * Free lgroup affinities for thread and set to NULL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
302 * just in case thread gets recycled
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
303 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
304 void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
305 lgrp_affinity_free(lgrp_affinity_t **bufaddr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
306 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
307 if (bufaddr && *bufaddr) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
308 kmem_free(*bufaddr, nlgrpsmax * sizeof (lgrp_affinity_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
309 *bufaddr = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
310 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
311 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
312
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
313
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
314 #define P_ANY -2 /* cookie specifying any ID */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
315
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
316
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
317 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
318 * Find LWP with given ID in specified process and get its affinity for
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
319 * specified lgroup
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
320 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
321 lgrp_affinity_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
322 lgrp_affinity_get_thread(proc_t *p, id_t lwpid, lgrp_id_t lgrp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
323 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
324 lgrp_affinity_t aff;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
325 int found;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
326 kthread_t *t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
327
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
328 ASSERT(MUTEX_HELD(&p->p_lock));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
329
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
330 aff = LGRP_AFF_NONE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
331 found = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
332 t = p->p_tlist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
333 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
334 * The process may be executing in proc_exit() and its p->p_list may be
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
335 * already NULL.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
336 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
337 if (t == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
338 return (set_errno(ESRCH));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
339
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
340 do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
341 if (t->t_tid == lwpid || lwpid == P_ANY) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
342 thread_lock(t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
343 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
344 * Check to see whether caller has permission to set
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
345 * affinity for LWP
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
346 */
7873
e3677dd00778 Mediate some process operations
Stephen Smalley <sds@tycho.nsa.gov>
parents: 2988
diff changeset
347 if (t->t_cid == 0 || !hasprocperm(t->t_cred, CRED(),
7887
f9ded24b041a [fmac-discuss] [PATCH] Fix more cstyle issues
Stephen Smalley <sds@tycho.nsa.gov>
parents: 7873
diff changeset
348 PROCESS__SETSCHED)) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
349 thread_unlock(t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
350 return (set_errno(EPERM));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
351 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
352
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
353 if (t->t_lgrp_affinity)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
354 aff = t->t_lgrp_affinity[lgrp];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
355 thread_unlock(t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
356 found = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
357 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
358 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
359 } while ((t = t->t_forw) != p->p_tlist);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
360 if (!found)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
361 aff = set_errno(ESRCH);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
362
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
363 return (aff);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
364 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
365
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
366
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
367 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
368 * Get lgroup affinity for given LWP
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
369 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
370 lgrp_affinity_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
371 lgrp_affinity_get(lgrp_affinity_args_t *ap)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
372 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
373 lgrp_affinity_t aff;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
374 lgrp_affinity_args_t args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
375 id_t id;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
376 idtype_t idtype;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
377 lgrp_id_t lgrp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
378 proc_t *p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
379 kthread_t *t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
380
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
381 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
382 * Copyin arguments
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
383 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
384 if (copyin(ap, &args, sizeof (lgrp_affinity_args_t)) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
385 return (set_errno(EFAULT));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
386
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
387 id = args.id;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
388 idtype = args.idtype;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
389 lgrp = args.lgrp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
390
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
391 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
392 * Check for invalid lgroup
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
393 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
394 if (lgrp < 0 || lgrp == LGRP_NONE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
395 return (set_errno(EINVAL));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
396
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
397 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
398 * Check for existing lgroup
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
399 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
400 if (lgrp > lgrp_alloc_max)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
401 return (set_errno(ESRCH));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
402
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
403 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
404 * Get lgroup affinity for given LWP or process
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
405 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
406 switch (idtype) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
407
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
408 case P_LWPID:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
409 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
410 * LWP in current process
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
411 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
412 p = curproc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
413 mutex_enter(&p->p_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
414 if (id != P_MYID) /* different thread */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
415 aff = lgrp_affinity_get_thread(p, id, lgrp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
416 else { /* current thread */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
417 aff = LGRP_AFF_NONE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
418 t = curthread;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
419 thread_lock(t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
420 if (t->t_lgrp_affinity)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
421 aff = t->t_lgrp_affinity[lgrp];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
422 thread_unlock(t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
423 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
424 mutex_exit(&p->p_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
425 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
426
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
427 case P_PID:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
428 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
429 * Process
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
430 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
431 mutex_enter(&pidlock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
432
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
433 if (id == P_MYID)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
434 p = curproc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
435 else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
436 p = prfind(id);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
437 if (p == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
438 mutex_exit(&pidlock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
439 return (set_errno(ESRCH));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
440 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
441 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
442
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
443 mutex_enter(&p->p_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
444 aff = lgrp_affinity_get_thread(p, P_ANY, lgrp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
445 mutex_exit(&p->p_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
446
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
447 mutex_exit(&pidlock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
448 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
449
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
450 default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
451 aff = set_errno(EINVAL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
452 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
453 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
454
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
455 return (aff);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
456 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
457
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
458
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
459 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
460 * Find lgroup for which this thread has most affinity in specified partition
2988
5c29819d6612 6469235 s10u3_06;Panic lgrp->lgrp_parent->lgrp_id == lpl->lpl_parent->lpl_lgrpid, file: ../../common/os/lgrp
jjc
parents: 2685
diff changeset
461 * starting from home lgroup unless specified starting lgroup is preferred
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
462 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
463 lpl_t *
2988
5c29819d6612 6469235 s10u3_06;Panic lgrp->lgrp_parent->lgrp_id == lpl->lpl_parent->lpl_lgrpid, file: ../../common/os/lgrp
jjc
parents: 2685
diff changeset
464 lgrp_affinity_best(kthread_t *t, struct cpupart *cpupart, lgrp_id_t start,
5c29819d6612 6469235 s10u3_06;Panic lgrp->lgrp_parent->lgrp_id == lpl->lpl_parent->lpl_lgrpid, file: ../../common/os/lgrp
jjc
parents: 2685
diff changeset
465 boolean_t prefer_start)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
466 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
467 lgrp_affinity_t *affs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
468 lgrp_affinity_t best_aff;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
469 lpl_t *best_lpl;
2988
5c29819d6612 6469235 s10u3_06;Panic lgrp->lgrp_parent->lgrp_id == lpl->lpl_parent->lpl_lgrpid, file: ../../common/os/lgrp
jjc
parents: 2685
diff changeset
470 lgrp_id_t finish;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
471 lgrp_id_t home;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
472 lgrp_id_t lgrpid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
473 lpl_t *lpl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
474
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
475 ASSERT(t != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
476 ASSERT((MUTEX_HELD(&cpu_lock) || curthread->t_preempt > 0) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
477 (MUTEX_HELD(&ttoproc(t)->p_lock) && THREAD_LOCK_HELD(t)));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
478 ASSERT(cpupart != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
479
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
480 if (t->t_lgrp_affinity == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
481 return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
482
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
483 affs = t->t_lgrp_affinity;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
484
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
485 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
486 * Thread bound to CPU
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
487 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
488 if (t->t_bind_cpu != PBIND_NONE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
489 cpu_t *cp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
490
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
491 /*
2988
5c29819d6612 6469235 s10u3_06;Panic lgrp->lgrp_parent->lgrp_id == lpl->lpl_parent->lpl_lgrpid, file: ../../common/os/lgrp
jjc
parents: 2685
diff changeset
492 * Find which lpl has most affinity among leaf lpl directly
5c29819d6612 6469235 s10u3_06;Panic lgrp->lgrp_parent->lgrp_id == lpl->lpl_parent->lpl_lgrpid, file: ../../common/os/lgrp
jjc
parents: 2685
diff changeset
493 * containing CPU and its ancestor lpls
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
494 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
495 cp = cpu[t->t_bind_cpu];
2988
5c29819d6612 6469235 s10u3_06;Panic lgrp->lgrp_parent->lgrp_id == lpl->lpl_parent->lpl_lgrpid, file: ../../common/os/lgrp
jjc
parents: 2685
diff changeset
496
5c29819d6612 6469235 s10u3_06;Panic lgrp->lgrp_parent->lgrp_id == lpl->lpl_parent->lpl_lgrpid, file: ../../common/os/lgrp
jjc
parents: 2685
diff changeset
497 best_lpl = lpl = cp->cpu_lpl;
5c29819d6612 6469235 s10u3_06;Panic lgrp->lgrp_parent->lgrp_id == lpl->lpl_parent->lpl_lgrpid, file: ../../common/os/lgrp
jjc
parents: 2685
diff changeset
498 best_aff = affs[best_lpl->lpl_lgrpid];
5c29819d6612 6469235 s10u3_06;Panic lgrp->lgrp_parent->lgrp_id == lpl->lpl_parent->lpl_lgrpid, file: ../../common/os/lgrp
jjc
parents: 2685
diff changeset
499 while (lpl->lpl_parent != NULL) {
5c29819d6612 6469235 s10u3_06;Panic lgrp->lgrp_parent->lgrp_id == lpl->lpl_parent->lpl_lgrpid, file: ../../common/os/lgrp
jjc
parents: 2685
diff changeset
500 lpl = lpl->lpl_parent;
5c29819d6612 6469235 s10u3_06;Panic lgrp->lgrp_parent->lgrp_id == lpl->lpl_parent->lpl_lgrpid, file: ../../common/os/lgrp
jjc
parents: 2685
diff changeset
501 lgrpid = lpl->lpl_lgrpid;
5c29819d6612 6469235 s10u3_06;Panic lgrp->lgrp_parent->lgrp_id == lpl->lpl_parent->lpl_lgrpid, file: ../../common/os/lgrp
jjc
parents: 2685
diff changeset
502 if (affs[lgrpid] > best_aff) {
5c29819d6612 6469235 s10u3_06;Panic lgrp->lgrp_parent->lgrp_id == lpl->lpl_parent->lpl_lgrpid, file: ../../common/os/lgrp
jjc
parents: 2685
diff changeset
503 best_lpl = lpl;
5c29819d6612 6469235 s10u3_06;Panic lgrp->lgrp_parent->lgrp_id == lpl->lpl_parent->lpl_lgrpid, file: ../../common/os/lgrp
jjc
parents: 2685
diff changeset
504 best_aff = affs[lgrpid];
5c29819d6612 6469235 s10u3_06;Panic lgrp->lgrp_parent->lgrp_id == lpl->lpl_parent->lpl_lgrpid, file: ../../common/os/lgrp
jjc
parents: 2685
diff changeset
505 }
5c29819d6612 6469235 s10u3_06;Panic lgrp->lgrp_parent->lgrp_id == lpl->lpl_parent->lpl_lgrpid, file: ../../common/os/lgrp
jjc
parents: 2685
diff changeset
506 }
5c29819d6612 6469235 s10u3_06;Panic lgrp->lgrp_parent->lgrp_id == lpl->lpl_parent->lpl_lgrpid, file: ../../common/os/lgrp
jjc
parents: 2685
diff changeset
507 return (best_lpl);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
508 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
509
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
510 /*
2988
5c29819d6612 6469235 s10u3_06;Panic lgrp->lgrp_parent->lgrp_id == lpl->lpl_parent->lpl_lgrpid, file: ../../common/os/lgrp
jjc
parents: 2685
diff changeset
511 * Start searching from home lgroup unless given starting lgroup is
5c29819d6612 6469235 s10u3_06;Panic lgrp->lgrp_parent->lgrp_id == lpl->lpl_parent->lpl_lgrpid, file: ../../common/os/lgrp
jjc
parents: 2685
diff changeset
512 * preferred or home lgroup isn't in given pset. Use root lgroup as
5c29819d6612 6469235 s10u3_06;Panic lgrp->lgrp_parent->lgrp_id == lpl->lpl_parent->lpl_lgrpid, file: ../../common/os/lgrp
jjc
parents: 2685
diff changeset
513 * starting point if both home and starting lgroups aren't in given
5c29819d6612 6469235 s10u3_06;Panic lgrp->lgrp_parent->lgrp_id == lpl->lpl_parent->lpl_lgrpid, file: ../../common/os/lgrp
jjc
parents: 2685
diff changeset
514 * pset.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
515 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
516 ASSERT(start >= 0 && start <= lgrp_alloc_max);
2988
5c29819d6612 6469235 s10u3_06;Panic lgrp->lgrp_parent->lgrp_id == lpl->lpl_parent->lpl_lgrpid, file: ../../common/os/lgrp
jjc
parents: 2685
diff changeset
517 home = t->t_lpl->lpl_lgrpid;
5c29819d6612 6469235 s10u3_06;Panic lgrp->lgrp_parent->lgrp_id == lpl->lpl_parent->lpl_lgrpid, file: ../../common/os/lgrp
jjc
parents: 2685
diff changeset
518 if (!prefer_start && LGRP_CPUS_IN_PART(home, cpupart))
5c29819d6612 6469235 s10u3_06;Panic lgrp->lgrp_parent->lgrp_id == lpl->lpl_parent->lpl_lgrpid, file: ../../common/os/lgrp
jjc
parents: 2685
diff changeset
519 lgrpid = home;
5c29819d6612 6469235 s10u3_06;Panic lgrp->lgrp_parent->lgrp_id == lpl->lpl_parent->lpl_lgrpid, file: ../../common/os/lgrp
jjc
parents: 2685
diff changeset
520 else if (start != LGRP_NONE && LGRP_CPUS_IN_PART(start, cpupart))
5c29819d6612 6469235 s10u3_06;Panic lgrp->lgrp_parent->lgrp_id == lpl->lpl_parent->lpl_lgrpid, file: ../../common/os/lgrp
jjc
parents: 2685
diff changeset
521 lgrpid = start;
5c29819d6612 6469235 s10u3_06;Panic lgrp->lgrp_parent->lgrp_id == lpl->lpl_parent->lpl_lgrpid, file: ../../common/os/lgrp
jjc
parents: 2685
diff changeset
522 else
5c29819d6612 6469235 s10u3_06;Panic lgrp->lgrp_parent->lgrp_id == lpl->lpl_parent->lpl_lgrpid, file: ../../common/os/lgrp
jjc
parents: 2685
diff changeset
523 lgrpid = LGRP_ROOTID;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
524
2988
5c29819d6612 6469235 s10u3_06;Panic lgrp->lgrp_parent->lgrp_id == lpl->lpl_parent->lpl_lgrpid, file: ../../common/os/lgrp
jjc
parents: 2685
diff changeset
525 best_lpl = &cpupart->cp_lgrploads[lgrpid];
5c29819d6612 6469235 s10u3_06;Panic lgrp->lgrp_parent->lgrp_id == lpl->lpl_parent->lpl_lgrpid, file: ../../common/os/lgrp
jjc
parents: 2685
diff changeset
526 best_aff = affs[lgrpid];
5c29819d6612 6469235 s10u3_06;Panic lgrp->lgrp_parent->lgrp_id == lpl->lpl_parent->lpl_lgrpid, file: ../../common/os/lgrp
jjc
parents: 2685
diff changeset
527 finish = lgrpid;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
528 do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
529 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
530 * Skip any lgroups that don't have CPU resources
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
531 * in this processor set.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
532 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
533 if (!LGRP_CPUS_IN_PART(lgrpid, cpupart)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
534 if (++lgrpid > lgrp_alloc_max)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
535 lgrpid = 0; /* wrap the search */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
536 continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
537 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
538
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
539 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
540 * Find lgroup with most affinity
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
541 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
542 lpl = &cpupart->cp_lgrploads[lgrpid];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
543 if (affs[lgrpid] > best_aff) {
2685
80399c17fa47 PSARC 2006/421 MPO Control And Observability Tools
akolb
parents: 0
diff changeset
544 best_aff = affs[lgrpid];
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
545 best_lpl = lpl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
546 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
547
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
548 if (++lgrpid > lgrp_alloc_max)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
549 lgrpid = 0; /* wrap the search */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
550
2988
5c29819d6612 6469235 s10u3_06;Panic lgrp->lgrp_parent->lgrp_id == lpl->lpl_parent->lpl_lgrpid, file: ../../common/os/lgrp
jjc
parents: 2685
diff changeset
551 } while (lgrpid != finish);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
552
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
553 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
554 * No lgroup (in this pset) with any affinity
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
555 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
556 if (best_aff == LGRP_AFF_NONE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
557 return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
558
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
559 lgrpid = best_lpl->lpl_lgrpid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
560 ASSERT(LGRP_CPUS_IN_PART(lgrpid, cpupart) && best_lpl->lpl_ncpu > 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
561
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
562 return (best_lpl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
563 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
564
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
565
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
566 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
567 * Set thread's affinity for given lgroup
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
568 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
569 int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
570 lgrp_affinity_set_thread(kthread_t *t, lgrp_id_t lgrp, lgrp_affinity_t aff,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
571 lgrp_affinity_t **aff_buf)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
572 {
2685
80399c17fa47 PSARC 2006/421 MPO Control And Observability Tools
akolb
parents: 0
diff changeset
573 lgrp_affinity_t *affs;
80399c17fa47 PSARC 2006/421 MPO Control And Observability Tools
akolb
parents: 0
diff changeset
574 lgrp_id_t best;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
575 lpl_t *best_lpl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
576 lgrp_id_t home;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
577 int retval;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
578
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
579 ASSERT(t != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
580 ASSERT(MUTEX_HELD(&ttoproc(t)->p_lock));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
581
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
582 retval = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
583
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
584 thread_lock(t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
585
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
586 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
587 * Check to see whether caller has permission to set affinity for
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
588 * thread
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
589 */
7873
e3677dd00778 Mediate some process operations
Stephen Smalley <sds@tycho.nsa.gov>
parents: 2988
diff changeset
590 if (t->t_cid == 0 || !hasprocperm(t->t_cred, CRED(),
7887
f9ded24b041a [fmac-discuss] [PATCH] Fix more cstyle issues
Stephen Smalley <sds@tycho.nsa.gov>
parents: 7873
diff changeset
591 PROCESS__SETSCHED)) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
592 thread_unlock(t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
593 return (set_errno(EPERM));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
594 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
595
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
596 if (t->t_lgrp_affinity == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
597 if (aff == LGRP_AFF_NONE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
598 thread_unlock(t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
599 return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
600 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
601 ASSERT(aff_buf != NULL && *aff_buf != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
602 t->t_lgrp_affinity = *aff_buf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
603 *aff_buf = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
604 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
605
2685
80399c17fa47 PSARC 2006/421 MPO Control And Observability Tools
akolb
parents: 0
diff changeset
606 affs = t->t_lgrp_affinity;
80399c17fa47 PSARC 2006/421 MPO Control And Observability Tools
akolb
parents: 0
diff changeset
607 affs[lgrp] = aff;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
608
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
609 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
610 * Find lgroup for which thread has most affinity,
2685
80399c17fa47 PSARC 2006/421 MPO Control And Observability Tools
akolb
parents: 0
diff changeset
611 * starting with lgroup for which affinity being set
80399c17fa47 PSARC 2006/421 MPO Control And Observability Tools
akolb
parents: 0
diff changeset
612 */
2988
5c29819d6612 6469235 s10u3_06;Panic lgrp->lgrp_parent->lgrp_id == lpl->lpl_parent->lpl_lgrpid, file: ../../common/os/lgrp
jjc
parents: 2685
diff changeset
613 best_lpl = lgrp_affinity_best(t, t->t_cpupart, lgrp, B_TRUE);
2685
80399c17fa47 PSARC 2006/421 MPO Control And Observability Tools
akolb
parents: 0
diff changeset
614
80399c17fa47 PSARC 2006/421 MPO Control And Observability Tools
akolb
parents: 0
diff changeset
615 /*
80399c17fa47 PSARC 2006/421 MPO Control And Observability Tools
akolb
parents: 0
diff changeset
616 * Rehome if found lgroup with more affinity than home or lgroup for
80399c17fa47 PSARC 2006/421 MPO Control And Observability Tools
akolb
parents: 0
diff changeset
617 * which affinity is being set has same affinity as home
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
618 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
619 home = t->t_lpl->lpl_lgrpid;
2685
80399c17fa47 PSARC 2006/421 MPO Control And Observability Tools
akolb
parents: 0
diff changeset
620 if (best_lpl != NULL && best_lpl != t->t_lpl) {
80399c17fa47 PSARC 2006/421 MPO Control And Observability Tools
akolb
parents: 0
diff changeset
621 best = best_lpl->lpl_lgrpid;
80399c17fa47 PSARC 2006/421 MPO Control And Observability Tools
akolb
parents: 0
diff changeset
622 if (affs[best] > affs[home] || (affs[best] == affs[home] &&
80399c17fa47 PSARC 2006/421 MPO Control And Observability Tools
akolb
parents: 0
diff changeset
623 best == lgrp))
80399c17fa47 PSARC 2006/421 MPO Control And Observability Tools
akolb
parents: 0
diff changeset
624 lgrp_move_thread(t, best_lpl, 1);
80399c17fa47 PSARC 2006/421 MPO Control And Observability Tools
akolb
parents: 0
diff changeset
625 }
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
626
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
627 thread_unlock(t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
628
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
629 return (retval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
630 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
631
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
632
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
633 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
634 * Set process' affinity for specified lgroup
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
635 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
636 int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
637 lgrp_affinity_set_proc(proc_t *p, lgrp_id_t lgrp, lgrp_affinity_t aff,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
638 lgrp_affinity_t **aff_buf_array)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
639 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
640 lgrp_affinity_t *buf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
641 int err = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
642 int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
643 int retval;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
644 kthread_t *t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
645
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
646 ASSERT(MUTEX_HELD(&pidlock) && MUTEX_HELD(&p->p_lock));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
647 ASSERT(aff_buf_array != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
648
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
649 i = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
650 t = p->p_tlist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
651 if (t != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
652 do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
653 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
654 * Set lgroup affinity for thread
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
655 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
656 buf = aff_buf_array[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
657 retval = lgrp_affinity_set_thread(t, lgrp, aff, &buf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
658
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
659 if (err == 0 && retval != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
660 err = retval;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
661
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
662 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
663 * Advance pointer to next buffer
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
664 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
665 if (buf == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
666 ASSERT(i < p->p_lwpcnt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
667 aff_buf_array[i] = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
668 i++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
669 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
670
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
671 } while ((t = t->t_forw) != p->p_tlist);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
672 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
673 return (err);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
674 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
675
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
676
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
677 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
678 * Set LWP's or process' affinity for specified lgroup
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
679 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
680 * When setting affinities, pidlock, process p_lock, and thread_lock()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
681 * need to be held in that order to protect target thread's pset, process,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
682 * process contents, and thread contents. thread_lock() does splhigh(),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
683 * so it ends up having similiar effect as kpreempt_disable(), so it will
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
684 * protect calls to lgrp_move_thread() and lgrp_choose() from pset changes.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
685 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
686 int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
687 lgrp_affinity_set(lgrp_affinity_args_t *ap)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
688 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
689 lgrp_affinity_t aff;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
690 lgrp_affinity_t *aff_buf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
691 lgrp_affinity_args_t args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
692 id_t id;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
693 idtype_t idtype;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
694 lgrp_id_t lgrp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
695 int nthreads;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
696 proc_t *p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
697 int retval;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
698
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
699 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
700 * Copyin arguments
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
701 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
702 if (copyin(ap, &args, sizeof (lgrp_affinity_args_t)) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
703 return (set_errno(EFAULT));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
704
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
705 idtype = args.idtype;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
706 id = args.id;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
707 lgrp = args.lgrp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
708 aff = args.aff;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
709
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
710 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
711 * Check for invalid lgroup
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
712 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
713 if (lgrp < 0 || lgrp == LGRP_NONE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
714 return (set_errno(EINVAL));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
715
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
716 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
717 * Check for existing lgroup
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
718 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
719 if (lgrp > lgrp_alloc_max)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
720 return (set_errno(ESRCH));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
721
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
722 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
723 * Check for legal affinity
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
724 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
725 if (aff != LGRP_AFF_NONE && aff != LGRP_AFF_WEAK &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
726 aff != LGRP_AFF_STRONG)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
727 return (set_errno(EINVAL));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
728
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
729 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
730 * Must be process or LWP ID
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
731 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
732 if (idtype != P_LWPID && idtype != P_PID)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
733 return (set_errno(EINVAL));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
734
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
735 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
736 * Set given LWP's or process' affinity for specified lgroup
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
737 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
738 switch (idtype) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
739
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
740 case P_LWPID:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
741 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
742 * Allocate memory for thread's lgroup affinities
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
743 * ahead of time w/o holding locks
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
744 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
745 aff_buf = kmem_zalloc(nlgrpsmax * sizeof (lgrp_affinity_t),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
746 KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
747
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
748 p = curproc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
749
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
750 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
751 * Set affinity for thread
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
752 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
753 mutex_enter(&p->p_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
754 if (id == P_MYID) { /* current thread */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
755 retval = lgrp_affinity_set_thread(curthread, lgrp, aff,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
756 &aff_buf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
757 } else if (p->p_tlist == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
758 retval = set_errno(ESRCH);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
759 } else { /* other thread */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
760 int found = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
761 kthread_t *t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
762
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
763 t = p->p_tlist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
764 do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
765 if (t->t_tid == id) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
766 retval = lgrp_affinity_set_thread(t,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
767 lgrp, aff, &aff_buf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
768 found = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
769 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
770 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
771 } while ((t = t->t_forw) != p->p_tlist);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
772 if (!found)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
773 retval = set_errno(ESRCH);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
774 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
775 mutex_exit(&p->p_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
776
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
777 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
778 * Free memory for lgroup affinities,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
779 * since thread didn't need it
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
780 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
781 if (aff_buf)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
782 kmem_free(aff_buf,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
783 nlgrpsmax * sizeof (lgrp_affinity_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
784
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
785 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
786
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
787 case P_PID:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
788
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
789 do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
790 lgrp_affinity_t **aff_buf_array;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
791 int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
792 size_t size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
793
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
794 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
795 * Get process
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
796 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
797 mutex_enter(&pidlock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
798
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
799 if (id == P_MYID)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
800 p = curproc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
801 else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
802 p = prfind(id);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
803
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
804 if (p == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
805 mutex_exit(&pidlock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
806 return (set_errno(ESRCH));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
807 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
808
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
809 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
810 * Get number of threads in process
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
811 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
812 * NOTE: Only care about user processes,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
813 * so p_lwpcnt should be number of threads.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
814 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
815 mutex_enter(&p->p_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
816 nthreads = p->p_lwpcnt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
817 mutex_exit(&p->p_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
818
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
819 mutex_exit(&pidlock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
820
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
821 if (nthreads < 1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
822 return (set_errno(ESRCH));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
823
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
824 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
825 * Preallocate memory for lgroup affinities for
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
826 * each thread in process now to avoid holding
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
827 * any locks. Allocate an array to hold a buffer
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
828 * for each thread.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
829 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
830 aff_buf_array = kmem_zalloc(nthreads *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
831 sizeof (lgrp_affinity_t *), KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
832
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
833 size = nlgrpsmax * sizeof (lgrp_affinity_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
834 for (i = 0; i < nthreads; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
835 aff_buf_array[i] = kmem_zalloc(size, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
836
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
837 mutex_enter(&pidlock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
838
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
839 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
840 * Get process again since dropped locks to allocate
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
841 * memory (except current process)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
842 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
843 if (id != P_MYID)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
844 p = prfind(id);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
845
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
846 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
847 * Process went away after we dropped locks and before
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
848 * reacquiring them, so drop locks, free memory, and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
849 * return.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
850 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
851 if (p == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
852 mutex_exit(&pidlock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
853 for (i = 0; i < nthreads; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
854 kmem_free(aff_buf_array[i], size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
855 kmem_free(aff_buf_array,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
856 nthreads * sizeof (lgrp_affinity_t *));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
857 return (set_errno(ESRCH));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
858 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
859
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
860 mutex_enter(&p->p_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
861
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
862 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
863 * See whether number of threads is same
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
864 * If not, drop locks, free memory, and try again
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
865 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
866 if (nthreads != p->p_lwpcnt) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
867 mutex_exit(&p->p_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
868 mutex_exit(&pidlock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
869 for (i = 0; i < nthreads; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
870 kmem_free(aff_buf_array[i], size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
871 kmem_free(aff_buf_array,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
872 nthreads * sizeof (lgrp_affinity_t *));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
873 continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
874 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
875
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
876 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
877 * Set lgroup affinity for threads in process
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
878 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
879 retval = lgrp_affinity_set_proc(p, lgrp, aff,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
880 aff_buf_array);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
881
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
882 mutex_exit(&p->p_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
883 mutex_exit(&pidlock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
884
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
885 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
886 * Free any leftover memory, since some threads may
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
887 * have already allocated memory and set lgroup
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
888 * affinities before
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
889 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
890 for (i = 0; i < nthreads; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
891 if (aff_buf_array[i] != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
892 kmem_free(aff_buf_array[i], size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
893 kmem_free(aff_buf_array,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
894 nthreads * sizeof (lgrp_affinity_t *));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
895
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
896 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
897
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
898 } while (nthreads != p->p_lwpcnt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
899
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
900 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
901
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
902 default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
903 retval = set_errno(EINVAL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
904 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
905 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
906
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
907 return (retval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
908 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
909
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
910
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
911 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
912 * Return the latest generation number for the lgroup hierarchy
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
913 * with the given view
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
914 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
915 lgrp_gen_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
916 lgrp_generation(lgrp_view_t view)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
917 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
918 cpupart_t *cpupart;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
919 uint_t gen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
920
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
921 kpreempt_disable();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
922
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
923 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
924 * Determine generation number for given view
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
925 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
926 if (view == LGRP_VIEW_OS)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
927 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
928 * Return generation number of lgroup hierarchy for OS view
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
929 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
930 gen = lgrp_gen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
931 else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
932 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
933 * For caller's view, use generation numbers for lgroup
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
934 * hierarchy and caller's pset
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
935 * NOTE: Caller needs to check for change in pset ID
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
936 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
937 cpupart = curthread->t_cpupart;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
938 ASSERT(cpupart);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
939 gen = lgrp_gen + cpupart->cp_gen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
940 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
941
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
942 kpreempt_enable();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
943
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
944 return (gen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
945 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
946
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
947
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
948 lgrp_id_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
949 lgrp_home_thread(kthread_t *t)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
950 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
951 lgrp_id_t home;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
952
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
953 ASSERT(t != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
954 ASSERT(MUTEX_HELD(&ttoproc(t)->p_lock));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
955
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
956 thread_lock(t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
957
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
958 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
959 * Check to see whether caller has permission to set affinity for
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
960 * thread
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
961 */
7873
e3677dd00778 Mediate some process operations
Stephen Smalley <sds@tycho.nsa.gov>
parents: 2988
diff changeset
962 if (t->t_cid == 0 || !hasprocperm(t->t_cred, CRED(),
7887
f9ded24b041a [fmac-discuss] [PATCH] Fix more cstyle issues
Stephen Smalley <sds@tycho.nsa.gov>
parents: 7873
diff changeset
963 PROCESS__SETSCHED)) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
964 thread_unlock(t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
965 return (set_errno(EPERM));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
966 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
967
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
968 home = lgrp_home_id(t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
969
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
970 thread_unlock(t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
971 return (home);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
972 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
973
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
974
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
975 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
976 * Get home lgroup of given process or thread
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
977 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
978 lgrp_id_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
979 lgrp_home_get(idtype_t idtype, id_t id)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
980 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
981 proc_t *p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
982 lgrp_id_t retval;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
983 kthread_t *t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
984
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
985 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
986 * Get home lgroup of given LWP or process
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
987 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
988 switch (idtype) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
989
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
990 case P_LWPID:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
991 p = curproc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
992
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
993 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
994 * Set affinity for thread
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
995 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
996 mutex_enter(&p->p_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
997 if (id == P_MYID) { /* current thread */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
998 retval = lgrp_home_thread(curthread);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
999 } else if (p->p_tlist == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1000 retval = set_errno(ESRCH);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1001 } else { /* other thread */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1002 int found = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1003
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1004 t = p->p_tlist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1005 do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1006 if (t->t_tid == id) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1007 retval = lgrp_home_thread(t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1008 found = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1009 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1010 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1011 } while ((t = t->t_forw) != p->p_tlist);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1012 if (!found)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1013 retval = set_errno(ESRCH);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1014 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1015 mutex_exit(&p->p_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1016 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1017
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1018 case P_PID:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1019 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1020 * Get process
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1021 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1022 mutex_enter(&pidlock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1023
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1024 if (id == P_MYID)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1025 p = curproc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1026 else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1027 p = prfind(id);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1028
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1029 if (p == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1030 mutex_exit(&pidlock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1031 return (set_errno(ESRCH));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1032 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1033
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1034 mutex_enter(&p->p_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1035 t = p->p_tlist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1036 if (t == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1037 retval = set_errno(ESRCH);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1038 else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1039 retval = lgrp_home_thread(t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1040 mutex_exit(&p->p_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1041
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1042 mutex_exit(&pidlock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1043
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1044 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1045
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1046 default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1047 retval = set_errno(EINVAL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1048 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1049 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1050
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1051 return (retval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1052 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1053
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1054
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1055 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1056 * Return latency between "from" and "to" lgroups
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1057 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1058 * This latency number can only be used for relative comparison
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1059 * between lgroups on the running system, cannot be used across platforms,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1060 * and may not reflect the actual latency. It is platform and implementation
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1061 * specific, so platform gets to decide its value. It would be nice if the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1062 * number was at least proportional to make comparisons more meaningful though.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1063 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1064 int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1065 lgrp_latency(lgrp_id_t from, lgrp_id_t to)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1066 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1067 lgrp_t *from_lgrp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1068 int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1069 int latency;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1070 int latency_max;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1071 lgrp_t *to_lgrp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1072
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1073 ASSERT(MUTEX_HELD(&cpu_lock));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1074
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1075 if (from < 0 || to < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1076 return (set_errno(EINVAL));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1077
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1078 if (from > lgrp_alloc_max || to > lgrp_alloc_max)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1079 return (set_errno(ESRCH));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1080
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1081 from_lgrp = lgrp_table[from];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1082 to_lgrp = lgrp_table[to];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1083
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1084 if (!LGRP_EXISTS(from_lgrp) || !LGRP_EXISTS(to_lgrp)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1085 return (set_errno(ESRCH));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1086 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1087
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1088 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1089 * Get latency for same lgroup
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1090 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1091 if (from == to) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1092 latency = from_lgrp->lgrp_latency;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1093 return (latency);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1094 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1095
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1096 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1097 * Get latency between leaf lgroups
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1098 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1099 if (from_lgrp->lgrp_childcnt == 0 && to_lgrp->lgrp_childcnt == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1100 return (lgrp_plat_latency(from_lgrp->lgrp_plathand,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1101 to_lgrp->lgrp_plathand));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1102
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1103 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1104 * Determine max latency between resources in two lgroups
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1105 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1106 latency_max = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1107 for (i = 0; i <= lgrp_alloc_max; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1108 lgrp_t *from_rsrc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1109 int j;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1110 lgrp_t *to_rsrc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1111
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1112 from_rsrc = lgrp_table[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1113 if (!LGRP_EXISTS(from_rsrc) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1114 !klgrpset_ismember(from_lgrp->lgrp_set[LGRP_RSRC_CPU], i))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1115 continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1116
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1117 for (j = 0; j <= lgrp_alloc_max; j++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1118 to_rsrc = lgrp_table[j];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1119 if (!LGRP_EXISTS(to_rsrc) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1120 klgrpset_ismember(to_lgrp->lgrp_set[LGRP_RSRC_MEM],
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1121 j) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1122 continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1123 latency = lgrp_plat_latency(from_rsrc->lgrp_plathand,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1124 to_rsrc->lgrp_plathand);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1125 if (latency > latency_max)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1126 latency_max = latency;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1127 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1128 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1129 return (latency_max);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1130 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1131
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1132
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1133 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1134 * Return lgroup interface version number
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1135 * 0 - none
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1136 * 1 - original
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1137 * 2 - lgrp_latency_cookie() and lgrp_resources() added
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1138 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1139 int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1140 lgrp_version(int version)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1141 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1142 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1143 * Return LGRP_VER_NONE when requested version isn't supported
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1144 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1145 if (version < LGRP_VER_NONE || version > LGRP_VER_CURRENT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1146 return (LGRP_VER_NONE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1147
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1148 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1149 * Return current version when LGRP_VER_NONE passed in
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1150 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1151 if (version == LGRP_VER_NONE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1152 return (LGRP_VER_CURRENT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1153
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1154 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1155 * Otherwise, return supported version.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1156 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1157 return (version);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1158 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1159
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1160
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1161 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1162 * Snapshot of lgroup hieararchy
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1163 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1164 * One snapshot is kept and is based on the kernel's native data model, so
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1165 * a 32-bit snapshot is kept for the 32-bit kernel and a 64-bit one for the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1166 * 64-bit kernel. If a 32-bit user wants a snapshot from the 64-bit kernel,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1167 * the kernel generates a 32-bit snapshot from the data in its 64-bit snapshot.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1168 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1169 * The format is defined by lgroup snapshot header and the layout of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1170 * the snapshot in memory is as follows:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1171 * 1) lgroup snapshot header
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1172 * - specifies format of snapshot
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1173 * - defined by lgrp_snapshot_header_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1174 * 2) lgroup info array
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1175 * - contains information about each lgroup
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1176 * - one element for each lgroup
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1177 * - each element is defined by lgrp_info_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1178 * 3) lgroup CPU ID array
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1179 * - contains list (array) of CPU IDs for each lgroup
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1180 * - lgrp_info_t points into array and specifies how many CPUs belong to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1181 * given lgroup
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1182 * 4) lgroup parents array
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1183 * - contains lgroup bitmask of parents for each lgroup
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1184 * - bitmask is an array of unsigned longs and its size depends on nlgrpsmax
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1185 * 5) lgroup children array
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1186 * - contains lgroup bitmask of children for each lgroup
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1187 * - bitmask is an array of unsigned longs and its size depends on nlgrpsmax
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1188 * 6) lgroup resources array
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1189 * - contains lgroup bitmask of resources for each lgroup
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1190 * - bitmask is an array of unsigned longs and its size depends on nlgrpsmax
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1191 * 7) lgroup latency table
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1192 * - contains latency from each lgroup to each of other lgroups
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1193 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1194 * NOTE: Must use nlgrpsmax for per lgroup data structures because lgroups
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1195 * may be sparsely allocated.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1196 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1197 lgrp_snapshot_header_t *lgrp_snap = NULL; /* lgroup snapshot */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1198 static kmutex_t lgrp_snap_lock; /* snapshot lock */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1199
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1200
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1201 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1202 * Take a snapshot of lgroup hierarchy and return size of buffer
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1203 * needed to hold snapshot
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1204 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1205 static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1206 lgrp_snapshot(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1207 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1208 size_t bitmask_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1209 size_t bitmasks_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1210 size_t bufsize;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1211 int cpu_index;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1212 size_t cpuids_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1213 int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1214 int j;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1215 size_t info_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1216 size_t lats_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1217 ulong_t *lgrp_children;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1218 processorid_t *lgrp_cpuids;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1219 lgrp_info_t *lgrp_info;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1220 int **lgrp_lats;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1221 ulong_t *lgrp_parents;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1222 ulong_t *lgrp_rsets;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1223 ulong_t *lgrpset;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1224 int snap_ncpus;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1225 int snap_nlgrps;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1226 int snap_nlgrpsmax;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1227 size_t snap_hdr_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1228 #ifdef _SYSCALL32_IMPL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1229 model_t model = DATAMODEL_NATIVE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1230
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1231 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1232 * Have up-to-date snapshot, so check to see whether caller is 32-bit
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1233 * program and need to return size of 32-bit snapshot now.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1234 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1235 model = get_udatamodel();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1236 if (model == DATAMODEL_ILP32 && lgrp_snap &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1237 lgrp_snap->ss_gen == lgrp_gen) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1238
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1239 snap_nlgrpsmax = lgrp_snap->ss_nlgrps_max;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1240
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1241 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1242 * Calculate size of buffer needed for 32-bit snapshot,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1243 * rounding up size of each object to allow for alignment
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1244 * of next object in buffer.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1245 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1246 snap_hdr_size = P2ROUNDUP(sizeof (lgrp_snapshot_header32_t),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1247 sizeof (caddr32_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1248 info_size =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1249 P2ROUNDUP(snap_nlgrpsmax * sizeof (lgrp_info32_t),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1250 sizeof (processorid_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1251 cpuids_size =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1252 P2ROUNDUP(lgrp_snap->ss_ncpus * sizeof (processorid_t),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1253 sizeof (ulong_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1254
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1255 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1256 * lgroup bitmasks needed for parents, children, and resources
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1257 * for each lgroup and pset lgroup set
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1258 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1259 bitmask_size = BT_SIZEOFMAP(snap_nlgrpsmax);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1260 bitmasks_size = (((2 + LGRP_RSRC_COUNT) *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1261 snap_nlgrpsmax) + 1) * bitmask_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1262
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1263 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1264 * Size of latency table and buffer
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1265 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1266 lats_size = snap_nlgrpsmax * sizeof (caddr32_t) +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1267 snap_nlgrpsmax * snap_nlgrpsmax * sizeof (int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1268
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1269 bufsize = snap_hdr_size + info_size + cpuids_size +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1270 bitmasks_size + lats_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1271 return (bufsize);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1272 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1273 #endif /* _SYSCALL32_IMPL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1274
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1275 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1276 * Check whether snapshot is up-to-date
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1277 * Free it and take another one if not
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1278 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1279 if (lgrp_snap) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1280 if (lgrp_snap->ss_gen == lgrp_gen)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1281 return (lgrp_snap->ss_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1282
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1283 kmem_free(lgrp_snap, lgrp_snap->ss_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1284 lgrp_snap = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1285 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1286
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1287 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1288 * Allocate memory for snapshot
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1289 * w/o holding cpu_lock while waiting for memory
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1290 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1291 while (lgrp_snap == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1292 int old_generation;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1293
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1294 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1295 * Take snapshot of lgroup generation number
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1296 * and configuration size dependent information
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1297 * NOTE: Only count number of online CPUs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1298 * since only online CPUs appear in lgroups.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1299 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1300 mutex_enter(&cpu_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1301 old_generation = lgrp_gen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1302 snap_ncpus = ncpus_online;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1303 snap_nlgrps = nlgrps;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1304 snap_nlgrpsmax = nlgrpsmax;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1305 mutex_exit(&cpu_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1306
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1307 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1308 * Calculate size of buffer needed for snapshot,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1309 * rounding up size of each object to allow for alignment
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1310 * of next object in buffer.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1311 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1312 snap_hdr_size = P2ROUNDUP(sizeof (lgrp_snapshot_header_t),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1313 sizeof (void *));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1314 info_size = P2ROUNDUP(snap_nlgrpsmax * sizeof (lgrp_info_t),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1315 sizeof (processorid_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1316 cpuids_size = P2ROUNDUP(snap_ncpus * sizeof (processorid_t),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1317 sizeof (ulong_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1318 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1319 * lgroup bitmasks needed for pset lgroup set and parents,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1320 * children, and resource sets for each lgroup
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1321 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1322 bitmask_size = BT_SIZEOFMAP(snap_nlgrpsmax);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1323 bitmasks_size = (((2 + LGRP_RSRC_COUNT) *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1324 snap_nlgrpsmax) + 1) * bitmask_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1325
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1326 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1327 * Size of latency table and buffer
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1328 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1329 lats_size = snap_nlgrpsmax * sizeof (int *) +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1330 snap_nlgrpsmax * snap_nlgrpsmax * sizeof (int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1331
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1332 bufsize = snap_hdr_size + info_size + cpuids_size +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1333 bitmasks_size + lats_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1334
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1335 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1336 * Allocate memory for buffer
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1337 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1338 lgrp_snap = kmem_zalloc(bufsize, KM_NOSLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1339 if (lgrp_snap == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1340 return (set_errno(ENOMEM));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1341
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1342 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1343 * Check whether generation number has changed
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1344 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1345 mutex_enter(&cpu_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1346 if (lgrp_gen == old_generation)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1347 break; /* hasn't change, so done. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1348
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1349 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1350 * Generation number changed, so free memory and try again.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1351 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1352 mutex_exit(&cpu_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1353 kmem_free(lgrp_snap, bufsize);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1354 lgrp_snap = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1355 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1356
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1357 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1358 * Fill in lgroup snapshot header
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1359 * (including pointers to tables of lgroup info, CPU IDs, and parents
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1360 * and children)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1361 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1362 lgrp_snap->ss_version = LGRP_VER_CURRENT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1363
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1364 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1365 * XXX For now, liblgrp only needs to know whether the hierarchy
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1366 * XXX only has one level or not
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1367 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1368 if (snap_nlgrps == 1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1369 lgrp_snap->ss_levels = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1370 else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1371 lgrp_snap->ss_levels = 2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1372
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1373 lgrp_snap->ss_root = LGRP_ROOTID;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1374
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1375 lgrp_snap->ss_nlgrps = lgrp_snap->ss_nlgrps_os = snap_nlgrps;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1376 lgrp_snap->ss_nlgrps_max = snap_nlgrpsmax;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1377 lgrp_snap->ss_ncpus = snap_ncpus;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1378 lgrp_snap->ss_gen = lgrp_gen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1379 lgrp_snap->ss_view = LGRP_VIEW_OS;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1380 lgrp_snap->ss_pset = 0; /* NOTE: caller should set if needed */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1381 lgrp_snap->ss_size = bufsize;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1382 lgrp_snap->ss_magic = (uintptr_t)lgrp_snap;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1383
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1384 lgrp_snap->ss_info = lgrp_info =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1385 (lgrp_info_t *)((uintptr_t)lgrp_snap + snap_hdr_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1386
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1387 lgrp_snap->ss_cpuids = lgrp_cpuids =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1388 (processorid_t *)((uintptr_t)lgrp_info + info_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1389
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1390 lgrp_snap->ss_lgrpset = lgrpset =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1391 (ulong_t *)((uintptr_t)lgrp_cpuids + cpuids_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1392
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1393 lgrp_snap->ss_parents = lgrp_parents =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1394 (ulong_t *)((uintptr_t)lgrpset + bitmask_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1395
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1396 lgrp_snap->ss_children = lgrp_children =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1397 (ulong_t *)((uintptr_t)lgrp_parents + (snap_nlgrpsmax *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1398 bitmask_size));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1399
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1400 lgrp_snap->ss_rsets = lgrp_rsets =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1401 (ulong_t *)((uintptr_t)lgrp_children + (snap_nlgrpsmax *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1402 bitmask_size));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1403
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1404 lgrp_snap->ss_latencies = lgrp_lats =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1405 (int **)((uintptr_t)lgrp_rsets + (LGRP_RSRC_COUNT *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1406 snap_nlgrpsmax * bitmask_size));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1407
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1408 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1409 * Fill in lgroup information
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1410 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1411 cpu_index = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1412 for (i = 0; i < snap_nlgrpsmax; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1413 struct cpu *cp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1414 int cpu_count;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1415 struct cpu *head;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1416 int k;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1417 lgrp_t *lgrp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1418
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1419 lgrp = lgrp_table[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1420 if (!LGRP_EXISTS(lgrp)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1421 bzero(&lgrp_info[i], sizeof (lgrp_info[i]));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1422 lgrp_info[i].info_lgrpid = LGRP_NONE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1423 continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1424 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1425
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1426 lgrp_info[i].info_lgrpid = i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1427 lgrp_info[i].info_latency = lgrp->lgrp_latency;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1428
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1429 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1430 * Fill in parents, children, and lgroup resources
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1431 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1432 lgrp_info[i].info_parents =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1433 (ulong_t *)((uintptr_t)lgrp_parents + (i * bitmask_size));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1434
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1435 if (lgrp->lgrp_parent)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1436 BT_SET(lgrp_info[i].info_parents,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1437 lgrp->lgrp_parent->lgrp_id);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1438
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1439 lgrp_info[i].info_children =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1440 (ulong_t *)((uintptr_t)lgrp_children + (i * bitmask_size));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1441
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1442 for (j = 0; j < snap_nlgrpsmax; j++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1443 if (klgrpset_ismember(lgrp->lgrp_children, j))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1444 BT_SET(lgrp_info[i].info_children, j);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1445
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1446 lgrp_info[i].info_rset =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1447 (ulong_t *)((uintptr_t)lgrp_rsets +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1448 (i * LGRP_RSRC_COUNT * bitmask_size));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1449
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1450 for (j = 0; j < LGRP_RSRC_COUNT; j++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1451 ulong_t *rset;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1452
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1453 rset = (ulong_t *)((uintptr_t)lgrp_info[i].info_rset +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1454 (j * bitmask_size));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1455 for (k = 0; k < snap_nlgrpsmax; k++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1456 if (klgrpset_ismember(lgrp->lgrp_set[j], k))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1457 BT_SET(rset, k);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1458 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1459
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1460 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1461 * Fill in CPU IDs
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1462 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1463 cpu_count = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1464 lgrp_info[i].info_cpuids = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1465 cp = head = lgrp->lgrp_cpu;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1466 if (head != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1467 lgrp_info[i].info_cpuids = &lgrp_cpuids[cpu_index];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1468 do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1469 lgrp_cpuids[cpu_index] = cp->cpu_id;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1470 cpu_index++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1471 cpu_count++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1472 cp = cp->cpu_next_lgrp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1473 } while (cp != head);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1474 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1475 ASSERT(cpu_count == lgrp->lgrp_cpucnt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1476 lgrp_info[i].info_ncpus = cpu_count;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1477
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1478 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1479 * Fill in memory sizes for lgroups that directly contain
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1480 * memory
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1481 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1482 if (klgrpset_ismember(lgrp->lgrp_set[LGRP_RSRC_MEM], i)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1483 lgrp_info[i].info_mem_free =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1484 lgrp_mem_size(i, LGRP_MEM_SIZE_FREE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1485 lgrp_info[i].info_mem_install =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1486 lgrp_mem_size(i, LGRP_MEM_SIZE_INSTALL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1487 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1488
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1489 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1490 * Fill in latency table and buffer
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1491 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1492 lgrp_lats[i] = (int *)((uintptr_t)lgrp_lats + snap_nlgrpsmax *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1493 sizeof (int *) + i * snap_nlgrpsmax * sizeof (int));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1494 for (j = 0; j < snap_nlgrpsmax; j++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1495 lgrp_t *to;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1496
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1497 to = lgrp_table[j];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1498 if (!LGRP_EXISTS(to))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1499 continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1500 lgrp_lats[i][j] = lgrp_latency(lgrp->lgrp_id,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1501 to->lgrp_id);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1502 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1503 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1504 ASSERT(cpu_index == snap_ncpus);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1505
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1506
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1507 mutex_exit(&cpu_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1508
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1509 #ifdef _SYSCALL32_IMPL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1510 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1511 * Check to see whether caller is 32-bit program and need to return
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1512 * size of 32-bit snapshot now that snapshot has been taken/updated.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1513 * May not have been able to do this earlier if snapshot was out of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1514 * date or didn't exist yet.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1515 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1516 if (model == DATAMODEL_ILP32) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1517
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1518 snap_nlgrpsmax = lgrp_snap->ss_nlgrps_max;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1519
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1520 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1521 * Calculate size of buffer needed for 32-bit snapshot,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1522 * rounding up size of each object to allow for alignment
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1523 * of next object in buffer.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1524 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1525 snap_hdr_size = P2ROUNDUP(sizeof (lgrp_snapshot_header32_t),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1526 sizeof (caddr32_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1527 info_size =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1528 P2ROUNDUP(snap_nlgrpsmax * sizeof (lgrp_info32_t),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1529 sizeof (processorid_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1530 cpuids_size =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1531 P2ROUNDUP(lgrp_snap->ss_ncpus * sizeof (processorid_t),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1532 sizeof (ulong_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1533
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1534 bitmask_size = BT_SIZEOFMAP(snap_nlgrpsmax);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1535 bitmasks_size = (((2 + LGRP_RSRC_COUNT) * snap_nlgrpsmax) +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1536 1) * bitmask_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1537
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1538
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1539 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1540 * Size of latency table and buffer
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1541 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1542 lats_size = (snap_nlgrpsmax * sizeof (caddr32_t)) +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1543 (snap_nlgrpsmax * snap_nlgrpsmax * sizeof (int));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1544
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1545 bufsize = snap_hdr_size + info_size + cpuids_size +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1546 bitmasks_size + lats_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1547 return (bufsize);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1548 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1549 #endif /* _SYSCALL32_IMPL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1550
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1551 return (lgrp_snap->ss_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1552 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1553
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1554
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1555 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1556 * Copy snapshot into given user buffer, fix up any pointers in buffer to point
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1557 * into user instead of kernel address space, and return size of buffer
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1558 * needed to hold snapshot
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1559 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1560 static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1561 lgrp_snapshot_copy(char *buf, size_t bufsize)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1562 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1563 size_t bitmask_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1564 int cpu_index;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1565 size_t cpuids_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1566 int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1567 size_t info_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1568 lgrp_info_t *lgrp_info;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1569 int retval;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1570 size_t snap_hdr_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1571 int snap_ncpus;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1572 int snap_nlgrpsmax;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1573 lgrp_snapshot_header_t *user_snap;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1574 lgrp_info_t *user_info;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1575 lgrp_info_t *user_info_buffer;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1576 processorid_t *user_cpuids;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1577 ulong_t *user_lgrpset;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1578 ulong_t *user_parents;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1579 ulong_t *user_children;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1580 int **user_lats;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1581 int **user_lats_buffer;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1582 ulong_t *user_rsets;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1583
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1584 if (lgrp_snap == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1585 return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1586
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1587 if (buf == NULL || bufsize <= 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1588 return (lgrp_snap->ss_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1589
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1590 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1591 * User needs to try getting size of buffer again
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1592 * because given buffer size is too small.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1593 * The lgroup hierarchy may have changed after they asked for the size
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1594 * but before the snapshot was taken.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1595 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1596 if (bufsize < lgrp_snap->ss_size)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1597 return (set_errno(EAGAIN));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1598
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1599 snap_ncpus = lgrp_snap->ss_ncpus;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1600 snap_nlgrpsmax = lgrp_snap->ss_nlgrps_max;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1601
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1602 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1603 * Fill in lgrpset now because caller may have change psets
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1604 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1605 kpreempt_disable();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1606 for (i = 0; i < snap_nlgrpsmax; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1607 if (klgrpset_ismember(curthread->t_cpupart->cp_lgrpset,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1608 i)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1609 BT_SET(lgrp_snap->ss_lgrpset, i);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1610 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1611 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1612 kpreempt_enable();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1613
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1614 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1615 * Copy lgroup snapshot (snapshot header, lgroup info, and CPU IDs)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1616 * into user buffer all at once
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1617 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1618 if (copyout(lgrp_snap, buf, lgrp_snap->ss_size) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1619 return (set_errno(EFAULT));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1620
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1621 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1622 * Round up sizes of lgroup snapshot header and info for alignment
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1623 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1624 snap_hdr_size = P2ROUNDUP(sizeof (lgrp_snapshot_header_t),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1625 sizeof (void *));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1626 info_size = P2ROUNDUP(snap_nlgrpsmax * sizeof (lgrp_info_t),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1627 sizeof (processorid_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1628 cpuids_size = P2ROUNDUP(snap_ncpus * sizeof (processorid_t),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1629 sizeof (ulong_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1630
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1631 bitmask_size = BT_SIZEOFMAP(snap_nlgrpsmax);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1632
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1633 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1634 * Calculate pointers into user buffer for lgroup snapshot header,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1635 * info, and CPU IDs
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1636 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1637 user_snap = (lgrp_snapshot_header_t *)buf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1638 user_info = (lgrp_info_t *)((uintptr_t)user_snap + snap_hdr_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1639 user_cpuids = (processorid_t *)((uintptr_t)user_info + info_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1640 user_lgrpset = (ulong_t *)((uintptr_t)user_cpuids + cpuids_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1641 user_parents = (ulong_t *)((uintptr_t)user_lgrpset + bitmask_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1642 user_children = (ulong_t *)((uintptr_t)user_parents +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1643 (snap_nlgrpsmax * bitmask_size));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1644 user_rsets = (ulong_t *)((uintptr_t)user_children +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1645 (snap_nlgrpsmax * bitmask_size));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1646 user_lats = (int **)((uintptr_t)user_rsets +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1647 (LGRP_RSRC_COUNT * snap_nlgrpsmax * bitmask_size));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1648
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1649 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1650 * Copyout magic number (ie. pointer to beginning of buffer)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1651 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1652 if (copyout(&buf, &user_snap->ss_magic, sizeof (buf)) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1653 return (set_errno(EFAULT));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1654
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1655 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1656 * Fix up pointers in user buffer to point into user buffer
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1657 * not kernel snapshot
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1658 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1659 if (copyout(&user_info, &user_snap->ss_info, sizeof (user_info)) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1660 return (set_errno(EFAULT));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1661
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1662 if (copyout(&user_cpuids, &user_snap->ss_cpuids,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1663 sizeof (user_cpuids)) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1664 return (set_errno(EFAULT));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1665
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1666 if (copyout(&user_lgrpset, &user_snap->ss_lgrpset,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1667 sizeof (user_lgrpset)) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1668 return (set_errno(EFAULT));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1669
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1670 if (copyout(&user_parents, &user_snap->ss_parents,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1671 sizeof (user_parents)) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1672 return (set_errno(EFAULT));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1673
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1674 if (copyout(&user_children, &user_snap->ss_children,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1675 sizeof (user_children)) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1676 return (set_errno(EFAULT));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1677
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1678 if (copyout(&user_rsets, &user_snap->ss_rsets,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1679 sizeof (user_rsets)) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1680 return (set_errno(EFAULT));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1681
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1682 if (copyout(&user_lats, &user_snap->ss_latencies,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1683 sizeof (user_lats)) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1684 return (set_errno(EFAULT));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1685
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1686 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1687 * Make copies of lgroup info and latency table, fix up pointers,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1688 * and then copy them into user buffer
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1689 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1690 user_info_buffer = kmem_zalloc(info_size, KM_NOSLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1691 if (user_info_buffer == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1692 return (set_errno(ENOMEM));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1693
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1694 user_lats_buffer = kmem_zalloc(snap_nlgrpsmax * sizeof (int *),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1695 KM_NOSLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1696 if (user_lats_buffer == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1697 kmem_free(user_info_buffer, info_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1698 return (set_errno(ENOMEM));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1699 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1700
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1701 lgrp_info = (lgrp_info_t *)((uintptr_t)lgrp_snap + snap_hdr_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1702 bcopy(lgrp_info, user_info_buffer, info_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1703
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1704 cpu_index = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1705 for (i = 0; i < snap_nlgrpsmax; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1706 ulong_t *snap_rset;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1707
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1708 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1709 * Skip non-existent lgroups
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1710 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1711 if (user_info_buffer[i].info_lgrpid == LGRP_NONE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1712 continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1713
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1714 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1715 * Update free memory size since it changes frequently
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1716 * Only do so for lgroups directly containing memory
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1717 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1718 * NOTE: This must be done before changing the pointers to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1719 * point into user space since we need to dereference
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1720 * lgroup resource set
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1721 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1722 snap_rset = &lgrp_info[i].info_rset[LGRP_RSRC_MEM *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1723 BT_BITOUL(snap_nlgrpsmax)];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1724 if (BT_TEST(snap_rset, i))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1725 user_info_buffer[i].info_mem_free =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1726 lgrp_mem_size(i, LGRP_MEM_SIZE_FREE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1727
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1728 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1729 * Fix up pointers to parents, children, resources, and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1730 * latencies
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1731 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1732 user_info_buffer[i].info_parents =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1733 (ulong_t *)((uintptr_t)user_parents + (i * bitmask_size));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1734 user_info_buffer[i].info_children =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1735 (ulong_t *)((uintptr_t)user_children + (i * bitmask_size));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1736 user_info_buffer[i].info_rset =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1737 (ulong_t *)((uintptr_t)user_rsets +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1738 (i * LGRP_RSRC_COUNT * bitmask_size));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1739 user_lats_buffer[i] = (int *)((uintptr_t)user_lats +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1740 (snap_nlgrpsmax * sizeof (int *)) + (i * snap_nlgrpsmax *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1741 sizeof (int)));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1742
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1743 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1744 * Fix up pointer to CPU IDs
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1745 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1746 if (user_info_buffer[i].info_ncpus == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1747 user_info_buffer[i].info_cpuids = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1748 continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1749 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1750 user_info_buffer[i].info_cpuids = &user_cpuids[cpu_index];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1751 cpu_index += user_info_buffer[i].info_ncpus;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1752 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1753 ASSERT(cpu_index == snap_ncpus);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1754
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1755 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1756 * Copy lgroup info and latency table with pointers fixed up to point
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1757 * into user buffer out to user buffer now
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1758 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1759 retval = lgrp_snap->ss_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1760 if (copyout(user_info_buffer, user_info, info_size) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1761 retval = set_errno(EFAULT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1762 kmem_free(user_info_buffer, info_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1763
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1764 if (copyout(user_lats_buffer, user_lats, snap_nlgrpsmax *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1765 sizeof (int *)) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1766 retval = set_errno(EFAULT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1767 kmem_free(user_lats_buffer, snap_nlgrpsmax * sizeof (int *));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1768
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1769 return (retval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1770 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1771
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1772
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1773 #ifdef _SYSCALL32_IMPL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1774 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1775 * Make 32-bit copy of snapshot, fix up any pointers in buffer to point
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1776 * into user instead of kernel address space, copy 32-bit snapshot into
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1777 * given user buffer, and return size of buffer needed to hold snapshot
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1778 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1779 static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1780 lgrp_snapshot_copy32(caddr32_t buf, size32_t bufsize)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1781 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1782 size32_t bitmask_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1783 size32_t bitmasks_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1784 size32_t children_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1785 int cpu_index;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1786 size32_t cpuids_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1787 int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1788 int j;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1789 size32_t info_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1790 size32_t lats_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1791 lgrp_info_t *lgrp_info;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1792 lgrp_snapshot_header32_t *lgrp_snap32;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1793 lgrp_info32_t *lgrp_info32;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1794 processorid_t *lgrp_cpuids32;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1795 caddr32_t *lgrp_lats32;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1796 int **lgrp_lats32_kernel;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1797 uint_t *lgrp_set32;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1798 uint_t *lgrp_parents32;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1799 uint_t *lgrp_children32;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1800 uint_t *lgrp_rsets32;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1801 size32_t parents_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1802 size32_t rsets_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1803 size32_t set_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1804 size32_t snap_hdr_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1805 int snap_ncpus;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1806 int snap_nlgrpsmax;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1807 size32_t snap_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1808
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1809 if (lgrp_snap == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1810 return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1811
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1812 snap_ncpus = lgrp_snap->ss_ncpus;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1813 snap_nlgrpsmax = lgrp_snap->ss_nlgrps_max;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1814
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1815 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1816 * Calculate size of buffer needed for 32-bit snapshot,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1817 * rounding up size of each object to allow for alignment
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1818 * of next object in buffer.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1819 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1820 snap_hdr_size = P2ROUNDUP(sizeof (lgrp_snapshot_header32_t),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1821 sizeof (caddr32_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1822 info_size = P2ROUNDUP(snap_nlgrpsmax * sizeof (lgrp_info32_t),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1823 sizeof (processorid_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1824 cpuids_size = P2ROUNDUP(snap_ncpus * sizeof (processorid_t),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1825 sizeof (ulong_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1826
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1827 bitmask_size = BT_SIZEOFMAP32(snap_nlgrpsmax);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1828
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1829 set_size = bitmask_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1830 parents_size = snap_nlgrpsmax * bitmask_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1831 children_size = snap_nlgrpsmax * bitmask_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1832 rsets_size = P2ROUNDUP(LGRP_RSRC_COUNT * snap_nlgrpsmax *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1833 (int)bitmask_size, sizeof (caddr32_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1834
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1835 bitmasks_size = set_size + parents_size + children_size + rsets_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1836
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1837 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1838 * Size of latency table and buffer
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1839 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1840 lats_size = (snap_nlgrpsmax * sizeof (caddr32_t)) +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1841 (snap_nlgrpsmax * snap_nlgrpsmax * sizeof (int));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1842
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1843 snap_size = snap_hdr_size + info_size + cpuids_size + bitmasks_size +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1844 lats_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1845
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1846 if (buf == NULL || bufsize <= 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1847 return (snap_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1848 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1849
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1850 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1851 * User needs to try getting size of buffer again
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1852 * because given buffer size is too small.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1853 * The lgroup hierarchy may have changed after they asked for the size
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1854 * but before the snapshot was taken.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1855 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1856 if (bufsize < snap_size)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1857 return (set_errno(EAGAIN));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1858
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1859 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1860 * Make 32-bit copy of snapshot, fix up pointers to point into user
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1861 * buffer not kernel, and then copy whole thing into user buffer
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1862 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1863 lgrp_snap32 = kmem_zalloc(snap_size, KM_NOSLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1864 if (lgrp_snap32 == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1865 return (set_errno(ENOMEM));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1866
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1867 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1868 * Calculate pointers into 32-bit copy of snapshot
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1869 * for lgroup info, CPU IDs, pset lgroup bitmask, parents, children,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1870 * resources, and latency table and buffer
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1871 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1872 lgrp_info32 = (lgrp_info32_t *)((uintptr_t)lgrp_snap32 +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1873 snap_hdr_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1874 lgrp_cpuids32 = (processorid_t *)((uintptr_t)lgrp_info32 + info_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1875 lgrp_set32 = (uint_t *)((uintptr_t)lgrp_cpuids32 + cpuids_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1876 lgrp_parents32 = (uint_t *)((uintptr_t)lgrp_set32 + set_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1877 lgrp_children32 = (uint_t *)((uintptr_t)lgrp_parents32 + parents_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1878 lgrp_rsets32 = (uint_t *)((uintptr_t)lgrp_children32 + children_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1879 lgrp_lats32 = (caddr32_t *)((uintptr_t)lgrp_rsets32 + rsets_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1880
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1881 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1882 * Make temporary lgroup latency table of pointers for kernel to use
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1883 * to fill in rows of table with latencies from each lgroup
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1884 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1885 lgrp_lats32_kernel = kmem_zalloc(snap_nlgrpsmax * sizeof (int *),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1886 KM_NOSLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1887 if (lgrp_lats32_kernel == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1888 kmem_free(lgrp_snap32, snap_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1889 return (set_errno(ENOMEM));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1890 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1891
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1892 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1893 * Fill in 32-bit lgroup snapshot header
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1894 * (with pointers into user's buffer for lgroup info, CPU IDs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1895 * bit masks, and latencies)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1896 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1897 lgrp_snap32->ss_version = lgrp_snap->ss_version;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1898 lgrp_snap32->ss_levels = lgrp_snap->ss_levels;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1899 lgrp_snap32->ss_nlgrps = lgrp_snap32->ss_nlgrps_os =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1900 lgrp_snap->ss_nlgrps;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1901 lgrp_snap32->ss_nlgrps_max = snap_nlgrpsmax;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1902 lgrp_snap32->ss_root = lgrp_snap->ss_root;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1903 lgrp_snap32->ss_ncpus = lgrp_snap->ss_ncpus;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1904 lgrp_snap32->ss_gen = lgrp_snap->ss_gen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1905 lgrp_snap32->ss_view = LGRP_VIEW_OS;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1906 lgrp_snap32->ss_size = snap_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1907 lgrp_snap32->ss_magic = buf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1908 lgrp_snap32->ss_info = buf + snap_hdr_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1909 lgrp_snap32->ss_cpuids = lgrp_snap32->ss_info + info_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1910 lgrp_snap32->ss_lgrpset = lgrp_snap32->ss_cpuids + cpuids_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1911 lgrp_snap32->ss_parents = lgrp_snap32->ss_lgrpset + bitmask_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1912 lgrp_snap32->ss_children = lgrp_snap32->ss_parents +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1913 (snap_nlgrpsmax * bitmask_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1914 lgrp_snap32->ss_rsets = lgrp_snap32->ss_children +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1915 (snap_nlgrpsmax * bitmask_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1916 lgrp_snap32->ss_latencies = lgrp_snap32->ss_rsets +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1917 (LGRP_RSRC_COUNT * snap_nlgrpsmax * bitmask_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1918
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1919 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1920 * Fill in lgrpset now because caller may have change psets
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1921 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1922 kpreempt_disable();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1923 for (i = 0; i < snap_nlgrpsmax; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1924 if (klgrpset_ismember(curthread->t_cpupart->cp_lgrpset,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1925 i)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1926 BT_SET32(lgrp_set32, i);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1927 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1928 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1929 kpreempt_enable();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1930
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1931 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1932 * Fill in 32-bit copy of lgroup info and fix up pointers
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1933 * to point into user's buffer instead of kernel's
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1934 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1935 cpu_index = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1936 lgrp_info = lgrp_snap->ss_info;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1937 for (i = 0; i < snap_nlgrpsmax; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1938 uint_t *children;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1939 uint_t *lgrp_rset;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1940 uint_t *parents;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1941 ulong_t *snap_rset;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1942
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1943 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1944 * Skip non-existent lgroups
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1945 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1946 if (lgrp_info[i].info_lgrpid == LGRP_NONE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1947 bzero(&lgrp_info32[i], sizeof (lgrp_info32[i]));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1948 lgrp_info32[i].info_lgrpid = LGRP_NONE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1949 continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1950 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1951
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1952 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1953 * Fill in parents, children, lgroup resource set, and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1954 * latencies from snapshot
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1955 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1956 parents = (uint_t *)((uintptr_t)lgrp_parents32 +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1957 i * bitmask_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1958 children = (uint_t *)((uintptr_t)lgrp_children32 +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1959 i * bitmask_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1960 snap_rset = (ulong_t *)((uintptr_t)lgrp_snap->ss_rsets +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1961 (i * LGRP_RSRC_COUNT * BT_SIZEOFMAP(snap_nlgrpsmax)));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1962 lgrp_rset = (uint_t *)((uintptr_t)lgrp_rsets32 +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1963 (i * LGRP_RSRC_COUNT * bitmask_size));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1964 lgrp_lats32_kernel[i] = (int *)((uintptr_t)lgrp_lats32 +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1965 snap_nlgrpsmax * sizeof (caddr32_t) + i * snap_nlgrpsmax *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1966 sizeof (int));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1967 for (j = 0; j < snap_nlgrpsmax; j++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1968 int k;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1969 uint_t *rset;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1970
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1971 if (BT_TEST(&lgrp_snap->ss_parents[i], j))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1972 BT_SET32(parents, j);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1973
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1974 if (BT_TEST(&lgrp_snap->ss_children[i], j))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1975 BT_SET32(children, j);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1976
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1977 for (k = 0; k < LGRP_RSRC_COUNT; k++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1978 rset = (uint_t *)((uintptr_t)lgrp_rset +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1979 k * bitmask_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1980 if (BT_TEST(&snap_rset[k], j))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1981 BT_SET32(rset, j);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1982 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1983
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1984 lgrp_lats32_kernel[i][j] =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1985 lgrp_snap->ss_latencies[i][j];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1986 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1987
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1988 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1989 * Fix up pointer to latency buffer
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1990 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1991 lgrp_lats32[i] = lgrp_snap32->ss_latencies +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1992 snap_nlgrpsmax * sizeof (caddr32_t) + i * snap_nlgrpsmax *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1993 sizeof (int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1994
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1995 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1996 * Fix up pointers for parents, children, and resources
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1997 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1998 lgrp_info32[i].info_parents = lgrp_snap32->ss_parents +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1999 (i * bitmask_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2000 lgrp_info32[i].info_children = lgrp_snap32->ss_children +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2001 (i * bitmask_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2002 lgrp_info32[i].info_rset = lgrp_snap32->ss_rsets +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2003 (i * LGRP_RSRC_COUNT * bitmask_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2004
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2005 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2006 * Fill in memory and CPU info
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2007 * Only fill in memory for lgroups directly containing memory
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2008 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2009 snap_rset = &lgrp_info[i].info_rset[LGRP_RSRC_MEM *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2010 BT_BITOUL(snap_nlgrpsmax)];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2011 if (BT_TEST(snap_rset, i)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2012 lgrp_info32[i].info_mem_free = lgrp_mem_size(i,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2013 LGRP_MEM_SIZE_FREE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2014 lgrp_info32[i].info_mem_install =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2015 lgrp_info[i].info_mem_install;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2016 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2017
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2018 lgrp_info32[i].info_ncpus = lgrp_info[i].info_ncpus;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2019
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2020 lgrp_info32[i].info_lgrpid = lgrp_info[i].info_lgrpid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2021 lgrp_info32[i].info_latency = lgrp_info[i].info_latency;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2022
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2023 if (lgrp_info32[i].info_ncpus == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2024 lgrp_info32[i].info_cpuids = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2025 continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2026 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2027
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2028 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2029 * Fix up pointer for CPU IDs
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2030 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2031 lgrp_info32[i].info_cpuids = lgrp_snap32->ss_cpuids +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2032 (cpu_index * sizeof (processorid_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2033 cpu_index += lgrp_info32[i].info_ncpus;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2034 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2035 ASSERT(cpu_index == snap_ncpus);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2036
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2037 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2038 * Copy lgroup CPU IDs into 32-bit snapshot
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2039 * before copying it out into user's buffer
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2040 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2041 bcopy(lgrp_snap->ss_cpuids, lgrp_cpuids32, cpuids_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2042
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2043 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2044 * Copy 32-bit lgroup snapshot into user's buffer all at once
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2045 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2046 if (copyout(lgrp_snap32, (void *)(uintptr_t)buf, snap_size) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2047 kmem_free(lgrp_snap32, snap_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2048 kmem_free(lgrp_lats32_kernel, snap_nlgrpsmax * sizeof (int *));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2049 return (set_errno(EFAULT));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2050 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2051
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2052 kmem_free(lgrp_snap32, snap_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2053 kmem_free(lgrp_lats32_kernel, snap_nlgrpsmax * sizeof (int *));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2054
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2055 return (snap_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2056 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2057 #endif /* _SYSCALL32_IMPL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2058
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2059
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2060 int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2061 lgrpsys(int subcode, long ia, void *ap)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2062 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2063 size_t bufsize;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2064 int latency;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2065
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2066 switch (subcode) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2067
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2068 case LGRP_SYS_AFFINITY_GET:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2069 return (lgrp_affinity_get((lgrp_affinity_args_t *)ap));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2070
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2071 case LGRP_SYS_AFFINITY_SET:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2072 return (lgrp_affinity_set((lgrp_affinity_args_t *)ap));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2073
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2074 case LGRP_SYS_GENERATION:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2075 return (lgrp_generation(ia));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2076
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2077 case LGRP_SYS_HOME:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2078 return (lgrp_home_get((idtype_t)ia, (id_t)(uintptr_t)ap));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2079
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2080 case LGRP_SYS_LATENCY:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2081 mutex_enter(&cpu_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2082 latency = lgrp_latency(ia, (lgrp_id_t)(uintptr_t)ap);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2083 mutex_exit(&cpu_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2084 return (latency);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2085
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2086 case LGRP_SYS_MEMINFO:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2087 return (meminfo(ia, (struct meminfo *)ap));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2088
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2089 case LGRP_SYS_VERSION:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2090 return (lgrp_version(ia));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2091
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2092 case LGRP_SYS_SNAPSHOT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2093 mutex_enter(&lgrp_snap_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2094 bufsize = lgrp_snapshot();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2095 if (ap && ia > 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2096 if (get_udatamodel() == DATAMODEL_NATIVE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2097 bufsize = lgrp_snapshot_copy(ap, ia);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2098 #ifdef _SYSCALL32_IMPL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2099 else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2100 bufsize = lgrp_snapshot_copy32(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2101 (caddr32_t)(uintptr_t)ap, ia);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2102 #endif /* _SYSCALL32_IMPL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2103 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2104 mutex_exit(&lgrp_snap_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2105 return (bufsize);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2106
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2107 default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2108 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2109
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2110 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2111
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2112 return (set_errno(EINVAL));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2113 }