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/pool.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 /*      $OpenBSD: pool.h,v 1.78 2021/01/02 03:23:59 cheloha 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  *
   21  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
   22  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
   23  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   24  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
   25  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   26  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   27  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   28  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   29  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   30  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   31  * POSSIBILITY OF SUCH DAMAGE.
   32  */
   33 
   34 #ifndef _SYS_POOL_H_
   35 #define _SYS_POOL_H_
   36 
   37 /*
   38  * sysctls.
   39  * kern.pool.npools
   40  * kern.pool.name.<number>
   41  * kern.pool.pool.<number>
   42  */
   43 #define KERN_POOL_NPOOLS        1
   44 #define KERN_POOL_NAME          2
   45 #define KERN_POOL_POOL          3
   46 #define KERN_POOL_CACHE         4       /* global pool cache info */
   47 #define KERN_POOL_CACHE_CPUS    5       /* all cpus cache info */
   48 
   49 struct kinfo_pool {
   50         unsigned int    pr_size;        /* size of a pool item */
   51         unsigned int    pr_pgsize;      /* size of a "page" */
   52         unsigned int    pr_itemsperpage; /* number of items per "page" */
   53         unsigned int    pr_minpages;    /* same in page units */
   54         unsigned int    pr_maxpages;    /* maximum # of idle pages to keep */
   55         unsigned int    pr_hardlimit;   /* hard limit to number of allocated
   56                                            items */
   57 
   58         unsigned int    pr_npages;      /* # of pages allocated */
   59         unsigned int    pr_nout;        /* # items currently allocated */
   60         unsigned int    pr_nitems;      /* # items in the pool */
   61 
   62         unsigned long   pr_nget;        /* # of successful requests */
   63         unsigned long   pr_nput;        /* # of releases */
   64         unsigned long   pr_nfail;       /* # of unsuccessful requests */
   65         unsigned long   pr_npagealloc;  /* # of pages allocated */
   66         unsigned long   pr_npagefree;   /* # of pages released */
   67         unsigned int    pr_hiwat;       /* max # of pages in pool */
   68         unsigned long   pr_nidle;       /* # of idle pages */
   69 };
   70 
   71 struct kinfo_pool_cache {
   72         uint64_t        pr_ngc;         /* # of times a list has been gc'ed */
   73         unsigned int    pr_len;         /* current target for list len */
   74         unsigned int    pr_nitems;      /* # of idle items in the depot */
   75         unsigned int    pr_contention;  /* # of times mtx was busy */
   76 };
   77 
   78 /*
   79  * KERN_POOL_CACHE_CPUS provides an array, not a single struct. ie, it
   80  * provides struct kinfo_pool_cache_cpu kppc[ncpusfound].
   81  */
   82 struct kinfo_pool_cache_cpu {
   83         unsigned int    pr_cpu;         /* which cpu this cache is on */
   84 
   85         /* counters for times items were handled by the cache */
   86         uint64_t        pr_nget;        /* # of requests */
   87         uint64_t        pr_nfail;       /* # of unsuccessful requests */
   88         uint64_t        pr_nput;        /* # of releases */
   89 
   90         /* counters for times the cache interacted with the pool */
   91         uint64_t        pr_nlget;       /* # of list requests */
   92         uint64_t        pr_nlfail;      /* # of unsuccessful list requests */
   93         uint64_t        pr_nlput;       /* # of list releases */
   94 };
   95 
   96 #if defined(_KERNEL) || defined(_LIBKVM)
   97 
   98 #include <sys/queue.h>
   99 #include <sys/tree.h>
  100 #include <sys/mutex.h>
  101 #include <sys/rwlock.h>
  102 
  103 struct pool;
  104 struct pool_request;
  105 struct pool_lock_ops;
  106 TAILQ_HEAD(pool_requests, pool_request);
  107 
  108 struct pool_allocator {
  109         void            *(*pa_alloc)(struct pool *, int, int *);
  110         void             (*pa_free)(struct pool *, void *);
  111         size_t             pa_pagesz;
  112 };
  113 
  114 /*
  115  * The pa_pagesz member encodes the sizes of pages that can be
  116  * provided by the allocator, and whether the allocations can be
  117  * aligned to their size.
  118  *
  119  * Page sizes can only be powers of two. Each available page size is
  120  * represented by its value set as a bit. e.g., to indicate that an
  121  * allocator can provide 16k and 32k pages you initialise pa_pagesz
  122  * to (32768 | 16384).
  123  *
  124  * If the allocator can provide aligned pages the low bit in pa_pagesz
  125  * is set. The POOL_ALLOC_ALIGNED macro is provided as a convenience.
  126  *
  127  * If pa_pagesz is unset (i.e. 0), POOL_ALLOC_DEFAULT will be used
  128  * instead.
  129  */
  130 
  131 #define POOL_ALLOC_ALIGNED              1UL
  132 #define POOL_ALLOC_SIZE(_sz, _a)        ((_sz) | (_a))
  133 #define POOL_ALLOC_SIZES(_min, _max, _a) \
  134         ((_max) | \
  135         (((_max) - 1) & ~((_min) - 1)) | (_a))
  136 
  137 #define POOL_ALLOC_DEFAULT \
  138         POOL_ALLOC_SIZE(PAGE_SIZE, POOL_ALLOC_ALIGNED)
  139 
  140 TAILQ_HEAD(pool_pagelist, pool_page_header);
  141 
  142 struct pool_cache_item;
  143 TAILQ_HEAD(pool_cache_lists, pool_cache_item);
  144 struct cpumem;
  145 
  146 union pool_lock {
  147         struct mutex    prl_mtx;
  148         struct rwlock   prl_rwlock;
  149 };
  150 
  151 struct pool {
  152         union pool_lock pr_lock;
  153         const struct pool_lock_ops *
  154                         pr_lock_ops;
  155         SIMPLEQ_ENTRY(pool)
  156                         pr_poollist;
  157         struct pool_pagelist
  158                         pr_emptypages;  /* Empty pages */
  159         struct pool_pagelist
  160                         pr_fullpages;   /* Full pages */
  161         struct pool_pagelist
  162                         pr_partpages;   /* Partially-allocated pages */
  163         struct pool_page_header *
  164                         pr_curpage;
  165         unsigned int    pr_size;        /* Size of item */
  166         unsigned int    pr_minitems;    /* minimum # of items to keep */
  167         unsigned int    pr_minpages;    /* same in page units */
  168         unsigned int    pr_maxpages;    /* maximum # of idle pages to keep */
  169         unsigned int    pr_npages;      /* # of pages allocated */
  170         unsigned int    pr_itemsperpage;/* # items that fit in a page */
  171         unsigned int    pr_slack;       /* unused space in a page */
  172         unsigned int    pr_nitems;      /* number of available items in pool */
  173         unsigned int    pr_nout;        /* # items currently allocated */
  174         unsigned int    pr_hardlimit;   /* hard limit to number of allocated
  175                                            items */
  176         unsigned int    pr_serial;      /* unique serial number of the pool */
  177         unsigned int    pr_pgsize;      /* Size of a "page" */
  178         vaddr_t         pr_pgmask;      /* Mask with an item to get a page */
  179         struct pool_allocator *
  180                         pr_alloc;       /* backend allocator */
  181         const char *    pr_wchan;       /* tsleep(9) identifier */
  182 #define PR_WAITOK       0x0001 /* M_WAITOK */
  183 #define PR_NOWAIT       0x0002 /* M_NOWAIT */
  184 #define PR_LIMITFAIL    0x0004 /* M_CANFAIL */
  185 #define PR_ZERO         0x0008 /* M_ZERO */
  186 #define PR_RWLOCK       0x0010
  187 #define PR_WANTED       0x0100
  188 
  189         int             pr_flags;
  190         int             pr_ipl;
  191 
  192         RBT_HEAD(phtree, pool_page_header)
  193                         pr_phtree;
  194 
  195         struct cpumem * pr_cache;
  196         unsigned long   pr_cache_magic[2];
  197         union pool_lock pr_cache_lock;
  198         struct pool_cache_lists
  199                         pr_cache_lists; /* list of idle item lists */
  200         u_int           pr_cache_nitems; /* # of idle items */
  201         u_int           pr_cache_items; /* target list length */
  202         u_int           pr_cache_contention;
  203         u_int           pr_cache_contention_prev;
  204         uint64_t        pr_cache_timestamp;     /* time idle list was empty */
  205         uint64_t        pr_cache_ngc;   /* # of times the gc released a list */
  206         int             pr_cache_nout;
  207 
  208         u_int           pr_align;
  209         u_int           pr_maxcolors;   /* Cache coloring */
  210         int             pr_phoffset;    /* Offset in page of page header */
  211 
  212         /*
  213          * Warning message to be issued, and a per-time-delta rate cap,
  214          * if the hard limit is reached.
  215          */
  216         const char      *pr_hardlimit_warning;
  217         struct timeval  pr_hardlimit_ratecap;
  218         struct timeval  pr_hardlimit_warning_last;
  219 
  220         /*
  221          * pool item requests queue
  222          */
  223         union pool_lock pr_requests_lock;
  224         struct pool_requests
  225                         pr_requests;
  226         unsigned int    pr_requesting;
  227 
  228         /*
  229          * Instrumentation
  230          */
  231         unsigned long   pr_nget;        /* # of successful requests */
  232         unsigned long   pr_nfail;       /* # of unsuccessful requests */
  233         unsigned long   pr_nput;        /* # of releases */
  234         unsigned long   pr_npagealloc;  /* # of pages allocated */
  235         unsigned long   pr_npagefree;   /* # of pages released */
  236         unsigned int    pr_hiwat;       /* max # of pages in pool */
  237         unsigned long   pr_nidle;       /* # of idle pages */
  238 
  239         /* Physical memory configuration. */
  240         const struct kmem_pa_mode *
  241                         pr_crange;
  242 };
  243 
  244 #endif /* _KERNEL || _LIBKVM */
  245 
  246 #ifdef _KERNEL
  247 
  248 extern struct pool_allocator pool_allocator_single;
  249 extern struct pool_allocator pool_allocator_multi;
  250 
  251 struct pool_request {
  252         TAILQ_ENTRY(pool_request) pr_entry;
  253         void (*pr_handler)(struct pool *, void *, void *);
  254         void *pr_cookie;
  255         void *pr_item;
  256 };
  257 
  258 void            pool_init(struct pool *, size_t, u_int, int, int,
  259                     const char *, struct pool_allocator *);
  260 void            pool_cache_init(struct pool *);
  261 void            pool_destroy(struct pool *);
  262 void            pool_setlowat(struct pool *, int);
  263 void            pool_sethiwat(struct pool *, int);
  264 int             pool_sethardlimit(struct pool *, u_int, const char *, int);
  265 struct uvm_constraint_range; /* XXX */
  266 void            pool_set_constraints(struct pool *,
  267                     const struct kmem_pa_mode *mode);
  268 
  269 void            *pool_get(struct pool *, int) __malloc;
  270 void            pool_request_init(struct pool_request *,
  271                     void (*)(struct pool *, void *, void *), void *);
  272 void            pool_request(struct pool *, struct pool_request *);
  273 void            pool_put(struct pool *, void *);
  274 void            pool_wakeup(struct pool *);
  275 int             pool_reclaim(struct pool *);
  276 void            pool_reclaim_all(void);
  277 int             pool_prime(struct pool *, int);
  278 
  279 #ifdef DDB
  280 /*
  281  * Debugging and diagnostic aides.
  282  */
  283 void            pool_printit(struct pool *, const char *,
  284                     int (*)(const char *, ...));
  285 void            pool_walk(struct pool *, int, int (*)(const char *, ...),
  286                     void (*)(void *, int, int (*)(const char *, ...)));
  287 #endif
  288 
  289 /* the allocator for dma-able memory is a thin layer on top of pool  */
  290 void             dma_alloc_init(void);
  291 void            *dma_alloc(size_t size, int flags);
  292 void             dma_free(void *m, size_t size);
  293 #endif /* _KERNEL */
  294 
  295 #endif /* _SYS_POOL_H_ */

Cache object: bd46af117eb6a62ef68aad5730186b21


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