|
|
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.