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