xref: /freebsd/lib/libmemstat/libmemstat.3 (revision 345e3f4dd764bf848e37ce8df83d9f2a4610c446)
10cddce49SRobert Watson.\" Copyright (c) 2005 Robert N. M. Watson
20cddce49SRobert Watson.\" All rights reserved.
30cddce49SRobert Watson.\"
40cddce49SRobert Watson.\" Redistribution and use in source and binary forms, with or without
50cddce49SRobert Watson.\" modification, are permitted provided that the following conditions
60cddce49SRobert Watson.\" are met:
70cddce49SRobert Watson.\" 1. Redistributions of source code must retain the above copyright
80cddce49SRobert Watson.\"    notice, this list of conditions and the following disclaimer.
90cddce49SRobert Watson.\" 2. Redistributions in binary form must reproduce the above copyright
100cddce49SRobert Watson.\"    notice, this list of conditions and the following disclaimer in the
110cddce49SRobert Watson.\"    documentation and/or other materials provided with the distribution.
120cddce49SRobert Watson.\"
130cddce49SRobert Watson.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
140cddce49SRobert Watson.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
150cddce49SRobert Watson.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
160cddce49SRobert Watson.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
170cddce49SRobert Watson.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
180cddce49SRobert Watson.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
190cddce49SRobert Watson.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
200cddce49SRobert Watson.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
210cddce49SRobert Watson.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
220cddce49SRobert Watson.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
230cddce49SRobert Watson.\" SUCH DAMAGE.
240cddce49SRobert Watson.\"
250cddce49SRobert Watson.\" $FreeBSD$
260cddce49SRobert Watson.\"
27*345e3f4dSGleb Smirnoff.Dd February 11, 2014
280cddce49SRobert Watson.Dt LIBMEMSTAT 3
29aa12cea2SUlrich Spörlein.Os
300cddce49SRobert Watson.Sh NAME
310cddce49SRobert Watson.Nm libmemstat
320cddce49SRobert Watson.Nd "library interface to retrieve kernel memory allocator statistics"
330cddce49SRobert Watson.Sh LIBRARY
340cddce49SRobert Watson.Lb libmemstat
350cddce49SRobert Watson.Sh SYNOPSIS
360cddce49SRobert Watson.In sys/types.h
370cddce49SRobert Watson.In memstat.h
38e754c6bbSRobert Watson.Ss General Functions
3933d6b9fbSRuslan Ermilov.Ft "const char *"
40e754c6bbSRobert Watson.Fn memstat_strerror "int error"
410cddce49SRobert Watson.Ss Memory Type List Management Functions
4233d6b9fbSRuslan Ermilov.Ft "struct memory_type_list *"
430cddce49SRobert Watson.Fn memstat_mtl_alloc "void"
4433d6b9fbSRuslan Ermilov.Ft "struct memory_type *"
450cddce49SRobert Watson.Fn memstat_mtl_first "struct memory_type_list *list"
4633d6b9fbSRuslan Ermilov.Ft "struct memory_type *"
470cddce49SRobert Watson.Fn memstat_mtl_next "struct memory_type *mtp"
4833d6b9fbSRuslan Ermilov.Ft "struct memory_type *"
4933d6b9fbSRuslan Ermilov.Fo memstat_mtl_find
5033d6b9fbSRuslan Ermilov.Fa "struct memory_type_list *list" "int allocator" "const char *name"
5133d6b9fbSRuslan Ermilov.Fc
520cddce49SRobert Watson.Ft void
530cddce49SRobert Watson.Fn memstat_mtl_free "struct memory_type_list *list"
5470ee997eSRobert Watson.Ft int
5570ee997eSRobert Watson.Fn memstat_mtl_geterror "struct memory_type_list *list"
560cddce49SRobert Watson.Ss Allocator Query Functions
570cddce49SRobert Watson.Ft int
58ba23fa9bSRobert Watson.Fn memstat_kvm_all "struct memory_type_list *list" "void *kvm_handle"
59ba23fa9bSRobert Watson.Ft int
60ba23fa9bSRobert Watson.Fn memstat_kvm_malloc "struct memory_type_list *list" "void *kvm_handle"
61ba23fa9bSRobert Watson.Ft int
6233c20d18SRobert Watson.Fn memstat_kvm_uma "struct memory_type_list *list" "void *kvm_handle"
6333c20d18SRobert Watson.Ft int
640cddce49SRobert Watson.Fn memstat_sysctl_all "struct memory_type_list *list" "int flags"
650cddce49SRobert Watson.Ft int
660cddce49SRobert Watson.Fn memstat_sysctl_malloc "struct memory_type_list *list" "int flags"
670cddce49SRobert Watson.Ft int
680cddce49SRobert Watson.Fn memstat_sysctl_uma "struct memory_type_list *list" "int flags"
690cddce49SRobert Watson.Ss Memory Type Accessor Methods
7033d6b9fbSRuslan Ermilov.Ft "const char *"
710cddce49SRobert Watson.Fn memstat_get_name "const struct memory_type *mtp"
720cddce49SRobert Watson.Ft int
730cddce49SRobert Watson.Fn memstat_get_allocator "const struct memory_type *mtp"
740cddce49SRobert Watson.Ft uint64_t
750cddce49SRobert Watson.Fn memstat_get_countlimit "const struct memory_type *mtp"
760cddce49SRobert Watson.Ft uint64_t
770cddce49SRobert Watson.Fn memstat_get_byteslimit "const struct memory_type *mtp"
780cddce49SRobert Watson.Ft uint64_t
790cddce49SRobert Watson.Fn memstat_get_sizemask "const struct memory_type *mtp"
800cddce49SRobert Watson.Ft uint64_t
810cddce49SRobert Watson.Fn memstat_get_size "const struct memory_type *mtp"
820cddce49SRobert Watson.Ft uint64_t
83*345e3f4dSGleb Smirnoff.Fn memstat_get_rsize "const struct memory_type *mtp"
84*345e3f4dSGleb Smirnoff.Ft uint64_t
850cddce49SRobert Watson.Fn memstat_get_memalloced "const struct memory_type *mtp"
860cddce49SRobert Watson.Ft uint64_t
870cddce49SRobert Watson.Fn memstat_get_memfreed "const struct memory_type *mtp"
880cddce49SRobert Watson.Ft uint64_t
890cddce49SRobert Watson.Fn memstat_get_numallocs "const struct memory_type *mtp"
900cddce49SRobert Watson.Ft uint64_t
910cddce49SRobert Watson.Fn memstat_get_numfrees "const struct memory_type *mtp"
920cddce49SRobert Watson.Ft uint64_t
930cddce49SRobert Watson.Fn memstat_get_bytes "const struct memory_type *mtp"
940cddce49SRobert Watson.Ft uint64_t
950cddce49SRobert Watson.Fn memstat_get_count "const struct memory_type *mtp"
960cddce49SRobert Watson.Ft uint64_t
970cddce49SRobert Watson.Fn memstat_get_free "const struct memory_type *mtp"
980cddce49SRobert Watson.Ft uint64_t
990cddce49SRobert Watson.Fn memstat_get_failures "const struct memory_type *mtp"
10033d6b9fbSRuslan Ermilov.Ft "void *"
1010cddce49SRobert Watson.Fn memstat_get_caller_pointer "const struct memory_type *mtp" "int index"
1020cddce49SRobert Watson.Ft void
10333d6b9fbSRuslan Ermilov.Fo memstat_set_caller_pointer
10433d6b9fbSRuslan Ermilov.Fa "struct memory_type *mtp" "int index" "void *value"
10533d6b9fbSRuslan Ermilov.Fc
1060cddce49SRobert Watson.Ft uint64_t
1070cddce49SRobert Watson.Fn memstat_get_caller_uint64 "const struct memory_type *mtp" "int index"
1080cddce49SRobert Watson.Ft void
10933d6b9fbSRuslan Ermilov.Fo memstat_set_caller_uint64
11033d6b9fbSRuslan Ermilov.Fa "struct memory_type *mtp" "int index" "uint64_t value"
11133d6b9fbSRuslan Ermilov.Fc
1120cddce49SRobert Watson.Ft uint64_t
1130cddce49SRobert Watson.Fn memstat_get_zonefree "const struct memory_type *mtp"
1140cddce49SRobert Watson.Ft uint64_t
115ca108fe2SRobert Watson.Fn memstat_get_kegfree "const struct memory_type *mtp"
116ca108fe2SRobert Watson.Ft uint64_t
1170cddce49SRobert Watson.Fn memstat_get_percpu_memalloced "const struct memory_type *mtp" "int cpu"
1180cddce49SRobert Watson.Ft uint64_t
1190cddce49SRobert Watson.Fn memstat_get_percpu_memfreed "const struct memory_type *mtp" "int cpu"
1200cddce49SRobert Watson.Ft uint64_t
1210cddce49SRobert Watson.Fn memstat_get_percpu_numallocs "const struct memory_type *mtp" "int cpu"
1220cddce49SRobert Watson.Ft uint64_t
1230cddce49SRobert Watson.Fn memstat_get_percpu_numfrees "const struct memory_type *mtp" "int cpu"
1240cddce49SRobert Watson.Ft uint64_t
1250cddce49SRobert Watson.Fn memstat_get_percpu_sizemask "const struct memory_type *mtp" "int cpu"
12633d6b9fbSRuslan Ermilov.Ft "void *"
12733d6b9fbSRuslan Ermilov.Fo memstat_get_percpu_caller_pointer
12833d6b9fbSRuslan Ermilov.Fa "const struct memory_type *mtp" "int cpu" "int index"
12933d6b9fbSRuslan Ermilov.Fc
1300cddce49SRobert Watson.Ft void
13133d6b9fbSRuslan Ermilov.Fo memstat_set_percpu_caller_pointer
13233d6b9fbSRuslan Ermilov.Fa "struct memory_type *mtp" "int cpu" "int index" "void *value"
13333d6b9fbSRuslan Ermilov.Fc
1340cddce49SRobert Watson.Ft uint64_t
13533d6b9fbSRuslan Ermilov.Fo memstat_get_percpu_caller_uint64
13633d6b9fbSRuslan Ermilov.Fa "const struct memory_type *mtp" "int cpu" "int index"
13733d6b9fbSRuslan Ermilov.Fc
1380cddce49SRobert Watson.Ft void
13933d6b9fbSRuslan Ermilov.Fo memstat_set_percpu_caller_uint64
14033d6b9fbSRuslan Ermilov.Fa "struct memory_type *mtp" "int cpu" "int index" "uint64_t value"
14133d6b9fbSRuslan Ermilov.Fc
1420cddce49SRobert Watson.Ft uint64_t
1430cddce49SRobert Watson.Fn memstat_get_percpu_free "const struct memory_type *mtp" "int cpu"
1440cddce49SRobert Watson.Sh DESCRIPTION
1450cddce49SRobert Watson.Nm
1460cddce49SRobert Watsonprovides an interface to retrieve kernel memory allocator statistics, for
1470cddce49SRobert Watsonthe purposes of debugging and system monitoring, insulating applications
1480cddce49SRobert Watsonfrom implementation details of the allocators, and allowing a tool to
1490cddce49SRobert Watsontransparently support multiple allocators.
1500cddce49SRobert Watson.Nm
1510cddce49SRobert Watsonsupports both retrieving a single statistics snapshot, as well as
1520cddce49SRobert Watsonincrementally updating statistics for long-term monitoring.
1530cddce49SRobert Watson.Pp
1540cddce49SRobert Watson.Nm
1550cddce49SRobert Watsondescribes each memory type using a
15633d6b9fbSRuslan Ermilov.Vt "struct memory_type" ,
1570cddce49SRobert Watsonan opaque memory type accessed by the application using accessor functions
1580cddce49SRobert Watsonin the library.
1590cddce49SRobert Watson.Nm
1600cddce49SRobert Watsonreturns and updates chains of
16133d6b9fbSRuslan Ermilov.Vt "struct memory_type"
1620cddce49SRobert Watsonvia a
16333d6b9fbSRuslan Ermilov.Vt "struct memory_type_list" ,
1640cddce49SRobert Watsonwhich will be allocated by calling
1650cddce49SRobert Watson.Fn memstat_mtl_alloc ,
1660cddce49SRobert Watsonand freed on completion using
1670cddce49SRobert Watson.Fn memstat_mtl_free .
1680cddce49SRobert WatsonLists of memory types are populated via calls that query the kernel for
1690cddce49SRobert Watsonstatistics information; currently:
170ba23fa9bSRobert Watson.Fn memstat_kvm_all ,
171ba23fa9bSRobert Watson.Fn memstat_kvm_malloc ,
17233c20d18SRobert Watson.Fn memstat_kvm_uma ,
1730cddce49SRobert Watson.Fn memstat_sysctl_all ,
1740cddce49SRobert Watson.Fn memstat_sysctl_uma ,
1750cddce49SRobert Watsonand
1760cddce49SRobert Watson.Fn memstat_sysctl_malloc .
1770cddce49SRobert WatsonRepeated calls will incrementally update the list of memory types, permitting
1780cddce49SRobert Watsontracking over time without recreating all list state.
17970ee997eSRobert WatsonIf an error is detected during a query call, error condition information may
18070ee997eSRobert Watsonbe retrieved using
181e754c6bbSRobert Watson.Fn memstat_mtl_geterror ,
182e754c6bbSRobert Watsonand converted to a user-readable string using
183e754c6bbSRobert Watson.Fn memstat_strerror .
18470ee997eSRobert Watson.Pp
1850cddce49SRobert WatsonFreeing the list will free all memory type data in the list, and so
1860cddce49SRobert Watsoninvalidates any outstanding pointers to entries in the list.
18733d6b9fbSRuslan Ermilov.Vt "struct memory_type"
1880cddce49SRobert Watsonentries in the list may be iterated over using
1890cddce49SRobert Watson.Fn memstat_mtl_first
1900cddce49SRobert Watsonand
19133d6b9fbSRuslan Ermilov.Fn memstat_mtl_next ,
1920cddce49SRobert Watsonwhich respectively return the first entry in a list, and the next entry in a
1930cddce49SRobert Watsonlist.
1940cddce49SRobert Watson.Fn memstat_mtl_find ,
1950cddce49SRobert Watsonwhich will return a pointer to the first entry matching the passed
1960cddce49SRobert Watsonparameters.
1970cddce49SRobert Watson.Pp
1980cddce49SRobert WatsonA series of accessor methods is provided to access fields of the structure,
1990cddce49SRobert Watsonincluding retrieving statistics and properties, as well as setting of caller
2000cddce49SRobert Watsonowned fields.
2010cddce49SRobert WatsonDirect application access to the data structure fields is not supported.
20233d6b9fbSRuslan Ermilov.Ss Library Vt memory_type Ss Fields
2030cddce49SRobert WatsonEach
20433d6b9fbSRuslan Ermilov.Vt "struct memory_type"
2050cddce49SRobert Watsonholds a description of the memory type, including its name and the allocator
2060cddce49SRobert Watsonit is managed by, as well as current statistics on use.
2070cddce49SRobert WatsonSome statistics are directly measured, others are derived from directly
2080cddce49SRobert Watsonmeasured statistics.
2090cddce49SRobert WatsonCertain high level statistics are present across all available allocators,
2100cddce49SRobert Watsonsuch as the number of allocation and free operations; other measurements,
2110cddce49SRobert Watsonsuch as the quantity of free items in per-CPU caches, or administrative
2120cddce49SRobert Watsonlimit on the number of allocations, is available only for specific
2130cddce49SRobert Watsonallocators.
21433d6b9fbSRuslan Ermilov.Ss Caller Vt memory_type Ss Fields
21533d6b9fbSRuslan Ermilov.Vt "struct memory_type"
216e86bb57bSRobert Watsonincludes fields to allow the application to store data, in the form of
217e86bb57bSRobert Watsonpointers and 64-bit integers, with memory types.
2180cddce49SRobert WatsonFor example, the application author might make use of one of the caller
2190cddce49SRobert Watsonpointers to reference a more complex data structure tracking long-term
2200cddce49SRobert Watsonbehavior of the memory type, or a window system object that is used to
2210cddce49SRobert Watsonrender the state of the memory type.
222e86bb57bSRobert WatsonGeneral and per-CPU storage is provided with each
22333d6b9fbSRuslan Ermilov.Vt "struct memory_type"
224e86bb57bSRobert Watsonin the form of an array of pointers and integers.
225e86bb57bSRobert WatsonThe array entries are accessed via the
226e86bb57bSRobert Watson.Fa index
227e86bb57bSRobert Watsonargument to the get and set accessor methods.
228e86bb57bSRobert WatsonPossible values of
229e86bb57bSRobert Watson.Fa index
230e86bb57bSRobert Watsonrange between
23133d6b9fbSRuslan Ermilov0
232e86bb57bSRobert Watsonand
233e86bb57bSRobert Watson.Dv MEMSTAT_MAXCALLER .
234e86bb57bSRobert Watson.Pp
235e86bb57bSRobert WatsonCaller-owned fields are initialized to
23633d6b9fbSRuslan Ermilov0
2370cddce49SRobert Watsonor
2380cddce49SRobert Watson.Dv NULL
239e86bb57bSRobert Watsonwhen a new
24033d6b9fbSRuslan Ermilov.Vt "struct memory_type"
241e86bb57bSRobert Watsonis allocated and attached to a memory type list; these fields retain their
242e86bb57bSRobert Watsonvalues across queries that update library-owned fields.
24309df0a9aSRobert Watson.Ss Allocator Types
24409df0a9aSRobert WatsonCurrently,
24509df0a9aSRobert Watson.Nm
24609df0a9aSRobert Watsonsupports two kernel allocators:
24709df0a9aSRobert Watson.Dv ALLOCATOR_UMA
24809df0a9aSRobert Watsonfor
24909df0a9aSRobert Watson.Xr uma 9 ,
25009df0a9aSRobert Watsonand
25109df0a9aSRobert Watson.Dv ALLOCATOR_MALLOC
25209df0a9aSRobert Watsonfor
25309df0a9aSRobert Watson.Xr malloc 9 .
25409df0a9aSRobert WatsonThese values may be passed to
25509df0a9aSRobert Watson.Fn memstat_mtl_find ,
25609df0a9aSRobert Watsonand will be returned by
25709df0a9aSRobert Watson.Fn memstat_get_allocator .
25809df0a9aSRobert WatsonTwo additional constants in the allocator name space are defined:
25909df0a9aSRobert Watson.Dv ALLOCATOR_UNKNOWN ,
26009df0a9aSRobert Watsonwhich will only be returned as a result of a library error, and
26109df0a9aSRobert Watson.Dv ALLOCATOR_ANY ,
26209df0a9aSRobert Watsonwhich can be used to specify that returning types matching any allocator is
263799162a6SJoel Dahlpermittable from
26409df0a9aSRobert Watson.Fn memstat_mtl_find .
26570ee997eSRobert Watson.Ss Access Method List
26670ee997eSRobert WatsonThe following accessor methods are defined, of which some will be valid for
26770ee997eSRobert Watsona given memory type:
26833d6b9fbSRuslan Ermilov.Bl -tag -width indent
26933d6b9fbSRuslan Ermilov.It Fn memstat_get_name
27070ee997eSRobert WatsonReturn a pointer to the name of the memory type.
27170ee997eSRobert WatsonMemory for the name is owned by
27270ee997eSRobert Watson.Nm
27370ee997eSRobert Watsonand will be valid through a call to
27470ee997eSRobert Watson.Fn memstat_mtl_free .
27570ee997eSRobert WatsonNote that names will be unique with respect to a single allocator, but that
27670ee997eSRobert Watsonthe same name might be used by different memory types owned by different
27770ee997eSRobert Watsonmemory allocators.
27833d6b9fbSRuslan Ermilov.It Fn memstat_get_allocator
27970ee997eSRobert WatsonReturn an integer identifier for the memory allocator that owns the memory
28070ee997eSRobert Watsontype.
28133d6b9fbSRuslan Ermilov.It Fn memstat_get_countlimit
28270ee997eSRobert WatsonIf the memory type has an administrative limit on the number of simultaneous
28370ee997eSRobert Watsonallocations, return it.
28433d6b9fbSRuslan Ermilov.It Fn memstat_get_byteslimit
28570ee997eSRobert WatsonIf the memory type has an administrative limit on the number of bytes of
286799162a6SJoel Dahlmemory that may be simultaneously allocated for the memory type, return it.
28733d6b9fbSRuslan Ermilov.It Fn memstat_get_sizemask
28870ee997eSRobert WatsonIf the memory type supports variable allocation sizes, return a bitmask of
28970ee997eSRobert Watsonsizes allocated for the memory type.
29033d6b9fbSRuslan Ermilov.It Fn memstat_get_size
29170ee997eSRobert WatsonIf the memory type supports a fixed allocation size, return that size.
292*345e3f4dSGleb Smirnoff.It Fn memstat_get_rsize
293*345e3f4dSGleb SmirnoffIf the memory type supports a fixed allocation size, return real size
294*345e3f4dSGleb Smirnoffof an allocation.
295*345e3f4dSGleb SmirnoffReal size can exceed requested size due to alignment constraints or
296*345e3f4dSGleb Smirnoffimplicit padding.
29733d6b9fbSRuslan Ermilov.It Fn memstat_get_memalloced
29870ee997eSRobert WatsonReturn the total number of bytes allocated for the memory type over its
29970ee997eSRobert Watsonlifetime.
30033d6b9fbSRuslan Ermilov.It Fn memstat_get_memfreed
30170ee997eSRobert WatsonReturn the total number of bytes freed for the memory type over its lifetime.
30233d6b9fbSRuslan Ermilov.It Fn memstat_get_numallocs
30370ee997eSRobert WatsonReturn the total number of allocations for the memory type over its lifetime.
30433d6b9fbSRuslan Ermilov.It Fn memstat_get_numfrees
30570ee997eSRobert WatsonReturn the total number of frees for the memory type over its lifetime.
30633d6b9fbSRuslan Ermilov.It Fn memstat_get_bytes
30770ee997eSRobert WatsonReturn the current number of bytes allocated to the memory type.
30833d6b9fbSRuslan Ermilov.It Fn memstat_get_count
30970ee997eSRobert WatsonReturn the current number of allocations for the memory type.
31033d6b9fbSRuslan Ermilov.It Fn memstat_get_free
31170ee997eSRobert WatsonIf the memory allocator supports a cache, return the number of items in the
31270ee997eSRobert Watsoncache.
31333d6b9fbSRuslan Ermilov.It Fn memstat_get_failures
31470ee997eSRobert WatsonIf the memory allocator and type permit allocation failures, return the
31570ee997eSRobert Watsonnumber of allocation failures measured.
31633d6b9fbSRuslan Ermilov.It Fn memstat_get_caller_pointer
31770ee997eSRobert WatsonReturn a caller-owned pointer for the memory type.
31833d6b9fbSRuslan Ermilov.It Fn memstat_set_caller_pointer
31970ee997eSRobert WatsonSet a caller-owned pointer for the memory type.
32033d6b9fbSRuslan Ermilov.It Fn memstat_get_caller_uint64
32170ee997eSRobert WatsonReturn a caller-owned integer for the memory type.
32233d6b9fbSRuslan Ermilov.It Fn memstat_set_caller_uint64
32370ee997eSRobert WatsonSet a caller-owned integer for the memory type.
32433d6b9fbSRuslan Ermilov.It Fn memstat_get_zonefree
32570ee997eSRobert WatsonIf the memory allocator supports a multi-level allocation structure, return
32670ee997eSRobert Watsonthe number of cached items in the zone.
32770ee997eSRobert WatsonThese items will be in a fully constructed state available for immediate
32870ee997eSRobert Watsonuse.
32933d6b9fbSRuslan Ermilov.It Fn memstat_get_kegfree
33070ee997eSRobert WatsonIf the memory allocator supports a multi-level allocation structure, return
33170ee997eSRobert Watsonthe number of cached items in the keg.
33270ee997eSRobert WatsonThese items may be in a partially constructed state, and may require further
33370ee997eSRobert Watsonprocessing before they can be made available for use.
33433d6b9fbSRuslan Ermilov.It Fn memstat_get_percpu_memalloced
33570ee997eSRobert WatsonIf the memory allocator supports per-CPU statistics, return the number of
33670ee997eSRobert Watsonbytes of memory allocated for the memory type on the CPU over its lifetime.
33733d6b9fbSRuslan Ermilov.It Fn memstat_get_percpu_memfreed
33870ee997eSRobert WatsonIf the memory allocator supports per-CPU statistics, return the number of
33970ee997eSRobert Watsonbytes of memory freed from the memory type on the CPU over its lifetime.
34033d6b9fbSRuslan Ermilov.It Fn memstat_get_percpu_numallocs
34170ee997eSRobert WatsonIf the memory allocator supports per-CPU statistics, return the number of
34270ee997eSRobert Watsonallocations for the memory type on the CPU over its lifetime.
34333d6b9fbSRuslan Ermilov.It Fn memstat_get_percpu_numfrees
34470ee997eSRobert WatsonIf the memory allocator supports per-CPU statistics, return the number of
34570ee997eSRobert Watsonfrees for the memory type on the CPU over its lifetime.
34633d6b9fbSRuslan Ermilov.It Fn memstat_get_percpu_sizemask
34770ee997eSRobert WatsonIf the memory allocator supports variable size memory allocation and per-CPU
34870ee997eSRobert Watsonstatistics, return the size bitmask for the memory type on the CPU.
34933d6b9fbSRuslan Ermilov.It Fn memstat_get_percpu_caller_pointer
35070ee997eSRobert WatsonReturn a caller-owned per-CPU pointer for the memory type.
35133d6b9fbSRuslan Ermilov.It Fn memstat_set_percpu_caller_pointer
35270ee997eSRobert WatsonSet a caller-owned per-CPU pointer for the memory type.
35333d6b9fbSRuslan Ermilov.It Fn memstat_get_percpu_caller_uint64
35470ee997eSRobert WatsonReturn a caller-owned per-CPU integer for the memory type.
3553102cfe2SGlen Barber.It Fn memstat_set_percpu_caller_uint64
35670ee997eSRobert WatsonSet a caller-owned per-CPU integer for the memory type.
35733d6b9fbSRuslan Ermilov.It Fn memstat_get_percpu_free
35870ee997eSRobert WatsonIf the memory allocator supports a per-CPU cache, return the number of free
35970ee997eSRobert Watsonitems in the per-CPU cache of the designated CPU.
36070ee997eSRobert Watson.El
36170ee997eSRobert Watson.Sh RETURN VALUES
36270ee997eSRobert Watson.Nm
36370ee997eSRobert Watsonfunctions fall into three categories: functions returning a pointer to an
36470ee997eSRobert Watsonobject, functions returning an integer return value, and functions
36570ee997eSRobert Watsonimplementing accessor methods returning data from a
36633d6b9fbSRuslan Ermilov.Vt "struct memory_type" .
36770ee997eSRobert Watson.Pp
36870ee997eSRobert WatsonFunctions returning a pointer to an object will generally return
36970ee997eSRobert Watson.Dv NULL
37070ee997eSRobert Watsonon failure.
37170ee997eSRobert Watson.Fn memstat_mtl_alloc
37270ee997eSRobert Watsonwill return an error value via
37370ee997eSRobert Watson.Va errno ,
37470ee997eSRobert Watsonwhich will consist of the value
37533d6b9fbSRuslan Ermilov.Er ENOMEM .
37670ee997eSRobert WatsonFunctions
37770ee997eSRobert Watson.Fn memstat_mtl_first ,
37870ee997eSRobert Watson.Fn memstat_mtl_next ,
37970ee997eSRobert Watsonand
38070ee997eSRobert Watson.Fn memstat_mtl_find
38170ee997eSRobert Watsonwill return
38270ee997eSRobert Watson.Dv NULL
38370ee997eSRobert Watsonwhen there is no entry or match in the list; however, this is not considered
38470ee997eSRobert Watsona failure mode and no error value is available.
38570ee997eSRobert Watson.Pp
38633d6b9fbSRuslan ErmilovFunctions returning an integer success value will return
38733d6b9fbSRuslan Ermilov0
38870ee997eSRobert Watsonon success, or
38933d6b9fbSRuslan Ermilov\-1
39070ee997eSRobert Watsonon failure.
39170ee997eSRobert WatsonIf a failure is returned, the list error access method,
39270ee997eSRobert Watson.Fn memstat_mtl_geterror ,
393e754c6bbSRobert Watsonmay be used to retrieve the error state.
394e754c6bbSRobert WatsonThe string representation of the error may be retrieved using
395e754c6bbSRobert Watson.Fn memstat_strerror .
396e754c6bbSRobert WatsonPossible error values are:
39733d6b9fbSRuslan Ermilov.Bl -tag -width ".Dv MEMSTAT_ERROR_KVM_SHORTREAD"
39870ee997eSRobert Watson.It Dv MEMSTAT_ERROR_UNDEFINED
39933d6b9fbSRuslan ErmilovUndefined error.
40033d6b9fbSRuslan ErmilovOccurs if
40170ee997eSRobert Watson.Fn memstat_mtl_geterror
40270ee997eSRobert Watsonis called on a list before an error associated with the list has occurred.
40370ee997eSRobert Watson.It Dv MEMSTAT_ERROR_NOMEMORY
40433d6b9fbSRuslan ErmilovInsufficient memory.
40533d6b9fbSRuslan ErmilovOccurs if library calls to
40670ee997eSRobert Watson.Xr malloc 3
40770ee997eSRobert Watsonfail, or if a system call to retrieve kernel statistics fails with
40870ee997eSRobert Watson.Er ENOMEM .
40970ee997eSRobert Watson.It Dv MEMSTAT_ERROR_VERSION
41070ee997eSRobert WatsonReturned if the current version of
41170ee997eSRobert Watson.Nm
41270ee997eSRobert Watsonis unable to interpret the statistics data returned by the kernel due to an
41370ee997eSRobert Watsonexplicit version mismatch, or to differences in data structures that cannot
41470ee997eSRobert Watsonbe reconciled.
41570ee997eSRobert Watson.It Dv MEMSTAT_ERROR_PERMISSION
41670ee997eSRobert WatsonReturned if a statistics source returns
41770ee997eSRobert Watson.Va errno
41870ee997eSRobert Watsonvalues of
41933d6b9fbSRuslan Ermilov.Er EACCES
42070ee997eSRobert Watsonor
42133d6b9fbSRuslan Ermilov.Er EPERM .
42270ee997eSRobert Watson.It Dv MEMSTAT_ERROR_DATAERROR
42370ee997eSRobert WatsonReturned if
42470ee997eSRobert Watson.Nm
42570ee997eSRobert Watsonis unable to interpret statistics data returned by the data source, even
42670ee997eSRobert Watsonthough there does not appear to be a version problem.
427513c89ceSRobert Watson.It Dv MEMSTAT_ERROR_KVM
428513c89ceSRobert WatsonReturned if
429513c89ceSRobert Watson.Nm
430513c89ceSRobert Watsonexperiences an error while using
431513c89ceSRobert Watson.Xr kvm 3
432513c89ceSRobert Watsoninterfaces to query statistics data.
433513c89ceSRobert WatsonUse
434513c89ceSRobert Watson.Xr kvm_geterr 3
435513c89ceSRobert Watsonto retrieve the error.
436513c89ceSRobert Watson.It Dv MEMSTAT_ERROR_KVM_NOSYMBOL
437513c89ceSRobert WatsonReturned if
438513c89ceSRobert Watson.Nm
439513c89ceSRobert Watsonis unable to read a required symbol from the kernel being operated on.
440513c89ceSRobert Watson.It Dv MEMSTAT_ERROR_KVM_SHORTREAD
441513c89ceSRobert WatsonReturned if
442513c89ceSRobert Watson.Nm
443513c89ceSRobert Watsonattempts to read data from a live memory image or kernel core dump and
444513c89ceSRobert Watsoninsufficient data is returned.
44570ee997eSRobert Watson.El
44670ee997eSRobert Watson.Pp
44770ee997eSRobert WatsonFinally, functions returning data from a
44833d6b9fbSRuslan Ermilov.Vt "struct memory_type"
44970ee997eSRobert Watsonpointer are not permitted to fail, and directly return either a statistic
45070ee997eSRobert Watsonor pointer to a string.
4510cddce49SRobert Watson.Sh EXAMPLES
4520cddce49SRobert WatsonCreate a memory type list, query the
4530cddce49SRobert Watson.Xr uma 9
4540cddce49SRobert Watsonmemory allocator for available statistics, and print out the number of
4550cddce49SRobert Watsonallocations performed by the
45633f23dc2SRobert Watson.Dv mbuf
4570cddce49SRobert Watsonzone.
4580cddce49SRobert Watson.Bd -literal -offset indent
4590cddce49SRobert Watsonstruct memory_type_list *mtlp;
4600cddce49SRobert Watsonstruct memory_type *mtp;
4610cddce49SRobert Watsonuint64_t mbuf_count;
4620cddce49SRobert Watson
4630cddce49SRobert Watsonmtlp = memstat_mtl_alloc();
4640cddce49SRobert Watsonif (mtlp == NULL)
4650cddce49SRobert Watson    err(-1, "memstat_mtl_alloc");
4660cddce49SRobert Watsonif (memstat_sysctl_uma(mtlp, 0) < 0)
4670cddce49SRobert Watson    err(-1, "memstat_sysctl_uma");
46833f23dc2SRobert Watsonmtp = memstat_mtl_find(mtlp, ALLOCATOR_UMA, "mbuf");
4690cddce49SRobert Watsonif (mtp == NULL)
47033f23dc2SRobert Watson    errx(-1, "memstat_mtl_find: mbuf not found");
4710cddce49SRobert Watsonmbuf_count = memstat_get_count(mtp);
4720cddce49SRobert Watsonmemstat_mtl_free(mtlp);
4730cddce49SRobert Watson
47433d6b9fbSRuslan Ermilovprintf("mbufs: %llu\en", (unsigned long long)mbuf_count);
4750cddce49SRobert Watson.Ed
4760cddce49SRobert Watson.Sh SEE ALSO
4770cddce49SRobert Watson.Xr malloc 9 ,
4780cddce49SRobert Watson.Xr uma 9
4790cddce49SRobert Watson.Sh HISTORY
4800cddce49SRobert WatsonThe
48133d6b9fbSRuslan Ermilov.Nm
4820cddce49SRobert Watsonlibrary appeared in
4830cddce49SRobert Watson.Fx 6.0 .
4840cddce49SRobert Watson.Sh AUTHORS
4850cddce49SRobert WatsonThe kernel memory allocator changes necessary to support a general purpose
4860cddce49SRobert Watsonmonitoring library, along with the library, were written by
48733d6b9fbSRuslan Ermilov.An Robert Watson Aq rwatson@FreeBSD.org .
4880cddce49SRobert Watson.Sh BUGS
489ba23fa9bSRobert WatsonThere are memory allocators in the kernel, such as the VM page allocator
49033d6b9fbSRuslan Ermilovand
49133d6b9fbSRuslan Ermilov.Nm sf_buf
49233d6b9fbSRuslan Ermilovallocator, which are not currently supported by
49333d6b9fbSRuslan Ermilov.Nm .
4940cddce49SRobert Watson.Pp
4950cddce49SRobert WatsonOnce a memory type is present on a memory type list, it will not be removed
4960cddce49SRobert Watsoneven if the kernel no longer presents information on the type via its
4970cddce49SRobert Watsonmonitoring interfaces.
4980cddce49SRobert WatsonIn order to flush removed memory types, it is necessary to free the entire
4990cddce49SRobert Watsonlist and allocate a new one.
500