From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1761559AbXGaX1f (ORCPT ); Tue, 31 Jul 2007 19:27:35 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1757934AbXGaXZW (ORCPT ); Tue, 31 Jul 2007 19:25:22 -0400 Received: from netops-testserver-3-out.sgi.com ([192.48.171.28]:46232 "EHLO relay.sgi.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1755089AbXGaXZN (ORCPT ); Tue, 31 Jul 2007 19:25:13 -0400 From: Christoph Lameter To: linux-kernel@vger.kernel.org Cc: Christoph Lameter Subject: [PATCH 7/7] Simple Performance Counters: SLUB instrumentation Date: Tue, 31 Jul 2007 16:25:12 -0700 Message-Id: <1185924312685-git-send-email-clameter@sgi.com> X-Mailer: git-send-email 1.5.2.4 In-Reply-To: simple-perf-counters References: simple-perf-counters Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org With this patch SLUB will perform tests on bootup and display results. Signed-off-by: Christoph Lameter --- mm/slub.c | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 92 insertions(+), 5 deletions(-) diff --git a/mm/slub.c b/mm/slub.c index 6c6d74f..568b16a 100644 --- a/mm/slub.c +++ b/mm/slub.c @@ -20,6 +20,7 @@ #include #include #include +#include /* * Lock order: @@ -152,6 +153,7 @@ static inline void ClearSlabDebug(struct page *page) /* Enable to test recovery from slab corruption on boot */ #undef SLUB_RESILIENCY_TEST +#undef SLUB_PERFORMANCE_TEST #if PAGE_SHIFT <= 12 @@ -2870,9 +2872,97 @@ static long validate_slab_cache(struct kmem_cache *s) return count; } -#ifdef SLUB_RESILIENCY_TEST static void resiliency_test(void) { +#ifdef SLUB_PERFORMANCE_TEST +#define TEST_COUNT 10000 + int size, i; + struct pc x; + void **v = kmalloc(TEST_COUNT * sizeof(void *), GFP_KERNEL); + + printk(KERN_INFO "SLUB Performance testing\n"); + printk(KERN_INFO "========================\n"); + printk(KERN_INFO "1. Kmalloc: Repeatedly allocate then free test\n"); + for (size = 8; size <= PAGE_SIZE << 2; size <<= 1) { + pc_start(&x); + for(i = 0; i < TEST_COUNT; i++) { + v[i] = kmalloc(size, GFP_KERNEL); + } + printk(KERN_INFO "%i times kmalloc(%d) = ", i, size); + pc_stop_printk(&x); + pc_start(&x); + for(i = 0; i < TEST_COUNT; i++) + kfree(v[i]); + printk(" kfree() = "); + pc_stop_printk(&x); + printk("\n"); + } + + printk(KERN_INFO "2. Kmalloc: alloc/free test\n"); + for (size = 8; size <= PAGE_SIZE << 2; size <<= 1) { + pc_start(&x); + for(i = 0; i < TEST_COUNT; i++) + kfree(kmalloc(size, GFP_KERNEL)); + printk(KERN_INFO "%i times kmalloc(%d)/kfree = ", i, size); + pc_stop_printk(&x); + printk("\n"); + } + printk(KERN_INFO "3. kmem_cache_alloc: Repeatedly allocate then free test\n"); + for (size = 3; size <= PAGE_SHIFT; size ++) { + pc_start(&x); + for(i = 0; i < TEST_COUNT; i++) { + v[i] = kmem_cache_alloc(kmalloc_caches + size, GFP_KERNEL); + } + printk(KERN_INFO "%d times kmem_cache_alloc(%d) = ", i, 1 << size); + pc_stop_printk(&x); + pc_start(&x); + for(i = 0; i < TEST_COUNT; i++) + kmem_cache_free(kmalloc_caches + size, v[i]); + printk(" kmem_cache_free() = "); + pc_stop_printk(&x); + printk("\n"); + } + + printk(KERN_INFO "4. kmem_cache_alloc: alloc/free test\n"); + for (size = 3; size <= PAGE_SHIFT; size++) { + pc_start(&x); + for(i = 0; i < TEST_COUNT; i++) + kmem_cache_free(kmalloc_caches + size, + kmem_cache_alloc(kmalloc_caches + size, + GFP_KERNEL)); + printk(KERN_INFO "%d times kmem_cache_alloc(%d)/kmem_cache_free = ", i, 1 << size); + pc_stop_printk(&x); + printk("\n"); + } + printk(KERN_INFO "5. kmem_cache_zalloc: Repeatedly allocate then free test\n"); + for (size = 3; size <= PAGE_SHIFT; size ++) { + pc_start(&x); + for(i = 0; i < TEST_COUNT; i++) { + v[i] = kmem_cache_zalloc(kmalloc_caches + size, GFP_KERNEL); + } + printk(KERN_INFO "%d times kmem_cache_zalloc(%d) = ", i, 1 << size); + pc_stop_printk(&x); + pc_start(&x); + for(i = 0; i < TEST_COUNT; i++) + kmem_cache_free(kmalloc_caches + size, v[i]); + printk(" kmem_cache_free() = "); + pc_stop_printk(&x); + printk("\n"); + } + + printk(KERN_INFO "6. kmem_cache_zalloc: alloc/free test\n"); + for (size = 3; size <= PAGE_SHIFT; size++) { + pc_start(&x); + for(i = 0; i < TEST_COUNT; i++) + kmem_cache_free(kmalloc_caches + size, + kmem_cache_zalloc(kmalloc_caches + size, + GFP_KERNEL)); + printk(KERN_INFO "%d times kmem_cache_zalloc(%d)/kmem_cache_free = ", i, 1 << size); + pc_stop_printk(&x); + printk("\n"); + } +#endif +#ifdef SLUB_RESILIENCY_TEST u8 *p; printk(KERN_ERR "SLUB resiliency testing\n"); @@ -2920,11 +3010,8 @@ static void resiliency_test(void) p[512] = 0xab; printk(KERN_ERR "\n3. kmalloc-512: Clobber redzone 0xab->0x%p\n\n", p); validate_slab_cache(kmalloc_caches + 9); -} -#else -static void resiliency_test(void) {}; #endif - +} /* * Generate lists of code addresses where slabcache objects are allocated * and freed. -- 1.5.2.4