--- Gnu-Mach/kern/slab.c 2020/09/02 04:47:37 1.1.1.2 +++ Gnu-Mach/kern/slab.c 2020/09/02 04:49:56 1.1.1.3 @@ -79,6 +79,7 @@ #include #include #include +#include #include #include #include @@ -96,7 +97,6 @@ /* * Utility macros. */ -#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) #define P2ALIGNED(x, a) (((x) & ((a) - 1)) == 0) #define ISP2(x) P2ALIGNED(x, x) #define P2ALIGN(x, a) ((x) & -(a)) @@ -1433,15 +1433,18 @@ void kfree(vm_offset_t data, vm_size_t s } } -void slab_info(void) +static void _slab_info(int (printx)(const char *fmt, ...)) { struct kmem_cache *cache; - vm_size_t mem_usage, mem_reclaimable; + vm_size_t mem_usage, mem_reclaimable, mem_total, mem_total_reclaimable; + + mem_total = 0; + mem_total_reclaimable = 0; - printf("cache obj slab bufs objs bufs " - " total reclaimable\n" - "name size size /slab usage count " - " memory memory\n"); + printx("cache obj slab bufs objs bufs" + " total reclaimable\n" + "name flags size size /slab usage count" + " memory memory\n"); simple_lock(&kmem_cache_list_lock); @@ -1451,17 +1454,39 @@ void slab_info(void) mem_usage = (cache->nr_slabs * cache->slab_size) >> 10; mem_reclaimable = (cache->nr_free_slabs * cache->slab_size) >> 10; - printf("%-19s %6lu %3luk %4lu %6lu %6lu %7uk %10uk\n", - cache->name, cache->obj_size, cache->slab_size >> 10, + printx("%-20s %04x %7lu %3luk %4lu %6lu %6lu %7uk %10uk\n", + cache->name, cache->flags, cache->obj_size, + cache->slab_size >> 10, cache->bufs_per_slab, cache->nr_objs, cache->nr_bufs, mem_usage, mem_reclaimable); simple_unlock(&cache->lock); + + mem_total += mem_usage; + mem_total_reclaimable += mem_reclaimable; } simple_unlock(&kmem_cache_list_lock); + + printx("total: %uk, reclaimable: %uk\n", + mem_total, mem_total_reclaimable); +} + +void slab_info(void) +{ + _slab_info(printf); } +#if MACH_KDB +#include + + void db_show_slab_info(void) +{ + _slab_info(db_printf); +} + +#endif /* MACH_KDB */ + #if MACH_DEBUG kern_return_t host_slab_info(host_t host, cache_info_array_t *infop, unsigned int *infoCntp) @@ -1503,7 +1528,7 @@ kern_return_t host_slab_info(host_t host i = 0; list_for_each_entry(&kmem_cache_list, cache, node) { - simple_lock(&cache_lock); + simple_lock(&cache->lock); info[i].flags = ((cache->flags & KMEM_CF_NO_CPU_POOL) ? CACHE_FLAGS_NO_CPU_POOL : 0) | ((cache->flags & KMEM_CF_SLAB_EXTERNAL)