From: Julian Seward Date: Wed, 8 Sep 2010 08:30:31 +0000 (+0000) Subject: Don't scan the entire Valgrind stack to check for impending X-Git-Tag: svn/VALGRIND_3_6_0~114 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0dfc00b23f7df8df994545d067e722da46d9a110;p=thirdparty%2Fvalgrind.git Don't scan the entire Valgrind stack to check for impending stack-overflow situations. This causes an immense number of L2 misses which are completely pointless, and the recent increase of the Valgrind per-thread stack size from 64k to 1M greatly aggravates the situation. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@11343 --- diff --git a/coregrind/m_aspacemgr/aspacemgr-common.c b/coregrind/m_aspacemgr/aspacemgr-common.c index a1dbda9e9e..b7a51d6e4a 100644 --- a/coregrind/m_aspacemgr/aspacemgr-common.c +++ b/coregrind/m_aspacemgr/aspacemgr-common.c @@ -432,15 +432,18 @@ VgStack* VG_(am_alloc_VgStack)( /*OUT*/Addr* initial_sp ) /* Figure out how many bytes of the stack's active area have not been used. Used for estimating if we are close to overflowing it. */ -Int VG_(am_get_VgStack_unused_szB)( VgStack* stack ) +SizeT VG_(am_get_VgStack_unused_szB)( VgStack* stack, SizeT limit ) { - Int i; + SizeT i; UInt* p; p = (UInt*)&stack->bytes[VG_STACK_GUARD_SZB]; - for (i = 0; i < VG_STACK_ACTIVE_SZB/sizeof(UInt); i++) + for (i = 0; i < VG_STACK_ACTIVE_SZB/sizeof(UInt); i++) { if (p[i] != 0xDEADBEEF) break; + if (i * sizeof(UInt) >= limit) + break; + } return i * sizeof(UInt); } diff --git a/coregrind/m_scheduler/scheduler.c b/coregrind/m_scheduler/scheduler.c index 9723403167..f8f2950721 100644 --- a/coregrind/m_scheduler/scheduler.c +++ b/coregrind/m_scheduler/scheduler.c @@ -1753,9 +1753,11 @@ void VG_(sanity_check_general) ( Bool force_expensive ) stack = (VgStack*) VG_(get_ThreadState)(tid)->os_state.valgrind_stack_base; + SizeT limit + = 4096; // Let's say. Checking more causes lots of L2 misses. remains - = VG_(am_get_VgStack_unused_szB)(stack); - if (remains < VKI_PAGE_SIZE) + = VG_(am_get_VgStack_unused_szB)(stack, limit); + if (remains < limit) VG_(message)(Vg_DebugMsg, "WARNING: Thread %d is within %ld bytes " "of running out of stack!\n", diff --git a/coregrind/pub_core_aspacemgr.h b/coregrind/pub_core_aspacemgr.h index 2e623293db..484303e8fd 100644 --- a/coregrind/pub_core_aspacemgr.h +++ b/coregrind/pub_core_aspacemgr.h @@ -396,10 +396,10 @@ typedef extern VgStack* VG_(am_alloc_VgStack)( /*OUT*/Addr* initial_sp ); -/* Figure out how many bytes of the stack's active area have not - been used. Used for estimating if we are close to overflowing it. */ - -extern Int VG_(am_get_VgStack_unused_szB)( VgStack* stack ); +/* Figure out how many bytes of the stack's active area have not been + used. Used for estimating if we are close to overflowing it. If + the free area is larger than 'limit', just return 'limit'. */ +extern SizeT VG_(am_get_VgStack_unused_szB)( VgStack* stack, SizeT limit ); // DDD: this is ugly #if defined(VGO_darwin)