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
This commit is contained in:
Julian Seward 2010-09-08 08:30:31 +00:00
parent 8504416a46
commit 0dfc00b23f
3 changed files with 14 additions and 9 deletions

View File

@ -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);
}

View File

@ -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",

View File

@ -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)