Annotation of kernel/bsd/kern/kern_malloc.c, revision 1.1

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

unix.superglobalmegacorp.com

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