Annotation of XNU/bsd/kern/kern_malloc.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.