[BACK]Return to pool.h CVS log [TXT][DIR] Up to [local] / sys / sys

Annotation of sys/sys/pool.h, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: pool.h,v 1.24 2007/05/28 17:55:56 tedu Exp $  */
                      2: /*     $NetBSD: pool.h,v 1.27 2001/06/06 22:00:17 rafal Exp $  */
                      3:
                      4: /*-
                      5:  * Copyright (c) 1997, 1998, 1999, 2000 The NetBSD Foundation, Inc.
                      6:  * All rights reserved.
                      7:  *
                      8:  * This code is derived from software contributed to The NetBSD Foundation
                      9:  * by Paul Kranenburg; by Jason R. Thorpe of the Numerical Aerospace
                     10:  * Simulation Facility, NASA Ames Research Center.
                     11:  *
                     12:  * Redistribution and use in source and binary forms, with or without
                     13:  * modification, are permitted provided that the following conditions
                     14:  * are met:
                     15:  * 1. Redistributions of source code must retain the above copyright
                     16:  *    notice, this list of conditions and the following disclaimer.
                     17:  * 2. Redistributions in binary form must reproduce the above copyright
                     18:  *    notice, this list of conditions and the following disclaimer in the
                     19:  *    documentation and/or other materials provided with the distribution.
                     20:  * 3. All advertising materials mentioning features or use of this software
                     21:  *    must display the following acknowledgement:
                     22:  *     This product includes software developed by the NetBSD
                     23:  *     Foundation, Inc. and its contributors.
                     24:  * 4. Neither the name of The NetBSD Foundation nor the names of its
                     25:  *    contributors may be used to endorse or promote products derived
                     26:  *    from this software without specific prior written permission.
                     27:  *
                     28:  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
                     29:  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
                     30:  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
                     31:  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
                     32:  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
                     33:  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
                     34:  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
                     35:  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
                     36:  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
                     37:  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
                     38:  * POSSIBILITY OF SUCH DAMAGE.
                     39:  */
                     40:
                     41: #ifndef _SYS_POOL_H_
                     42: #define _SYS_POOL_H_
                     43:
                     44: /*
                     45:  * sysctls.
                     46:  * kern.pool.npools
                     47:  * kern.pool.name.<number>
                     48:  * kern.pool.pool.<number>
                     49:  */
                     50: #define KERN_POOL_NPOOLS       1
                     51: #define KERN_POOL_NAME         2
                     52: #define KERN_POOL_POOL         3
                     53:
                     54: #include <sys/lock.h>
                     55: #include <sys/queue.h>
                     56: #include <sys/time.h>
                     57: #include <sys/tree.h>
                     58:
                     59: struct pool_cache {
                     60:        TAILQ_ENTRY(pool_cache)
                     61:                        pc_poollist;    /* entry on pool's group list */
                     62:        TAILQ_HEAD(, pool_cache_group)
                     63:                        pc_grouplist;   /* Cache group list */
                     64:        struct pool_cache_group
                     65:                        *pc_allocfrom;  /* group to allocate from */
                     66:        struct pool_cache_group
                     67:                        *pc_freeto;     /* group to free to */
                     68:        struct pool     *pc_pool;       /* parent pool */
                     69:        struct simplelock pc_slock;     /* mutex */
                     70:
                     71:        int             (*pc_ctor)(void *, void *, int);
                     72:        void            (*pc_dtor)(void *, void *);
                     73:        void            *pc_arg;
                     74:
                     75:        /* Statistics. */
                     76:        unsigned long   pc_hits;        /* cache hits */
                     77:        unsigned long   pc_misses;      /* cache misses */
                     78:
                     79:        unsigned long   pc_ngroups;     /* # cache groups */
                     80:
                     81:        unsigned long   pc_nitems;      /* # objects currently in cache */
                     82: };
                     83:
                     84: struct pool_allocator {
                     85:        void *(*pa_alloc)(struct pool *, int);
                     86:        void (*pa_free)(struct pool *, void *);
                     87:        int pa_pagesz;
                     88:
                     89:        /* The following fields are for internal use only */
                     90:        struct simplelock pa_slock;
                     91:        TAILQ_HEAD(,pool) pa_list;
                     92:        int pa_flags;
                     93: #define PA_INITIALIZED 0x01
                     94: #define PA_WANT        0x02                    /* wakeup any sleeping pools on free */
                     95:        int pa_pagemask;
                     96:        int pa_pageshift;
                     97: };
                     98:
                     99: LIST_HEAD(pool_pagelist,pool_item_header);
                    100:
                    101: struct pool {
                    102:        TAILQ_ENTRY(pool)
                    103:                        pr_poollist;
                    104:        struct pool_pagelist
                    105:                        pr_emptypages;  /* Empty pages */
                    106:        struct pool_pagelist
                    107:                        pr_fullpages;   /* Full pages */
                    108:        struct pool_pagelist
                    109:                        pr_partpages;   /* Partially-allocated pages */
                    110:        struct pool_item_header *pr_curpage;
                    111:        TAILQ_HEAD(,pool_cache)
                    112:                        pr_cachelist;   /* Caches for this pool */
                    113:        unsigned int    pr_size;        /* Size of item */
                    114:        unsigned int    pr_align;       /* Requested alignment, must be 2^n */
                    115:        unsigned int    pr_itemoffset;  /* Align this offset in item */
                    116:        unsigned int    pr_minitems;    /* minimum # of items to keep */
                    117:        unsigned int    pr_minpages;    /* same in page units */
                    118:        unsigned int    pr_maxpages;    /* maximum # of idle pages to keep */
                    119:        unsigned int    pr_npages;      /* # of pages allocated */
                    120:        unsigned int    pr_itemsperpage;/* # items that fit in a page */
                    121:        unsigned int    pr_slack;       /* unused space in a page */
                    122:        unsigned int    pr_nitems;      /* number of available items in pool */
                    123:        unsigned int    pr_nout;        /* # items currently allocated */
                    124:        unsigned int    pr_hardlimit;   /* hard limit to number of allocated
                    125:                                           items */
                    126:        unsigned int    pr_serial;      /* unique serial number of the pool */
                    127:        struct pool_allocator *pr_alloc;/* backend allocator */
                    128:        TAILQ_ENTRY(pool) pr_alloc_list;/* list of pools using this allocator */
                    129:        const char      *pr_wchan;      /* tsleep(9) identifier */
                    130:        unsigned int    pr_flags;       /* r/w flags */
                    131:        unsigned int    pr_roflags;     /* r/o flags */
                    132: #define PR_MALLOCOK    0x01
                    133: #define        PR_NOWAIT       0x00            /* for symmetry */
                    134: #define PR_WAITOK      0x02
                    135: #define PR_WANTED      0x04
                    136: #define PR_PHINPAGE    0x08
                    137: #define PR_LOGGING     0x10
                    138: #define PR_LIMITFAIL   0x20    /* even if waiting, fail if we hit limit */
                    139: #define PR_DEBUG       0x40
                    140:
                    141:        /*
                    142:         * `pr_slock' protects the pool's data structures when removing
                    143:         * items from or returning items to the pool, or when reading
                    144:         * or updating read/write fields in the pool descriptor.
                    145:         *
                    146:         * We assume back-end page allocators provide their own locking
                    147:         * scheme.  They will be called with the pool descriptor _unlocked_,
                    148:         * since the page allocators may block.
                    149:         */
                    150:        struct simplelock       pr_slock;
                    151:        int                     pr_ipl;
                    152:
                    153:        SPLAY_HEAD(phtree, pool_item_header) pr_phtree;
                    154:
                    155:        int             pr_maxcolor;    /* Cache colouring */
                    156:        int             pr_curcolor;
                    157:        int             pr_phoffset;    /* Offset in page of page header */
                    158:
                    159:        /*
                    160:         * Warning message to be issued, and a per-time-delta rate cap,
                    161:         * if the hard limit is reached.
                    162:         */
                    163:        const char      *pr_hardlimit_warning;
                    164:        struct timeval  pr_hardlimit_ratecap;
                    165:        struct timeval  pr_hardlimit_warning_last;
                    166:
                    167:        /*
                    168:         * Instrumentation
                    169:         */
                    170:        unsigned long   pr_nget;        /* # of successful requests */
                    171:        unsigned long   pr_nfail;       /* # of unsuccessful requests */
                    172:        unsigned long   pr_nput;        /* # of releases */
                    173:        unsigned long   pr_npagealloc;  /* # of pages allocated */
                    174:        unsigned long   pr_npagefree;   /* # of pages released */
                    175:        unsigned int    pr_hiwat;       /* max # of pages in pool */
                    176:        unsigned long   pr_nidle;       /* # of idle pages */
                    177:
                    178:        /*
                    179:         * Diagnostic aides.
                    180:         */
                    181:        struct pool_log *pr_log;
                    182:        int             pr_curlogentry;
                    183:        int             pr_logsize;
                    184:
                    185:        const char      *pr_entered_file; /* reentrancy check */
                    186:        long            pr_entered_line;
                    187: };
                    188:
                    189: #ifdef _KERNEL
                    190: /* old nointr allocator, still needed for large allocations */
                    191: extern struct pool_allocator pool_allocator_oldnointr;
                    192:
                    193: extern struct pool_allocator pool_allocator_nointr;
                    194:
                    195: void           pool_init(struct pool *, size_t, u_int, u_int, int,
                    196:                    const char *, struct pool_allocator *);
                    197: #ifdef DIAGNOSTIC
                    198: void           pool_setipl(struct pool *, int);
                    199: #else
                    200: #define pool_setipl(p, i) do { /* nothing */  } while (0)
                    201: #endif
                    202: void           pool_destroy(struct pool *);
                    203:
                    204: void           *pool_get(struct pool *, int) __malloc;
                    205: void           pool_put(struct pool *, void *);
                    206: int            pool_reclaim(struct pool *);
                    207:
                    208: #ifdef POOL_DIAGNOSTIC
                    209: /*
                    210:  * These versions do reentrancy checking.
                    211:  */
                    212: void           *_pool_get(struct pool *, int, const char *, long);
                    213: void           _pool_put(struct pool *, void *, const char *, long);
                    214: int            _pool_reclaim(struct pool *, const char *, long);
                    215: #define                pool_get(h, f)  _pool_get((h), (f), __FILE__, __LINE__)
                    216: #define                pool_put(h, v)  _pool_put((h), (v), __FILE__, __LINE__)
                    217: #define                pool_reclaim(h) _pool_reclaim((h), __FILE__, __LINE__)
                    218: #endif /* POOL_DIAGNOSTIC */
                    219:
                    220: int            pool_prime(struct pool *, int);
                    221: void           pool_setlowat(struct pool *, int);
                    222: void           pool_sethiwat(struct pool *, int);
                    223: int            pool_sethardlimit(struct pool *, unsigned, const char *, int);
                    224:
                    225: #ifdef DDB
                    226: /*
                    227:  * Debugging and diagnostic aides.
                    228:  */
                    229: void           pool_printit(struct pool *, const char *,
                    230:                    int (*)(const char *, ...));
                    231: int            pool_chk(struct pool *, const char *);
                    232: #endif
                    233:
                    234: /*
                    235:  * Pool cache routines.
                    236:  */
                    237: void           pool_cache_init(struct pool_cache *, struct pool *,
                    238:                    int (*ctor)(void *, void *, int),
                    239:                    void (*dtor)(void *, void *),
                    240:                    void *);
                    241: void           pool_cache_destroy(struct pool_cache *);
                    242: void           *pool_cache_get(struct pool_cache *, int);
                    243: void           pool_cache_put(struct pool_cache *, void *);
                    244: void           pool_cache_destruct_object(struct pool_cache *, void *);
                    245: void           pool_cache_invalidate(struct pool_cache *);
                    246: #endif /* _KERNEL */
                    247:
                    248: #endif /* _SYS_POOL_H_ */

CVSweb