]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Don't scan the entire Valgrind stack to check for impending
authorJulian Seward <jseward@acm.org>
Wed, 8 Sep 2010 08:30:31 +0000 (08:30 +0000)
committerJulian Seward <jseward@acm.org>
Wed, 8 Sep 2010 08:30:31 +0000 (08:30 +0000)
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

coregrind/m_aspacemgr/aspacemgr-common.c
coregrind/m_scheduler/scheduler.c
coregrind/pub_core_aspacemgr.h

index a1dbda9e9e6e71415aa007cb1c06f1851fe5a9e4..b7a51d6e4ad234b75fa6ebb9969866a968bcab44 100644 (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);
 }
index 9723403167a2ae0b673d00997d8161d2cb4814f0..f8f2950721c908700e99e44803db489fb88d8e3d 100644 (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",
index 2e623293db33c9845407b1647e1127181cc02fd5..484303e8fdc2750507bfdd500b56d7af84ff7b54 100644 (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)