|
|
1.1 root 1: /*
2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
7: * Reserved. This file contains Original Code and/or Modifications of
8: * Original Code as defined in and that are subject to the Apple Public
9: * Source License Version 1.1 (the "License"). You may not use this file
10: * except in compliance with the License. Please obtain a copy of the
11: * License at http://www.apple.com/publicsource and read it before using
12: * this file.
13: *
14: * The Original Code and all software distributed under the License are
15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
19: * License for the specific language governing rights and limitations
20: * under the License.
21: *
22: * @APPLE_LICENSE_HEADER_END@
23: */
24:
25: /* Copyright (c) 1995, 1997 Apple Computer, Inc. All Rights Reserved */
26: /*
27: * Copyright (c) 1987, 1991, 1993
28: * The Regents of the University of California. All rights reserved.
29: *
30: * Redistribution and use in source and binary forms, with or without
31: * modification, are permitted provided that the following conditions
32: * are met:
33: * 1. Redistributions of source code must retain the above copyright
34: * notice, this list of conditions and the following disclaimer.
35: * 2. Redistributions in binary form must reproduce the above copyright
36: * notice, this list of conditions and the following disclaimer in the
37: * documentation and/or other materials provided with the distribution.
38: * 3. All advertising materials mentioning features or use of this software
39: * must display the following acknowledgement:
40: * This product includes software developed by the University of
41: * California, Berkeley and its contributors.
42: * 4. Neither the name of the University nor the names of its contributors
43: * may be used to endorse or promote products derived from this software
44: * without specific prior written permission.
45: *
46: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
47: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
48: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
49: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
50: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
51: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
52: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
53: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
54: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
55: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
56: * SUCH DAMAGE.
57: *
58: * @(#)kern_malloc.c 8.4 (Berkeley) 5/20/95
59: */
60:
61: #include <sys/param.h>
62: #include <sys/malloc.h>
63:
64: #include <sys/socket.h>
65: #include <sys/socketvar.h>
66:
67: #include <net/route.h>
68:
69: #include <netinet/in.h>
70: #include <netinet/in_systm.h>
71: #include <netinet/ip.h>
72: #include <netinet/in_pcb.h>
73:
74: #include <sys/proc.h>
75: #include <sys/mount.h>
76: #include <sys/vnode.h>
77: #include <sys/namei.h>
78: #include <sys/file.h>
79: #include <sys/filedesc.h>
80: #include <sys/tty.h>
81:
82: #include <ufs/ufs/quota.h>
83: #include <ufs/ufs/inode.h>
84:
85: #include <nfs/rpcv2.h>
86: #include <nfs/nfsproto.h>
87: #include <nfs/nfsnode.h>
88: #include <nfs/nfsmount.h>
89: #include <nfs/nqnfs.h>
90:
91: #include <mach/mach_types.h>
92:
93: #include <kern/zalloc.h>
94: #include <kern/kalloc.h>
95:
96: struct kmemstats kmemstats[M_LAST];
97: char *memname[] = INITKMEMNAMES;
98:
99: struct kmzones {
100: size_t kz_elemsize;
101: void *kz_zalloczone;
102: #define KMZ_CREATEZONE ((void *)-2)
103: #define KMZ_LOOKUPZONE ((void *)-1)
104: #define KMZ_MALLOC ((void *)0)
105: #define KMZ_SHAREZONE ((void *)1)
106: } kmzones[] = {
107: #define SOS(sname) sizeof (struct sname)
108: #define SOX(sname) -1
109: -1, 0, /* 0 M_FREE */
110: MSIZE, KMZ_CREATEZONE, /* 1 M_MBUF */
111: 0, KMZ_MALLOC, /* 2 M_DEVBUF */
112: SOS(socket), KMZ_CREATEZONE, /* 3 M_SOCKET */
113: SOS(inpcb), KMZ_LOOKUPZONE, /* 4 M_PCB */
114: M_MBUF, KMZ_SHAREZONE, /* 5 M_RTABLE */
115: M_MBUF, KMZ_SHAREZONE, /* 6 M_HTABLE */
116: M_MBUF, KMZ_SHAREZONE, /* 7 M_FTABLE */
117: SOS(rusage), KMZ_CREATEZONE, /* 8 M_ZOMBIE */
118: 0, KMZ_MALLOC, /* 9 M_IFADDR */
119: M_MBUF, KMZ_SHAREZONE, /* 10 M_SOOPTS */
120: 0, KMZ_MALLOC, /* 11 M_SONAME */
121: MAXPATHLEN, KMZ_CREATEZONE, /* 12 M_NAMEI */
122: 0, KMZ_MALLOC, /* 13 M_GPROF */
123: 0, KMZ_MALLOC, /* 14 M_IOCTLOPS */
124: 0, KMZ_MALLOC, /* 15 M_MAPMEM */
125: SOS(ucred), KMZ_CREATEZONE, /* 16 M_CRED */
126: SOS(pgrp), KMZ_CREATEZONE, /* 17 M_PGRP */
127: SOS(session), KMZ_CREATEZONE, /* 18 M_SESSION */
128: SOS(iovec), KMZ_LOOKUPZONE, /* 19 M_IOV */
129: SOS(mount), KMZ_CREATEZONE, /* 20 M_MOUNT */
130: 0, KMZ_MALLOC, /* 21 M_FHANDLE */
131: SOS(nfsreq), KMZ_CREATEZONE, /* 22 M_NFSREQ */
132: SOS(nfsmount), KMZ_CREATEZONE, /* 23 M_NFSMNT */
133: SOS(nfsnode), KMZ_CREATEZONE, /* 24 M_NFSNODE */
134: SOS(vnode), KMZ_CREATEZONE, /* 25 M_VNODE */
135: SOS(namecache), KMZ_CREATEZONE, /* 26 M_CACHE */
136: SOX(dquot), KMZ_LOOKUPZONE, /* 27 M_DQUOT */
137: SOX(ufsmount), KMZ_LOOKUPZONE, /* 28 M_UFSMNT */
138: 0, KMZ_MALLOC, /* 29 M_CGSUM */
139: 0, KMZ_MALLOC, /* 30 M_VMMAP */
140: 0, KMZ_MALLOC, /* 31 M_VMMAPENT */
141: 0, KMZ_MALLOC, /* 32 M_VMOBJ */
142: 0, KMZ_MALLOC, /* 33 M_VMOBJHASH */
143: 0, KMZ_MALLOC, /* 34 M_VMPMAP */
144: 0, KMZ_MALLOC, /* 35 M_VMPVENT */
145: 0, KMZ_MALLOC, /* 36 M_VMPAGER */
146: 0, KMZ_MALLOC, /* 37 M_VMPGDATA */
147: SOS(file), KMZ_CREATEZONE, /* 38 M_FILE */
148: SOS(filedesc), KMZ_CREATEZONE, /* 39 M_FILEDESC */
149: SOX(lockf), KMZ_CREATEZONE, /* 40 M_LOCKF */
150: SOS(proc), KMZ_CREATEZONE, /* 41 M_PROC */
151: SOS(pcred), KMZ_CREATEZONE, /* 42 M_SUBPROC */
152: 0, KMZ_MALLOC, /* 43 M_SEGMENT */
153: M_FFSNODE, KMZ_SHAREZONE, /* 44 M_LFSNODE */
154: SOS(inode), KMZ_CREATEZONE, /* 45 M_FFSNODE */
155: M_FFSNODE, KMZ_SHAREZONE, /* 46 M_MFSNODE */
156: SOS(nqlease), KMZ_CREATEZONE, /* 47 M_NQLEASE */
157: SOS(nqm), KMZ_CREATEZONE, /* 48 M_NQMHOST */
158: 0, KMZ_MALLOC, /* 49 M_NETADDR */
159: SOX(nfssvc_sock),
160: KMZ_CREATEZONE, /* 50 M_NFSSVC */
161: SOS(nfsuid), KMZ_CREATEZONE, /* 51 M_NFSUID */
162: SOX(nfsrvcache),
163: KMZ_CREATEZONE, /* 52 M_NFSD */
164: SOX(ip_moptions),
165: KMZ_LOOKUPZONE, /* 53 M_IPMOPTS */
166: SOX(in_multi), KMZ_LOOKUPZONE, /* 54 M_IPMADDR */
167: SOX(ether_multi),
168: KMZ_LOOKUPZONE, /* 55 M_IFMADDR */
169: SOX(mrt), KMZ_CREATEZONE, /* 56 M_MRTABLE */
170: 0, 0, /* 57 M_ISOFSMNT */
171: 0, 0, /* 58 M_ISOFSNODE */
172: SOS(nfsrv_descript),
173: KMZ_CREATEZONE, /* 59 M_NFSRVDESC */
174: SOS(nfsdmap), KMZ_CREATEZONE, /* 60 M_NFSDIROFF */
175: SOS(fhandle), KMZ_LOOKUPZONE, /* 61 M_NFSBIGFH */
176: 0, KMZ_MALLOC, /* 62 M_MSDOSFSMNT */
177: 0, KMZ_MALLOC, /* 63 M_MSDOSFSFAT */
178: 0, KMZ_MALLOC, /* 64 M_MSDOSFSNODE */
179: SOS(tty), KMZ_CREATEZONE, /* 65 M_TTYS */
180: 0, KMZ_MALLOC, /* 66 M_EXEC */
181: 0, KMZ_MALLOC, /* 67 M_MISCFSMNT */
182: 0, KMZ_MALLOC, /* 68 M_MISCFSNODE */
183: 0, KMZ_MALLOC, /* 69 M_ADOSFSMNT */
184: 0, KMZ_MALLOC, /* 70 M_ADOSFSNODE */
185: 0, KMZ_MALLOC, /* 71 M_ANODE */
186: SOX(buf), KMZ_CREATEZONE, /* 72 M_BUFHDR */
187: (NDFILE * OFILESIZE),
188: KMZ_CREATEZONE, /* 73 M_OFILETABL */
189: MCLBYTES, KMZ_CREATEZONE, /* 74 M_MCLUST */
190: 0, KMZ_MALLOC, /* 75 M_TEMP */
191: #undef SOS
192: #undef SOX
193: };
194:
195:
196: /*
197: * Initialize the kernel memory allocator
198: */
199: void
200: kmeminit(void)
201: {
202: struct kmzones *kmz;
203:
204: kmz = kmzones;
205: while (kmz < &kmzones[M_LAST]) {
206: /* XXX */
207: if (kmz->kz_elemsize == -1)
208: ;
209: else
210: /* XXX */
211: if (kmz->kz_zalloczone == KMZ_CREATEZONE) {
212: kmz->kz_zalloczone = zinit(kmz->kz_elemsize,
213: 1024 * 1024, PAGE_SIZE, FALSE,
214: memname[kmz - kmzones]);
215: }
216: else if (kmz->kz_zalloczone == KMZ_LOOKUPZONE)
217: kmz->kz_zalloczone = kalloc_zone(kmz->kz_elemsize);
218:
219: kmz++;
220: }
221:
222: kmz = kmzones;
223: while (kmz < &kmzones[M_LAST]) {
224: /* XXX */
225: if (kmz->kz_elemsize == -1)
226: ;
227: else
228: /* XXX */
229: if (kmz->kz_zalloczone == KMZ_SHAREZONE) {
230: kmz->kz_zalloczone =
231: kmzones[kmz->kz_elemsize].kz_zalloczone;
232: kmz->kz_elemsize =
233: kmzones[kmz->kz_elemsize].kz_elemsize;
234: }
235:
236: kmz++;
237: }
238: }
239:
240: #define MDECL(reqlen) \
241: union { \
242: struct _mhead hdr; \
243: char _m[(reqlen) + sizeof (struct _mhead)]; \
244: }
245:
246: struct _mhead {
247: size_t mlen;
248: char dat[0];
249: };
250:
251: void *_MALLOC(
252: size_t size,
253: int type,
254: int flags)
255: {
256: MDECL(size) *mem;
257: size_t memsize = sizeof (*mem);
258:
259: if (type >= M_LAST)
260: panic("_malloc TYPE");
261:
262: if (size == 0)
263: return (0);
264:
265: if (flags & M_NOWAIT) {
266: mem = (void *)kalloc_noblock(memsize);
267: } else {
268: mem = (void *)kalloc(memsize);
269: }
270: if (!mem)
271: return (0);
272:
273: mem->hdr.mlen = memsize;
274:
275: return (mem->hdr.dat);
276: }
277:
278: void _FREE(
279: void *addr,
280: int type)
281: {
282: struct _mhead *hdr;
283:
284: if (type >= M_LAST)
285: panic("_free TYPE");
286:
287: if (!addr)
288: return;
289:
290: hdr = addr; hdr--;
291: kfree((vm_offset_t)hdr, hdr->mlen);
292: }
293:
294: void *_MALLOC_ZONE(
295: size_t size,
296: int type,
297: int flags)
298: {
299: struct kmzones *kmz;
300: void *elem;
301:
302: if (type >= M_LAST)
303: panic("_malloc_zone TYPE");
304:
305: kmz = &kmzones[type];
306: if (kmz->kz_zalloczone == KMZ_MALLOC)
307: panic("_malloc_zone ZONE");
308:
309: /* XXX */
310: if (kmz->kz_elemsize == -1)
311: panic("_malloc_zone XXX");
312: /* XXX */
313: if (size == kmz->kz_elemsize)
314: if (flags & M_NOWAIT) {
315: elem = (void *)zalloc_noblock(kmz->kz_zalloczone);
316: } else {
317: elem = (void *)zalloc(kmz->kz_zalloczone);
318: }
319: else
320: if (flags & M_NOWAIT) {
321: elem = (void *)kalloc_noblock(size);
322: } else {
323: elem = (void *)kalloc(size);
324: }
325:
326: return (elem);
327: }
328:
329: void _FREE_ZONE(
330: void *elem,
331: size_t size,
332: int type)
333: {
334: struct kmzones *kmz;
335:
336: if (type >= M_LAST)
337: panic("FREE_SIZE");
338:
339: kmz = &kmzones[type];
340: if (kmz->kz_zalloczone == KMZ_MALLOC)
341: panic("free_zone ZONE");
342:
343: /* XXX */
344: if (kmz->kz_elemsize == -1)
345: panic("FREE_SIZE XXX");
346: /* XXX */
347: if (size == kmz->kz_elemsize)
348: zfree(kmz->kz_zalloczone, (vm_offset_t)elem);
349: else
350: kfree((vm_offset_t)elem, size);
351: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.