From dd961d1cef715b4c1e4fedd2f43fae6703f128ba Mon Sep 17 00:00:00 2001 From: Richard Braun Date: Tue, 8 Jan 2013 00:05:48 +0100 Subject: Add function to dump a raw summary of the slab allocator state The purpose of this function is to allow kernel code to display the state of the slab caches in situations where the host_slab_info RPC wouldn't be available, e.g. before a panic. * kern/slab.c (slab_info): New function. * kern/slab.h: Add declaration for slab_info. --- kern/slab.c | 29 +++++++++++++++++++++++++++++ kern/slab.h | 5 +++++ 2 files changed, 34 insertions(+) diff --git a/kern/slab.c b/kern/slab.c index 64f1fa8..2923f47 100644 --- a/kern/slab.c +++ b/kern/slab.c @@ -1490,6 +1490,35 @@ void kfree(vm_offset_t data, vm_size_t size) } } +void slab_info(void) +{ + struct kmem_cache *cache; + vm_size_t mem_usage, mem_reclaimable; + + printf("cache obj slab bufs objs bufs " + " total reclaimable\n" + "name size size /slab usage count " + " memory memory\n"); + + simple_lock(&kmem_cache_list_lock); + + list_for_each_entry(&kmem_cache_list, cache, node) { + simple_lock(&cache->lock); + + 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 %7luk %10luk\n", + cache->name, 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); + } + + simple_unlock(&kmem_cache_list_lock); +} + #if MACH_DEBUG kern_return_t host_slab_info(host_t host, cache_info_array_t *infop, unsigned int *infoCntp) diff --git a/kern/slab.h b/kern/slab.h index 6abe2dc..47bef21 100644 --- a/kern/slab.h +++ b/kern/slab.h @@ -246,4 +246,9 @@ void slab_init(void); */ void slab_collect(void); +/* + * Display a summary of all kernel caches. + */ +void slab_info(void); + #endif /* _KERN_SLAB_H */ -- cgit v1.2.3 From 64cd914cf46ce29d032a155bde3265ff5339cc61 Mon Sep 17 00:00:00 2001 From: Richard Braun Date: Tue, 8 Jan 2013 00:17:02 +0100 Subject: Fix slab cache list locking This problem was overlooked because of simple locks being no-ops. * kern/slab.c (slab_collect): Fix lock name to kmem_cache_list_lock. (host_slab_info): Likewise. --- kern/slab.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/kern/slab.c b/kern/slab.c index 2923f47..99d5bca 100644 --- a/kern/slab.c +++ b/kern/slab.c @@ -1317,12 +1317,12 @@ void slab_collect(void) kmem_gc_last_tick = elapsed_ticks; - simple_lock(&mem_cache_list_lock); + simple_lock(&kmem_cache_list_lock); list_for_each_entry(&kmem_cache_list, cache, node) kmem_cache_reap(cache); - simple_unlock(&mem_cache_list_lock); + simple_unlock(&kmem_cache_list_lock); } void slab_bootstrap(void) @@ -1536,9 +1536,9 @@ kern_return_t host_slab_info(host_t host, cache_info_array_t *infop, * Assume the cache list is unaltered once the kernel is ready. */ - simple_lock(&mem_cache_list_lock); + simple_lock(&kmem_cache_list_lock); nr_caches = kmem_nr_caches; - simple_unlock(&mem_cache_list_lock); + simple_unlock(&kmem_cache_list_lock); if (nr_caches <= *infoCntp) info = *infop; -- cgit v1.2.3