diff options
author | Rich Felker <dalias@aerifal.cx> | 2013-07-31 15:19:39 -0400 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2013-07-31 15:19:39 -0400 |
commit | 5db951ef80cae8b627f95b995811bf916c069757 (patch) | |
tree | a5835c1d42d0be770f6cf8b96b6221fc733d499a | |
parent | 27593d3a357073cfd24e6b09e207b8c742cd2dd7 (diff) | |
download | musl-5db951ef80cae8b627f95b995811bf916c069757.zip musl-5db951ef80cae8b627f95b995811bf916c069757.tar.gz musl-5db951ef80cae8b627f95b995811bf916c069757.tar.bz2 |
in pthread_getattr_np, use mremap rather than madvise to measure stack
the original motivation for this patch was that qemu (and possibly
other syscall emulators) nop out madvise, resulting in an infinite
loop. however, there is another benefit to this change: madvise may
actually undo an explicit madvise the application intended for its
stack, whereas the mremap operation is a true nop. the logic here is
that mremap must fail if it cannot resize the mapping in-place, and
the caller knows that it cannot resize in-place because it knows the
next page of virtual memory is already occupied.
-rw-r--r-- | src/thread/pthread_getattr_np.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/src/thread/pthread_getattr_np.c b/src/thread/pthread_getattr_np.c index 945242b..86df1de 100644 --- a/src/thread/pthread_getattr_np.c +++ b/src/thread/pthread_getattr_np.c @@ -1,3 +1,4 @@ +#define _GNU_SOURCE #include "pthread_impl.h" #include <sys/mman.h> @@ -13,7 +14,7 @@ int pthread_getattr_np(pthread_t t, pthread_attr_t *a) size_t l = PAGE_SIZE; p += -(uintptr_t)p & PAGE_SIZE-1; a->_a_stackaddr = (uintptr_t)p; - while (!posix_madvise(p-l-PAGE_SIZE, PAGE_SIZE, POSIX_MADV_NORMAL)) + while (mremap(p-l-PAGE_SIZE, PAGE_SIZE, 2*PAGE_SIZE, 0)==MAP_FAILED && errno==ENOMEM) l += PAGE_SIZE; a->_a_stacksize = l - DEFAULT_STACK_SIZE; } |