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