The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/sys/malloc.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*
    2  * Copyright (c) 1987, 1993
    3  *      The Regents of the University of California.  All rights reserved.
    4  *
    5  * Redistribution and use in source and binary forms, with or without
    6  * modification, are permitted provided that the following conditions
    7  * are met:
    8  * 1. Redistributions of source code must retain the above copyright
    9  *    notice, this list of conditions and the following disclaimer.
   10  * 2. Redistributions in binary form must reproduce the above copyright
   11  *    notice, this list of conditions and the following disclaimer in the
   12  *    documentation and/or other materials provided with the distribution.
   13  * 3. All advertising materials mentioning features or use of this software
   14  *    must display the following acknowledgement:
   15  *      This product includes software developed by the University of
   16  *      California, Berkeley and its contributors.
   17  * 4. Neither the name of the University nor the names of its contributors
   18  *    may be used to endorse or promote products derived from this software
   19  *    without specific prior written permission.
   20  *
   21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
   22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
   25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   31  * SUCH DAMAGE.
   32  *
   33  *      @(#)malloc.h    8.5 (Berkeley) 5/3/95
   34  * $FreeBSD: src/sys/sys/malloc.h,v 1.16.2.2 1999/09/05 08:22:34 peter Exp $
   35  */
   36 
   37 #ifndef _SYS_MALLOC_H_
   38 #define _SYS_MALLOC_H_
   39 
   40 #define KMEMSTATS
   41 
   42 /*
   43  * flags to malloc
   44  */
   45 #define M_WAITOK        0x0000
   46 #define M_NOWAIT        0x0001
   47 #define M_KERNEL        0x0002
   48 
   49 /*
   50  * Types of memory to be allocated
   51  */
   52 #define M_FREE          0       /* should be on free list */
   53 #define M_MBUF          1       /* mbuf */
   54 #define M_DEVBUF        2       /* device driver memory */
   55 #define M_SOCKET        3       /* socket structure */
   56 #define M_PCB           4       /* protocol control block */
   57 #define M_RTABLE        5       /* routing tables */
   58 #define M_HTABLE        6       /* IMP host tables */
   59 #define M_FTABLE        7       /* fragment reassembly header */
   60 #define M_ZOMBIE        8       /* zombie proc status */
   61 #define M_IFADDR        9       /* interface address */
   62 #define M_SOOPTS        10      /* socket options */
   63 #define M_SONAME        11      /* socket name */
   64 #define M_NAMEI         12      /* namei path name buffer */
   65 #define M_GPROF         13      /* kernel profiling buffer */
   66 #define M_IOCTLOPS      14      /* ioctl data buffer */
   67 #define M_MAPMEM        15      /* mapped memory descriptors */
   68 #define M_CRED          16      /* credentials */
   69 #define M_PGRP          17      /* process group header */
   70 #define M_SESSION       18      /* session header */
   71 #define M_IOV           19      /* large iov's */
   72 #define M_MOUNT         20      /* vfs mount struct */
   73 #define M_FHANDLE       21      /* network file handle */
   74 #define M_NFSREQ        22      /* NFS request header */
   75 #define M_NFSMNT        23      /* NFS mount structure */
   76 #define M_NFSNODE       24      /* NFS vnode private part */
   77 #define M_VNODE         25      /* Dynamically allocated vnodes */
   78 #define M_CACHE         26      /* Dynamically allocated cache entries */
   79 #define M_DQUOT         27      /* UFS quota entries */
   80 #define M_UFSMNT        28      /* UFS mount structure */
   81 #define M_SHM           29      /* SVID compatible shared memory segments */
   82 #define M_VMMAP         30      /* VM map structures */
   83 #define M_VMMAPENT      31      /* VM map entry structures */
   84 #define M_VMOBJ         32      /* VM object structure */
   85 #define M_VMOBJHASH     33      /* VM object hash structure */
   86 #define M_VMPMAP        34      /* VM pmap */
   87 #define M_VMPVENT       35      /* VM phys-virt mapping entry */
   88 #define M_VMPAGER       36      /* XXX: VM pager struct */
   89 #define M_VMPGDATA      37      /* XXX: VM pager private data */
   90 #define M_FILE          38      /* Open file structure */
   91 #define M_FILEDESC      39      /* Open file descriptor table */
   92 #define M_LOCKF         40      /* Byte-range locking structures */
   93 #define M_PROC          41      /* Proc structures */
   94 #define M_SUBPROC       42      /* Proc sub-structures */
   95 #define M_SEGMENT       43      /* Segment for LFS */
   96 #define M_LFSNODE       44      /* LFS vnode private part */
   97 #define M_FFSNODE       45      /* FFS vnode private part */
   98 #define M_MFSNODE       46      /* MFS vnode private part */
   99 #define M_NQLEASE       47      /* Nqnfs lease */
  100 #define M_NQMHOST       48      /* Nqnfs host address table */
  101 #define M_NETADDR       49      /* Export host address structure */
  102 #define M_NFSSVC        50      /* Nfs server structure */
  103 #define M_NFSUID        51      /* Nfs uid mapping structure */
  104 #define M_NFSD          52      /* Nfs server daemon structure */
  105 #define M_IPMOPTS       53      /* internet multicast options */
  106 #define M_IPMADDR       54      /* internet multicast address */
  107 #define M_IFMADDR       55      /* link-level multicast address */
  108 #define M_MRTABLE       56      /* multicast routing tables */
  109 #define M_ISOFSMNT      57      /* ISOFS mount structure */
  110 #define M_ISOFSNODE     58      /* ISOFS vnode private part */
  111 #define M_NFSRVDESC     59      /* NFS server socket descriptor */
  112 #define M_NFSDIROFF     60      /* NFS directory offset data */
  113 #define M_NFSBIGFH      61      /* NFS version 3 file handle */
  114 #define M_MSDOSFSMNT    67      /* MSDOSFS mount structure */
  115 #define M_MSDOSFSNODE   68      /* MSDOSFS vnode private part */
  116 #define M_MSDOSFSFAT    69      /* MSDOSFS file allocation table */
  117 #define M_DEVFSMNT      70      /* DEVFS mount structure */
  118 #define M_DEVFSBACK     71      /* DEVFS Back node */
  119 #define M_DEVFSFRONT    72      /* DEVFS Front node */
  120 #define M_DEVFSNODE     73      /* DEVFS node */
  121 #define M_TEMP          74      /* misc temporary data buffers */
  122 #define M_TTYS          75      /* tty data structures */
  123 #define M_GZIP          76      /* Gzip trees */
  124 #define M_IPFW          77      /* IpFw/IpAcct chain's */
  125 #define M_DEVL          78      /* isa_device lists in userconfig() */
  126 #define M_PKTCLASS      79      /* structures used in packet classifier */
  127 #define M_SYSCTL        80      /* sysctl internal magic */
  128 #define M_SECA          81      /* security associations, key management */
  129 #define M_BIOBUF        82      /* BIO buffer */
  130 #define M_KTRACE        83      /* KTRACE */
  131 #define M_SELECT        84      /* select() buffer */
  132 #define M_CFS           85      /* Coda */
  133 #define M_LAST          86      /* Must be last type + 1 */
  134 
  135 #define INITKMEMNAMES { \
  136         "free",         /* 0 M_FREE */ \
  137         "mbuf",         /* 1 M_MBUF */ \
  138         "devbuf",       /* 2 M_DEVBUF */ \
  139         "socket",       /* 3 M_SOCKET */ \
  140         "pcb",          /* 4 M_PCB */ \
  141         "routetbl",     /* 5 M_RTABLE */ \
  142         "hosttbl",      /* 6 M_HTABLE */ \
  143         "fragtbl",      /* 7 M_FTABLE */ \
  144         "zombie",       /* 8 M_ZOMBIE */ \
  145         "ifaddr",       /* 9 M_IFADDR */ \
  146         "soopts",       /* 10 M_SOOPTS */ \
  147         "soname",       /* 11 M_SONAME */ \
  148         "namei",        /* 12 M_NAMEI */ \
  149         "gprof",        /* 13 M_GPROF */ \
  150         "ioctlops",     /* 14 M_IOCTLOPS */ \
  151         "mapmem",       /* 15 M_MAPMEM */ \
  152         "cred",         /* 16 M_CRED */ \
  153         "pgrp",         /* 17 M_PGRP */ \
  154         "session",      /* 18 M_SESSION */ \
  155         "iov",          /* 19 M_IOV */ \
  156         "mount",        /* 20 M_MOUNT */ \
  157         "fhandle",      /* 21 M_FHANDLE */ \
  158         "NFS req",      /* 22 M_NFSREQ */ \
  159         "NFS mount",    /* 23 M_NFSMNT */ \
  160         "NFS node",     /* 24 M_NFSNODE */ \
  161         "vnodes",       /* 25 M_VNODE */ \
  162         "namecache",    /* 26 M_CACHE */ \
  163         "UFS quota",    /* 27 M_DQUOT */ \
  164         "UFS mount",    /* 28 M_UFSMNT */ \
  165         "shm",          /* 29 M_SHM */ \
  166         "VM map",       /* 30 M_VMMAP */ \
  167         "VM mapent",    /* 31 M_VMMAPENT */ \
  168         "VM object",    /* 32 M_VMOBJ */ \
  169         "VM objhash",   /* 33 M_VMOBJHASH */ \
  170         "VM pmap",      /* 34 M_VMPMAP */ \
  171         "VM pvmap",     /* 35 M_VMPVENT */ \
  172         "VM pager",     /* 36 M_VMPAGER */ \
  173         "VM pgdata",    /* 37 M_VMPGDATA */ \
  174         "file",         /* 38 M_FILE */ \
  175         "file desc",    /* 39 M_FILEDESC */ \
  176         "lockf",        /* 40 M_LOCKF */ \
  177         "proc",         /* 41 M_PROC */ \
  178         "subproc",      /* 42 M_SUBPROC */ \
  179         "LFS segment",  /* 43 M_SEGMENT */ \
  180         "LFS node",     /* 44 M_LFSNODE */ \
  181         "FFS node",     /* 45 M_FFSNODE */ \
  182         "MFS node",     /* 46 M_MFSNODE */ \
  183         "NQNFS Lease",  /* 47 M_NQLEASE */ \
  184         "NQNFS Host",   /* 48 M_NQMHOST */ \
  185         "Export Host",  /* 49 M_NETADDR */ \
  186         "NFS srvsock",  /* 50 M_NFSSVC */ \
  187         "NFS uid",      /* 51 M_NFSUID */ \
  188         "NFS daemon",   /* 52 M_NFSD */ \
  189         "ip_moptions",  /* 53 M_IPMOPTS */ \
  190         "in_multi",     /* 54 M_IPMADDR */ \
  191         "ether_multi",  /* 55 M_IFMADDR */ \
  192         "mrt",          /* 56 M_MRTABLE */ \
  193         "ISOFS mount",  /* 57 M_ISOFSMNT */ \
  194         "ISOFS node",   /* 58 M_ISOFSNODE */ \
  195         "NFSV3 srvdesc",/* 59 M_NFSRVDESC */ \
  196         "NFSV3 diroff", /* 60 M_NFSDIROFF */ \
  197         "NFSV3 bigfh",  /* 61 M_NFSBIGFH */ \
  198         NULL, \
  199         NULL, NULL, NULL, NULL, \
  200         "MSDOSFS mount",/* 67 M_MSDOSFSMNT */ \
  201         "MSDOSFS node", /* 68 M_MSDOSFSNODE */ \
  202         "MSDOSFS FAT",  /* 69 M_MSDOSFSFAR */ \
  203         "DEVFS mount",  /* 70 M_DEVFSMNT */ \
  204         "DEVFS back",   /* 71 M_DEVFSBACK */ \
  205         "DEVFS front",  /* 72 M_DEVFSFRONT */ \
  206         "DEVFS node",   /* 73 M_DEVFSNODE */ \
  207         "temp",         /* 74 M_TEMP */ \
  208         "ttys",         /* 75 M_TTYS */ \
  209         "Gzip trees",   /* 76 M_GZIP */ \
  210         "IpFw/IpAcct",  /* 77 M_IPFW */ \
  211         "isa_devlist",  /* 78 M_DEVL */ \
  212         "PktClass",     /* 79 M_PKTCLASS */ \
  213         "sysctl",       /* 80 M_SYSCTL */ \
  214         "key mgmt",     /* 81 M_SECA */ \
  215         "BIO buffer",   /* 82 M_BIOBUF */ \
  216         "KTRACE",       /* 83 M_KTRACE */ \
  217         "select",       /* 84 M_SELECT */ \
  218         "Coda",         /* 85 M_CFS */ \
  219 }
  220 
  221 struct kmemstats {
  222         long    ks_inuse;       /* # of packets of this type currently in use */
  223         long    ks_calls;       /* total packets of this type ever allocated */
  224         long    ks_memuse;      /* total memory held in bytes */
  225         u_short ks_limblocks;   /* number of times blocked for hitting limit */
  226         u_short ks_mapblocks;   /* number of times blocked for kernel map */
  227         long    ks_maxused;     /* maximum number ever used */
  228         long    ks_limit;       /* most that are allowed to exist */
  229         long    ks_size;        /* sizes of this thing that are allocated */
  230         long    ks_spare;
  231 };
  232 
  233 /*
  234  * Array of descriptors that describe the contents of each page
  235  */
  236 struct kmemusage {
  237         short ku_indx;          /* bucket index */
  238         union {
  239                 u_short freecnt;/* for small allocations, free pieces in page */
  240                 u_short pagecnt;/* for large allocations, pages alloced */
  241         } ku_un;
  242 };
  243 #define ku_freecnt ku_un.freecnt
  244 #define ku_pagecnt ku_un.pagecnt
  245 
  246 /*
  247  * Set of buckets for each size of memory block that is retained
  248  */
  249 struct kmembuckets {
  250         caddr_t kb_next;        /* list of free blocks */
  251         caddr_t kb_last;        /* last free block */
  252         long    kb_calls;       /* total calls to allocate this size */
  253         long    kb_total;       /* total number of blocks allocated */
  254         long    kb_totalfree;   /* # of free elements in this bucket */
  255         long    kb_elmpercl;    /* # of elements in this sized allocation */
  256         long    kb_highwat;     /* high water mark */
  257         long    kb_couldfree;   /* over high water mark and could free */
  258 };
  259 
  260 #ifdef KERNEL
  261 #define MINALLOCSIZE    (1 << MINBUCKET)
  262 #define BUCKETINDX(size) \
  263         ((size) <= (MINALLOCSIZE * 128) \
  264                 ? (size) <= (MINALLOCSIZE * 8) \
  265                         ? (size) <= (MINALLOCSIZE * 2) \
  266                                 ? (size) <= (MINALLOCSIZE * 1) \
  267                                         ? (MINBUCKET + 0) \
  268                                         : (MINBUCKET + 1) \
  269                                 : (size) <= (MINALLOCSIZE * 4) \
  270                                         ? (MINBUCKET + 2) \
  271                                         : (MINBUCKET + 3) \
  272                         : (size) <= (MINALLOCSIZE* 32) \
  273                                 ? (size) <= (MINALLOCSIZE * 16) \
  274                                         ? (MINBUCKET + 4) \
  275                                         : (MINBUCKET + 5) \
  276                                 : (size) <= (MINALLOCSIZE * 64) \
  277                                         ? (MINBUCKET + 6) \
  278                                         : (MINBUCKET + 7) \
  279                 : (size) <= (MINALLOCSIZE * 2048) \
  280                         ? (size) <= (MINALLOCSIZE * 512) \
  281                                 ? (size) <= (MINALLOCSIZE * 256) \
  282                                         ? (MINBUCKET + 8) \
  283                                         : (MINBUCKET + 9) \
  284                                 : (size) <= (MINALLOCSIZE * 1024) \
  285                                         ? (MINBUCKET + 10) \
  286                                         : (MINBUCKET + 11) \
  287                         : (size) <= (MINALLOCSIZE * 8192) \
  288                                 ? (size) <= (MINALLOCSIZE * 4096) \
  289                                         ? (MINBUCKET + 12) \
  290                                         : (MINBUCKET + 13) \
  291                                 : (size) <= (MINALLOCSIZE * 16384) \
  292                                         ? (MINBUCKET + 14) \
  293                                         : (MINBUCKET + 15))
  294 
  295 /*
  296  * Turn virtual addresses into kmem map indices
  297  */
  298 #define kmemxtob(alloc) (kmembase + (alloc) * PAGE_SIZE)
  299 #define btokmemx(addr)  (((caddr_t)(addr) - kmembase) / PAGE_SIZE)
  300 #define btokup(addr)    (&kmemusage[(caddr_t)(addr) - kmembase >> PAGE_SHIFT])
  301 
  302 /*
  303  * Macro versions for the usual cases of malloc/free
  304  */
  305 #if defined(KMEMSTATS) || defined(DIAGNOSTIC)
  306 #define MALLOC(space, cast, size, type, flags) \
  307         (space) = (cast)malloc((u_long)(size), type, flags)
  308 #define FREE(addr, type) free((addr), type)
  309 
  310 #else /* do not collect statistics */
  311 #define MALLOC(space, cast, size, type, flags) { \
  312         register struct kmembuckets *kbp = &bucket[BUCKETINDX(size)]; \
  313         long s = splimp(); \
  314         if (kbp->kb_next == NULL) { \
  315                 (space) = (cast)malloc((u_long)(size), type, flags); \
  316         } else { \
  317                 (space) = (cast)kbp->kb_next; \
  318                 kbp->kb_next = *(caddr_t *)(space); \
  319         } \
  320         splx(s); \
  321 }
  322 
  323 #define FREE(addr, type) { \
  324         register struct kmembuckets *kbp; \
  325         register struct kmemusage *kup = btokup(addr); \
  326         long s = splimp(); \
  327         if (1 << kup->ku_indx > MAXALLOCSAVE) { \
  328                 free((addr), type); \
  329         } else { \
  330                 kbp = &bucket[kup->ku_indx]; \
  331                 if (kbp->kb_next == NULL) \
  332                         kbp->kb_next = (caddr_t)(addr); \
  333                 else \
  334                         *(caddr_t *)(kbp->kb_last) = (caddr_t)(addr); \
  335                 *(caddr_t *)(addr) = NULL; \
  336                 kbp->kb_last = (caddr_t)(addr); \
  337         } \
  338         splx(s); \
  339 }
  340 #endif /* do not collect statistics */
  341 
  342 extern struct kmemstats kmemstats[];
  343 extern struct kmemusage *kmemusage;
  344 extern char *kmembase;
  345 extern struct kmembuckets bucket[];
  346 
  347 void    *contigmalloc __P((unsigned long size, int type, int flags,
  348                            unsigned long low, unsigned long high,
  349                            unsigned long alignment, unsigned long boundary));
  350 void    free __P((void *addr, int type));
  351 void    *malloc __P((unsigned long size, int type, int flags));
  352 #endif /* KERNEL */
  353 
  354 #endif /* !_SYS_MALLOC_H_ */

Cache object: 223b62a5d13ac6141df2cbda1050d0c7


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.