Changeset View
Changeset View
Standalone View
Standalone View
head/sys/vm/uma_core.c
Show First 20 Lines • Show All 284 Lines • ▼ Show 20 Lines | |||||
static bool cache_alloc(uma_zone_t, uma_cache_t, void *, int); | static bool cache_alloc(uma_zone_t, uma_cache_t, void *, int); | ||||
static bool cache_free(uma_zone_t, uma_cache_t, void *, void *, int); | static bool cache_free(uma_zone_t, uma_cache_t, void *, void *, int); | ||||
static int sysctl_vm_zone_count(SYSCTL_HANDLER_ARGS); | static int sysctl_vm_zone_count(SYSCTL_HANDLER_ARGS); | ||||
static int sysctl_vm_zone_stats(SYSCTL_HANDLER_ARGS); | static int sysctl_vm_zone_stats(SYSCTL_HANDLER_ARGS); | ||||
static int sysctl_handle_uma_zone_allocs(SYSCTL_HANDLER_ARGS); | static int sysctl_handle_uma_zone_allocs(SYSCTL_HANDLER_ARGS); | ||||
static int sysctl_handle_uma_zone_frees(SYSCTL_HANDLER_ARGS); | static int sysctl_handle_uma_zone_frees(SYSCTL_HANDLER_ARGS); | ||||
static int sysctl_handle_uma_zone_flags(SYSCTL_HANDLER_ARGS); | static int sysctl_handle_uma_zone_flags(SYSCTL_HANDLER_ARGS); | ||||
static int sysctl_handle_uma_slab_efficiency(SYSCTL_HANDLER_ARGS); | |||||
#ifdef INVARIANTS | #ifdef INVARIANTS | ||||
static inline struct noslabbits *slab_dbg_bits(uma_slab_t slab, uma_keg_t keg); | static inline struct noslabbits *slab_dbg_bits(uma_slab_t slab, uma_keg_t keg); | ||||
static bool uma_dbg_kskip(uma_keg_t keg, void *mem); | static bool uma_dbg_kskip(uma_keg_t keg, void *mem); | ||||
static bool uma_dbg_zskip(uma_zone_t zone, void *mem); | static bool uma_dbg_zskip(uma_zone_t zone, void *mem); | ||||
static void uma_dbg_free(uma_zone_t zone, uma_slab_t slab, void *item); | static void uma_dbg_free(uma_zone_t zone, uma_slab_t slab, void *item); | ||||
static void uma_dbg_alloc(uma_zone_t zone, uma_slab_t slab, void *item); | static void uma_dbg_alloc(uma_zone_t zone, uma_slab_t slab, void *item); | ||||
▲ Show 20 Lines • Show All 1,642 Lines • ▼ Show 20 Lines | SYSCTL_ADD_U32(NULL, SYSCTL_CHILDREN(oid), OID_AUTO, | ||||
"align", CTLFLAG_RD, &keg->uk_align, 0, | "align", CTLFLAG_RD, &keg->uk_align, 0, | ||||
"item alignment mask"); | "item alignment mask"); | ||||
SYSCTL_ADD_U32(NULL, SYSCTL_CHILDREN(oid), OID_AUTO, | SYSCTL_ADD_U32(NULL, SYSCTL_CHILDREN(oid), OID_AUTO, | ||||
"pages", CTLFLAG_RD, &keg->uk_pages, 0, | "pages", CTLFLAG_RD, &keg->uk_pages, 0, | ||||
"Total pages currently allocated from VM"); | "Total pages currently allocated from VM"); | ||||
SYSCTL_ADD_U32(NULL, SYSCTL_CHILDREN(oid), OID_AUTO, | SYSCTL_ADD_U32(NULL, SYSCTL_CHILDREN(oid), OID_AUTO, | ||||
"free", CTLFLAG_RD, &keg->uk_free, 0, | "free", CTLFLAG_RD, &keg->uk_free, 0, | ||||
"items free in the slab layer"); | "items free in the slab layer"); | ||||
SYSCTL_ADD_PROC(NULL, SYSCTL_CHILDREN(oid), OID_AUTO, | |||||
"efficiency", CTLFLAG_RD | CTLTYPE_INT | CTLFLAG_MPSAFE, | |||||
keg, 0, sysctl_handle_uma_slab_efficiency, "I", | |||||
"Slab utilization (100 - internal fragmentation %)"); | |||||
} else | } else | ||||
SYSCTL_ADD_CONST_STRING(NULL, SYSCTL_CHILDREN(oid), OID_AUTO, | SYSCTL_ADD_CONST_STRING(NULL, SYSCTL_CHILDREN(oid), OID_AUTO, | ||||
"name", CTLFLAG_RD, nokeg, "Keg name"); | "name", CTLFLAG_RD, nokeg, "Keg name"); | ||||
/* | /* | ||||
* Information about zone limits. | * Information about zone limits. | ||||
*/ | */ | ||||
oid = SYSCTL_ADD_NODE(NULL, SYSCTL_CHILDREN(zone->uz_oid), OID_AUTO, | oid = SYSCTL_ADD_NODE(NULL, SYSCTL_CHILDREN(zone->uz_oid), OID_AUTO, | ||||
▲ Show 20 Lines • Show All 2,474 Lines • ▼ Show 20 Lines | sysctl_handle_uma_zone_flags(SYSCTL_HANDLER_ARGS) | ||||
if (zone->uz_flags != 0) | if (zone->uz_flags != 0) | ||||
sbuf_printf(&sbuf, "0x%b", zone->uz_flags, PRINT_UMA_ZFLAGS); | sbuf_printf(&sbuf, "0x%b", zone->uz_flags, PRINT_UMA_ZFLAGS); | ||||
else | else | ||||
sbuf_printf(&sbuf, "0"); | sbuf_printf(&sbuf, "0"); | ||||
error = sbuf_finish(&sbuf); | error = sbuf_finish(&sbuf); | ||||
sbuf_delete(&sbuf); | sbuf_delete(&sbuf); | ||||
return (error); | return (error); | ||||
} | |||||
static int | |||||
sysctl_handle_uma_slab_efficiency(SYSCTL_HANDLER_ARGS) | |||||
{ | |||||
uma_keg_t keg = arg1; | |||||
int avail, effpct, total; | |||||
total = keg->uk_ppera * PAGE_SIZE; | |||||
if ((keg->uk_flags & UMA_ZONE_OFFPAGE) != 0) | |||||
total += slab_sizeof(SLAB_MAX_SETSIZE); | |||||
/* | |||||
* We consider the client's requested size and alignment here, not the | |||||
* real size determination uk_rsize, because we also adjust the real | |||||
* size for internal implementation reasons (max bitset size). | |||||
*/ | |||||
avail = keg->uk_ipers * roundup2(keg->uk_size, keg->uk_align + 1); | |||||
if ((keg->uk_flags & UMA_ZONE_PCPU) != 0) | |||||
avail *= mp_maxid + 1; | |||||
effpct = 100 * avail / total; | |||||
return (sysctl_handle_int(oidp, &effpct, 0, req)); | |||||
} | } | ||||
#ifdef INVARIANTS | #ifdef INVARIANTS | ||||
static uma_slab_t | static uma_slab_t | ||||
uma_dbg_getslab(uma_zone_t zone, void *item) | uma_dbg_getslab(uma_zone_t zone, void *item) | ||||
{ | { | ||||
uma_slab_t slab; | uma_slab_t slab; | ||||
uma_keg_t keg; | uma_keg_t keg; | ||||
▲ Show 20 Lines • Show All 243 Lines • Show Last 20 Lines |